Repository: aries-rsa
Updated Branches:
  refs/heads/master a6945ded6 -> 09771c940


RSA does not export all interfaces

if a service should expose multiple interaces (e.g.
exported.interfaces=* and it implements multiple interfaces) the RSA
must register the service under all interfaces names, not just the first

Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo
Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/2331e82e
Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/2331e82e
Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/2331e82e

Branch: refs/heads/master
Commit: 2331e82ef2bce61798c0df26c13a1064d99eead7
Parents: a6945de
Author: Johannes Utzig <[email protected]>
Authored: Mon Jan 30 18:00:16 2017 +0100
Committer: Johannes Utzig <[email protected]>
Committed: Mon Jan 30 18:00:16 2017 +0100

----------------------------------------------------------------------
 .../aries/rsa/core/RemoteServiceAdminCore.java  |  8 +--
 .../rsa/core/RemoteServiceAdminCoreTest.java    | 54 ++++++++++++++++++++
 2 files changed, 58 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/2331e82e/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
----------------------------------------------------------------------
diff --git 
a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java 
b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
index b20e53b..5396a66 100644
--- a/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
+++ b/rsa/src/main/java/org/apache/aries/rsa/core/RemoteServiceAdminCore.java
@@ -378,7 +378,7 @@ public class RemoteServiceAdminCore implements 
RemoteServiceAdmin {
             LOG.info("Importing service {} with interfaces {} using handler 
{}.", 
                      endpoint.getId(), endpoint.getInterfaces(), 
provider.getClass());
 
-            ImportRegistrationImpl imReg = 
exposeServiceFactory(matchingInterfaces.get(0), endpoint, provider);
+            ImportRegistrationImpl imReg = 
exposeServiceFactory(matchingInterfaces.toArray(new 
String[matchingInterfaces.size()]), endpoint, provider);
             if (imRegs == null) {
                 imRegs = new ArrayList<ImportRegistrationImpl>();
                 importedServices.put(endpoint, imRegs);
@@ -406,7 +406,7 @@ public class RemoteServiceAdminCore implements 
RemoteServiceAdmin {
         return usableConfigurationTypes;
     }
 
-    protected ImportRegistrationImpl exposeServiceFactory(String interfaceName,
+    protected ImportRegistrationImpl exposeServiceFactory(String[] 
interfaceNames,
                                             EndpointDescription epd,
                                             DistributionProvider handler) {
         ImportRegistrationImpl imReg = new ImportRegistrationImpl(epd, this);
@@ -424,11 +424,11 @@ public class RemoteServiceAdminCore implements 
RemoteServiceAdmin {
              *  If the bundle publishing the factory does not import the 
service interface
              *  package then the factory is visible for all consumers which we 
want.
              */
-            ServiceRegistration<?> csfReg = 
apictx.registerService(interfaceName, csf, serviceProps);
+            ServiceRegistration<?> csfReg = 
apictx.registerService(interfaceNames, csf, serviceProps);
             imReg.setImportedServiceRegistration(csfReg);
         } catch (Exception ex) {
             // Only logging at debug level as this might be written to the log 
at the TopologyManager
-            LOG.debug("Can not proxy service with interface " + interfaceName 
+ ": " + ex.getMessage(), ex);
+            LOG.debug("Can not proxy service with interfaces " + 
Arrays.toString(interfaceNames) + ": " + ex.getMessage(), ex);
             imReg.setException(ex);
         }
         return imReg;

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/2331e82e/rsa/src/test/java/org/apache/aries/rsa/core/RemoteServiceAdminCoreTest.java
----------------------------------------------------------------------
diff --git 
a/rsa/src/test/java/org/apache/aries/rsa/core/RemoteServiceAdminCoreTest.java 
b/rsa/src/test/java/org/apache/aries/rsa/core/RemoteServiceAdminCoreTest.java
index 0669918..79c6c76 100644
--- 
a/rsa/src/test/java/org/apache/aries/rsa/core/RemoteServiceAdminCoreTest.java
+++ 
b/rsa/src/test/java/org/apache/aries/rsa/core/RemoteServiceAdminCoreTest.java
@@ -155,6 +155,60 @@ public class RemoteServiceAdminCoreTest {
         c.verify();
     }
 
+
+    @Test
+    public void testImportWithMultipleInterfaces() {
+        IMocksControl c = EasyMock.createNiceControl();
+        Bundle b = c.createMock(Bundle.class);
+        BundleContext bc = c.createMock(BundleContext.class);
+
+        Dictionary<String, String> d = new Hashtable<String, String>();
+        EasyMock.expect(b.getHeaders()).andReturn(d).anyTimes();
+
+        EasyMock.expect(bc.getBundle()).andReturn(b).anyTimes();
+
+        EasyMock.expect(bc.registerService(EasyMock.aryEq(new 
String[]{"es.schaaf.my.class","java.lang.Runnable"}), anyObject(), 
(Dictionary<String, ? >)anyObject())).andReturn(null);
+        
EasyMock.expect(b.getSymbolicName()).andReturn("BundleName").anyTimes();
+
+        DistributionProvider provider = 
c.createMock(DistributionProvider.class);
+        EasyMock.expect(provider.getSupportedTypes())
+            .andReturn(new String[]{MYCONFIG}).atLeastOnce();
+        c.replay();
+
+        RemoteServiceAdminCore rsaCore = new RemoteServiceAdminCore(bc, bc, 
provider);
+
+
+        Map<String, Object> p = new HashMap<String, Object>();
+        p.put(RemoteConstants.ENDPOINT_ID, "http://google.de";);
+        p.put(Constants.OBJECTCLASS, new String[] {
+            "es.schaaf.my.class",
+            "java.lang.Runnable"
+        });
+        p.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, MYCONFIG);
+        EndpointDescription endpoint = new EndpointDescription(p);
+
+        ImportRegistration ireg = rsaCore.importService(endpoint);
+
+        assertNotNull(ireg);
+
+        assertEquals(1, rsaCore.getImportedEndpoints().size());
+
+        // lets import the same endpoint once more -> should get a copy of the 
ImportRegistration
+        ImportRegistration ireg2 = rsaCore.importService(endpoint);
+        assertNotNull(ireg2);
+        assertEquals(2, rsaCore.getImportedEndpoints().size());
+
+        assertEquals(ireg.getImportReference(), 
(rsaCore.getImportedEndpoints().toArray())[0]);
+
+        assertEquals(ireg.getImportReference().getImportedEndpoint(), 
ireg2.getImportReference()
+            .getImportedEndpoint());
+
+        EndpointDescription importedEndpoint = 
ireg.getImportReference().getImportedEndpoint();
+        assertEquals(2,importedEndpoint.getInterfaces().size());
+
+        c.verify();
+    }
+
     private EndpointDescription creatEndpointDesc(String configType) {
         Map<String, Object> p = new HashMap<String, Object>();
         p.put(RemoteConstants.ENDPOINT_ID, "http://google.de";);

Reply via email to