This is an automated email from the ASF dual-hosted git repository.

amichair pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/aries-rsa.git

commit 60cf02978822adc64ff763f860eaeb9f3a7c44d3
Author: Amichai Rothman <[email protected]>
AuthorDate: Thu May 21 09:04:05 2026 +0300

    ARIES-2225 Fix FastBinProvider intents handling to comply with spec
---
 .../aries/rsa/provider/fastbin/Activator.java      |  2 +-
 .../rsa/provider/fastbin/FastBinProvider.java      | 65 +++++++++++-----------
 2 files changed, 33 insertions(+), 34 deletions(-)

diff --git 
a/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/Activator.java
 
b/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/Activator.java
index 17db549a..d1855340 100644
--- 
a/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/Activator.java
+++ 
b/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/Activator.java
@@ -67,7 +67,7 @@ public class Activator extends BaseActivator implements 
ManagedService {
         client = provider.getClient();
         server = provider.getServer();
         Dictionary<String, Object> props = new Hashtable<>();
-        props.put(RemoteConstants.REMOTE_INTENTS_SUPPORTED, new String[]{});
+        props.put(RemoteConstants.REMOTE_INTENTS_SUPPORTED, 
FastBinProvider.SUPPORTED_INTENTS);
         props.put(RemoteConstants.REMOTE_CONFIGS_SUPPORTED, 
provider.getSupportedTypes());
         register(DistributionProvider.class, provider, props);
     }
diff --git 
a/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/FastBinProvider.java
 
b/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/FastBinProvider.java
index 200a8e35..a707a894 100644
--- 
a/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/FastBinProvider.java
+++ 
b/provider/fastbin/src/main/java/org/apache/aries/rsa/provider/fastbin/FastBinProvider.java
@@ -22,7 +22,11 @@ import java.io.IOException;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Proxy;
 import java.net.URI;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
@@ -37,6 +41,7 @@ import org.apache.aries.rsa.spi.DistributionProvider;
 import org.apache.aries.rsa.spi.Endpoint;
 import org.apache.aries.rsa.spi.ImportedService;
 import org.apache.aries.rsa.spi.IntentUnsatisfiedException;
+import org.apache.aries.rsa.util.StringPlus;
 import org.fusesource.hawtdispatch.Dispatch;
 import org.fusesource.hawtdispatch.DispatchQueue;
 import org.osgi.framework.BundleContext;
@@ -50,6 +55,14 @@ public class FastBinProvider implements DistributionProvider 
{
 
     private static final Logger LOG = 
LoggerFactory.getLogger(FastBinProvider.class);
 
+    /**
+     * All intents supported by this provider.
+     * <p>
+     * We currently don't support any intents, but the TCK requires at least
+     * one to exist, so we add a placeholder default one that does nothing.
+     */
+    static final String[] SUPPORTED_INTENTS = { "aries.rsa.default" };
+
     public static final String FASTBIN_CONFIG_TYPE = "aries.fastbin";
 
     public static final String FASTBIN_ADDRESS = FASTBIN_CONFIG_TYPE + 
".address";
@@ -101,56 +114,42 @@ public class FastBinProvider implements 
DistributionProvider {
         return new String[] {FASTBIN_CONFIG_TYPE};
     }
 
+    @SafeVarargs
+    private static <T> Set<T> union(Collection<T>... collections) {
+        Set<T> union = new HashSet<>();
+        for (Collection<T> c : collections)
+            if (c != null)
+                union.addAll(c);
+        return union;
+    }
+
     @Override
     public Endpoint exportService(final Object serviceO,
                                   BundleContext serviceContext,
                                   Map<String, Object> effectiveProperties,
                                   Class[] exportedInterfaces) {
 
-        // Compute properties
-        /*
-        Map<String, Object> properties = new TreeMap<String, 
Object>(String.CASE_INSENSITIVE_ORDER);
-        for (String k : reference.getPropertyKeys()) {
-            properties.put(k, reference.getProperty(k));
-        }
-        // Bail out if there is any intents specified, we don't support any
-        Set<String> intents = 
Utils.normalize(properties.get(SERVICE_EXPORTED_INTENTS));
-        Set<String> extraIntents = 
Utils.normalize(properties.get(SERVICE_EXPORTED_INTENTS_EXTRA));
-        if (!intents.isEmpty() || !extraIntents.isEmpty()) {
-            throw new UnsupportedOperationException();
-        }
-        // Bail out if there are any configurations specified, we don't 
support any
-        Set<String> configs = 
Utils.normalize(properties.get(SERVICE_EXPORTED_CONFIGS));
-        if (configs.isEmpty()) {
-            configs.add(CONFIG);
-        } else if (!configs.contains(CONFIG)) {
-            throw new UnsupportedOperationException();
+        effectiveProperties.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, 
getSupportedTypes());
+        Set<String> intents = union(
+                
StringPlus.normalize(effectiveProperties.get(RemoteConstants.SERVICE_EXPORTED_INTENTS)),
+                
StringPlus.normalize(effectiveProperties.get(RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA)));
+        intents.removeAll(Arrays.asList(SUPPORTED_INTENTS));
+        if (!intents.isEmpty()) {
+            LOG.warn("Unsupported intents found: {}. Not exporting service", 
intents);
+            return null;
         }
 
-        URI connectUri = new URI(this.server.getConnectAddress());
-        String fabricAddress = connectUri.getScheme() + "://" + 
exportedAddress + ":" + connectUri.getPort();
-
-        properties.remove(SERVICE_EXPORTED_CONFIGS);
-        properties.put(SERVICE_IMPORTED_CONFIGS, new String[] { CONFIG });
-        properties.put(ENDPOINT_FRAMEWORK_UUID, this.uuid);
-        properties.put(FABRIC_ADDRESS, fabricAddress);
-
-        String uuid = UuidGenerator.getUUID();
-        properties.put(ENDPOINT_ID, uuid);
-        */
-
         String endpointId = UuidGenerator.getUUID();
         effectiveProperties.put(RemoteConstants.ENDPOINT_ID, endpointId);
 
         URI connectUri = URI.create(this.server.getConnectAddress());
         String fastbinAddress = connectUri.getScheme() + "://" + 
exportedAddress + ":" + connectUri.getPort();
         effectiveProperties.put(FASTBIN_ADDRESS, fastbinAddress);
-        effectiveProperties.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, 
getSupportedTypes());
+        effectiveProperties.put(RemoteConstants.SERVICE_INTENTS, 
Arrays.asList(SUPPORTED_INTENTS));
 
-        // Now, export the service
         final EndpointDescription description = new 
EndpointDescription(effectiveProperties);
 
-        // Export it
+        // export it
         server.registerService(description.getId(), new 
ServerInvoker.ServiceFactory() {
             public Object get() {
                 return serviceO;

Reply via email to