Repository: aries-rsa Updated Branches: refs/heads/master 19a9e0319 -> da63f3671
ARIES-1518 - RSA exports services that don't match the DistributionProvider adds a check if the service exports a config supported by the DistributionProviders Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/9af3f511 Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/9af3f511 Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/9af3f511 Branch: refs/heads/master Commit: 9af3f511f92a4fbb5e86fdf85d5c897e4c6873c9 Parents: 19a9e03 Author: Johannes Utzig <[email protected]> Authored: Wed Apr 6 15:05:03 2016 +0200 Committer: Johannes Utzig <[email protected]> Committed: Wed Apr 6 15:07:14 2016 +0200 ---------------------------------------------------------------------- .../aries/rsa/core/RemoteServiceAdminCore.java | 24 +++- .../rsa/core/RemoteServiceAdminCoreTest.java | 124 +++++++++++++++++-- 2 files changed, 140 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/9af3f511/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 60da887..d8f48da 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 @@ -104,7 +104,7 @@ public class RemoteServiceAdminCore implements RemoteServiceAdmin { List<String> interfaceNames = getInterfaceNames(serviceProperties); - if (isImportedService(serviceReference)) { + if (isImportedService(serviceReference) || !isExportConfigSupported(serviceProperties)) { return Collections.emptyList(); } @@ -124,6 +124,28 @@ public class RemoteServiceAdminCore implements RemoteServiceAdmin { } } + private boolean isExportConfigSupported(Map<String, Object> serviceProperties) + { + if (provider == null) { + return false; + } + List<String> exportedConfigs = StringPlus.normalize(serviceProperties.get(RemoteConstants.SERVICE_EXPORTED_CONFIGS)); + if (exportedConfigs == null || exportedConfigs.isEmpty()) { + return true; + } + String[] supportedTypes = provider.getSupportedTypes(); + if (supportedTypes == null || supportedTypes.length == 0) { + //if not set, all services should be accepted + return true; + } + for (String supportedType : supportedTypes) + { + if (exportedConfigs.contains(supportedType)) + return true; + } + return false; + } + private void store(Map<String, Object> key, List<ExportRegistration> exportRegs) { if (!exportRegs.isEmpty()) { // enlist initial export registrations in global list of exportRegistrations http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/9af3f511/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 8836b38..0669918 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 @@ -18,13 +18,8 @@ */ package org.apache.aries.rsa.core; -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.isA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; +import static org.easymock.EasyMock.*; +import static org.junit.Assert.*; import java.io.IOException; import java.lang.reflect.Field; @@ -280,6 +275,121 @@ public class RemoteServiceAdminCoreTest { assertEquals("No more exported services", 0, exportedServices.size()); } + @Test + public void testExportWrongConfig() throws Exception { + BundleContext bc = EasyMock.createMock(BundleContext.class); + EasyMock.expect(bc.getProperty(Constants.FRAMEWORK_VERSION)).andReturn(null).anyTimes(); + bc.addServiceListener(EasyMock.<ServiceListener>anyObject(), EasyMock.<String>anyObject()); + EasyMock.expectLastCall().anyTimes(); + bc.removeServiceListener(EasyMock.<ServiceListener>anyObject()); + EasyMock.expectLastCall().anyTimes(); + EasyMock.expect(bc.getServiceReferences(EasyMock.<String>anyObject(), + EasyMock.<String>anyObject())).andReturn(null).anyTimes(); + EasyMock.expect(bc.getAllServiceReferences(EasyMock.<String>anyObject(), + EasyMock.<String>anyObject())).andReturn(null).anyTimes(); + + Bundle b = createDummyRsaBundle(bc); + + final Map<String, Object> sProps = new HashMap<String, Object>(); + sProps.put("objectClass", new String[] {"java.lang.Runnable"}); + sProps.put("service.id", 51L); + sProps.put("myProp", "myVal"); + sProps.put("service.exported.interfaces", "*"); + ServiceReference sref = mockServiceReference(sProps); + + Runnable svcObject = EasyMock.createNiceMock(Runnable.class); + EasyMock.replay(svcObject); + + EasyMock.expect((Runnable)bc.getService(sref)).andReturn(svcObject).anyTimes(); + EasyMock.expect(bc.getBundle()).andReturn(b).anyTimes(); + EasyMock.expect(bc.createFilter("(service.id=51)")) + .andReturn(FrameworkUtil.createFilter("(service.id=51)")).anyTimes(); + EasyMock.expect(bc.getProperty(org.osgi.framework.Constants.FRAMEWORK_UUID)).andReturn("1111"); + EasyMock.expect(bc.getServiceReference(PackageAdmin.class)).andReturn(null); + EasyMock.replay(bc); + + Map<String, Object> eProps = new HashMap<String, Object>(sProps); + eProps.put("endpoint.id", "http://something"); + eProps.put("service.imported.configs", new String[] {"org.apache.cxf.ws"}); + + DistributionProvider handler = EasyMock.createStrictMock(DistributionProvider.class); + EasyMock.expect(handler.getSupportedTypes()).andReturn(new String[]{"something"}); + //export service should never be called since the exported confgi does not match + EasyMock.replay(handler); + + RemoteServiceAdminCore rsaCore = new RemoteServiceAdminCore(bc, bc, handler); + Map<String, String> extraProperties = new HashMap<>(); + extraProperties.put(RemoteConstants.SERVICE_EXPORTED_CONFIGS, "org.apache.cxf.ws"); + // Export the service for the first time + List<ExportRegistration> ereg = rsaCore.exportService(sref, extraProperties); + assertEquals(0, ereg.size()); + } + + @Test + public void testExportOneConfigSupported() throws Exception { + BundleContext bc = EasyMock.createMock(BundleContext.class); + EasyMock.expect(bc.getProperty(Constants.FRAMEWORK_VERSION)).andReturn(null).anyTimes(); + bc.addServiceListener(EasyMock.<ServiceListener>anyObject(), EasyMock.<String>anyObject()); + EasyMock.expectLastCall().anyTimes(); + bc.removeServiceListener(EasyMock.<ServiceListener>anyObject()); + EasyMock.expectLastCall().anyTimes(); + EasyMock.expect(bc.getServiceReferences(EasyMock.<String>anyObject(), + EasyMock.<String>anyObject())).andReturn(null).anyTimes(); + EasyMock.expect(bc.getAllServiceReferences(EasyMock.<String>anyObject(), + EasyMock.<String>anyObject())).andReturn(null).anyTimes(); + + Bundle b = createDummyRsaBundle(bc); + + final Map<String, Object> sProps = new HashMap<String, Object>(); + sProps.put("objectClass", new String[] {"java.lang.Runnable"}); + sProps.put("service.id", 51L); + sProps.put("myProp", "myVal"); + sProps.put("service.exported.interfaces", "*"); + ServiceReference sref = mockServiceReference(sProps); + + Runnable svcObject = EasyMock.createNiceMock(Runnable.class); + EasyMock.replay(svcObject); + + EasyMock.expect((Runnable)bc.getService(sref)).andReturn(svcObject).anyTimes(); + EasyMock.expect(bc.getBundle()).andReturn(b).anyTimes(); + EasyMock.expect(bc.createFilter("(service.id=51)")) + .andReturn(FrameworkUtil.createFilter("(service.id=51)")).anyTimes(); + EasyMock.expect(bc.getProperty(org.osgi.framework.Constants.FRAMEWORK_UUID)).andReturn("1111"); + EasyMock.expect(bc.getServiceReference(PackageAdmin.class)).andReturn(null); + EasyMock.replay(bc); + + Map<String, Object> eProps = new HashMap<String, Object>(sProps); + eProps.put("endpoint.id", "http://something"); + eProps.put("service.imported.configs", new String[] {"org.apache.cxf.ws","aconfig"}); + final EndpointDescription epd = new EndpointDescription(eProps); + Endpoint er = new Endpoint() { + + @Override + public void close() throws IOException { + } + + @Override + public EndpointDescription description() { + return epd; + } + }; + + DistributionProvider handler = EasyMock.createStrictMock(DistributionProvider.class); + EasyMock.expect(handler.getSupportedTypes()).andReturn(new String[]{"something","aconfig"}); + EasyMock.expect(handler.exportService(anyObject(), + anyObject(BundleContext.class), + anyObject(Map.class), isA(Class[].class))).andReturn(er); + //export service should never be called since the exported confgi does not match + EasyMock.replay(handler); + + RemoteServiceAdminCore rsaCore = new RemoteServiceAdminCore(bc, bc, handler); + Map<String, Object> extraProperties = new HashMap<>(); + extraProperties.put(RemoteConstants.SERVICE_EXPORTED_CONFIGS, new String[]{"org.apache.cxf.ws","aconfig"}); + // Export the service for the first time + List<ExportRegistration> ereg = rsaCore.exportService(sref, extraProperties); + assertEquals(1, ereg.size()); + } + private Bundle createDummyRsaBundle(BundleContext bc) { Bundle b = EasyMock.createNiceMock(Bundle.class); EasyMock.expect(b.getBundleContext()).andReturn(bc).anyTimes();
