Switch project setup to Aries
Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/d73a3a7f Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/d73a3a7f Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/d73a3a7f Branch: refs/heads/master Commit: d73a3a7f06dda3ceeae11910488a11bf84b52975 Parents: 9ed37be Author: Christian Schneider <[email protected]> Authored: Fri Mar 11 17:33:34 2016 +0100 Committer: Christian Schneider <[email protected]> Committed: Fri Mar 11 17:33:34 2016 +0100 ---------------------------------------------------------------------- cxf-dosgi-ri-repository/pom.xml | 85 --- discovery/distributed/cxf-discovery/pom.xml | 120 ---- .../dosgi/discovery/zookeeper/Activator.java | 43 -- .../discovery/zookeeper/ZooKeeperDiscovery.java | 164 ------ .../zookeeper/publish/DiscoveryPlugin.java | 54 -- .../publish/PublishingEndpointListener.java | 216 ------- .../PublishingEndpointListenerFactory.java | 105 ---- .../subscribe/EndpointListenerTracker.java | 56 -- .../zookeeper/subscribe/InterfaceMonitor.java | 262 --------- .../subscribe/InterfaceMonitorManager.java | 218 ------- .../dosgi/discovery/zookeeper/util/Utils.java | 165 ------ .../zookeeper/DiscoveryDriverTest.java | 135 ----- .../FindInZooKeeperCustomizerTest.java | 301 ---------- .../InterfaceDataMonitorListenerImplTest.java | 183 ------ .../PublishingEndpointListenerFactoryTest.java | 100 ---- .../publish/PublishingEndpointListenerTest.java | 201 ------- .../subscribe/InterfaceMonitorManagerTest.java | 139 ----- .../subscribe/InterfaceMonitorTest.java | 67 --- .../discovery/zookeeper/util/UtilsTest.java | 110 ---- discovery/distributed/pom.xml | 42 -- .../distributed/zookeeper-server-config/pom.xml | 78 --- .../zookeeper/server/config/Activator.java | 110 ---- discovery/distributed/zookeeper-server/pom.xml | 114 ---- .../discovery/zookeeper/server/Activator.java | 44 -- .../dosgi/discovery/zookeeper/server/Utils.java | 108 ---- .../zookeeper/server/ZookeeperStarter.java | 164 ------ .../resources/OSGI-INF/metatype/zookeeper.xml | 34 -- .../zookeeper/server/ZookeeperStarterTest.java | 81 --- discovery/local/bnd.bnd | 1 + discovery/local/pom.xml | 50 +- discovery/pom.xml | 19 +- discovery/zookeeper-server-config/bnd.bnd | 1 + discovery/zookeeper-server-config/pom.xml | 40 ++ .../zookeeper/server/config/Activator.java | 110 ++++ discovery/zookeeper-server/bnd.bnd | 1 + discovery/zookeeper-server/pom.xml | 84 +++ .../discovery/zookeeper/server/Activator.java | 44 ++ .../dosgi/discovery/zookeeper/server/Utils.java | 108 ++++ .../zookeeper/server/ZookeeperStarter.java | 164 ++++++ .../resources/OSGI-INF/metatype/zookeeper.xml | 34 ++ .../zookeeper/server/ZookeeperStarterTest.java | 81 +++ discovery/zookeeper/bnd.bnd | 1 + discovery/zookeeper/pom.xml | 77 +++ .../dosgi/discovery/zookeeper/Activator.java | 43 ++ .../discovery/zookeeper/ZooKeeperDiscovery.java | 164 ++++++ .../zookeeper/publish/DiscoveryPlugin.java | 54 ++ .../publish/PublishingEndpointListener.java | 216 +++++++ .../PublishingEndpointListenerFactory.java | 105 ++++ .../subscribe/EndpointListenerTracker.java | 56 ++ .../zookeeper/subscribe/InterfaceMonitor.java | 262 +++++++++ .../subscribe/InterfaceMonitorManager.java | 218 +++++++ .../dosgi/discovery/zookeeper/util/Utils.java | 165 ++++++ .../zookeeper/DiscoveryDriverTest.java | 135 +++++ .../FindInZooKeeperCustomizerTest.java | 301 ++++++++++ .../InterfaceDataMonitorListenerImplTest.java | 183 ++++++ .../PublishingEndpointListenerFactoryTest.java | 100 ++++ .../publish/PublishingEndpointListenerTest.java | 201 +++++++ .../subscribe/InterfaceMonitorManagerTest.java | 139 +++++ .../subscribe/InterfaceMonitorTest.java | 67 +++ .../discovery/zookeeper/util/UtilsTest.java | 110 ++++ distribution/features/pom.xml | 90 --- .../features/src/main/resources/features.xml | 59 -- distribution/multi-bundle/pom.xml | 124 ---- .../main/appended-resources/META-INF/LICENSE.vm | 39 -- .../src/main/appended-resources/META-INF/NOTICE | 42 -- .../multi-bundle/src/main/assembly/assembly.xml | 54 -- .../multi-bundle/src/main/release/README | 63 -- .../src/main/release/release_notes.txt | 295 ---------- .../src/main/xsl/equinox_distro_config.xslt | 17 - .../src/main/xsl/felix_distro_config.xslt | 75 --- .../src/main/xsl/filter_features.xslt | 18 - distribution/pom.xml | 45 -- distribution/sources/pom.xml | 66 --- distribution/sources/src/main/assembly/src.xml | 68 --- distribution/sources/src/main/release/LICENSE | 262 --------- distribution/sources/src/main/release/NOTICE | 9 - distribution/sources/src/main/release/README | 57 -- .../sources/src/main/release/release_notes.txt | 295 ---------- distribution/subsystem/pom.xml | 393 ------------- .../src/main/assembly/subsystem-assembly.xml | 46 -- .../src/main/resources/OSGI-INF/SUBSYSTEM.MF | 51 -- dsw/cxf-dosgi-provider-api/pom.xml | 67 --- .../cxf/dosgi/dsw/api/DistributionProvider.java | 56 -- .../org/apache/cxf/dosgi/dsw/api/Endpoint.java | 27 - .../cxf/dosgi/dsw/api/EndpointHelper.java | 41 -- .../apache/cxf/dosgi/dsw/api/ExportPolicy.java | 46 -- .../dsw/api/IntentUnsatisfiedException.java | 35 -- dsw/cxf-dosgi-rsa/pom.xml | 73 --- .../apache/cxf/dosgi/dsw/service/Activator.java | 37 -- .../dosgi/dsw/service/ClientServiceFactory.java | 110 ---- .../service/DistributionProviderTracker.java | 73 --- .../cxf/dosgi/dsw/service/EventAdminHelper.java | 151 ----- .../cxf/dosgi/dsw/service/EventProducer.java | 114 ---- .../dosgi/dsw/service/ExportReferenceImpl.java | 77 --- .../dsw/service/ExportRegistrationImpl.java | 152 ----- .../dsw/service/ImportRegistrationImpl.java | 230 -------- .../cxf/dosgi/dsw/service/PackageUtil.java | 85 --- .../dsw/service/RemoteServiceAdminCore.java | 587 ------------------- .../dsw/service/RemoteServiceAdminInstance.java | 99 ---- .../dsw/service/RemoteServiceadminFactory.java | 51 -- .../cxf/dosgi/dsw/service/StringPlus.java | 72 --- .../dsw/service/ClientServiceFactoryTest.java | 92 --- .../DistributionProviderTrackerTest.java | 82 --- .../dosgi/dsw/service/EventProducerTest.java | 189 ------ .../dsw/service/ImportRegistrationImplTest.java | 178 ------ .../dsw/service/RemoteServiceAdminCoreTest.java | 517 ---------------- .../cxf/dosgi/dsw/service/StringPlusTest.java | 63 -- dsw/cxf-dosgi-tcp/pom.xml | 72 --- .../aries/rsa/provider/tcp/Activator.java | 45 -- .../provider/tcp/LoaderObjectInputStream.java | 43 -- .../aries/rsa/provider/tcp/LocalHostUtil.java | 92 --- .../aries/rsa/provider/tcp/TCPProvider.java | 67 --- .../aries/rsa/provider/tcp/TCPServer.java | 118 ---- .../aries/rsa/provider/tcp/TcpEndpoint.java | 58 -- .../rsa/provider/tcp/TcpInvocationHandler.java | 68 --- .../aries/rsa/provider/tcp/TcpProviderTest.java | 107 ---- .../rsa/provider/tcp/myservice/MyService.java | 30 - .../provider/tcp/myservice/MyServiceImpl.java | 36 -- dsw/cxf-dsw/pom.xml | 155 ----- .../org/apache/cxf/dosgi/dsw/Activator.java | 160 ----- .../org/apache/cxf/dosgi/dsw/Constants.java | 146 ----- .../dosgi/dsw/decorator/DecorationParser.java | 85 --- .../cxf/dosgi/dsw/decorator/InterfaceRule.java | 96 --- .../apache/cxf/dosgi/dsw/decorator/Rule.java | 41 -- .../dosgi/dsw/decorator/ServiceDecorator.java | 28 - .../ServiceDecoratorBundleListener.java | 48 -- .../dsw/decorator/ServiceDecoratorImpl.java | 97 --- .../AbstractPojoConfigurationTypeHandler.java | 243 -------- .../dsw/handlers/CXFDistributionProvider.java | 178 ------ .../cxf/dosgi/dsw/handlers/ClassUtils.java | 142 ----- .../dosgi/dsw/handlers/HttpServiceManager.java | 176 ------ .../JaxRSPojoConfigurationTypeHandler.java | 201 ------- .../cxf/dosgi/dsw/handlers/JaxRSUtils.java | 121 ---- .../cxf/dosgi/dsw/handlers/LocalHostUtil.java | 92 --- .../handlers/PojoConfigurationTypeHandler.java | 172 ------ .../handlers/SecurityDelegatingHttpContext.java | 133 ----- .../cxf/dosgi/dsw/handlers/ServerWrapper.java | 49 -- .../dsw/handlers/ServiceInvocationHandler.java | 100 ---- .../handlers/WsdlConfigurationTypeHandler.java | 160 ----- .../dosgi/dsw/qos/DefaultIntentMapFactory.java | 52 -- .../apache/cxf/dosgi/dsw/qos/IntentManager.java | 31 - .../cxf/dosgi/dsw/qos/IntentManagerImpl.java | 155 ----- .../org/apache/cxf/dosgi/dsw/qos/IntentMap.java | 62 -- .../apache/cxf/dosgi/dsw/qos/IntentTracker.java | 62 -- .../apache/cxf/dosgi/dsw/qos/IntentUtils.java | 86 --- .../apache/cxf/dosgi/dsw/util/OsgiUtils.java | 132 ----- .../apache/cxf/dosgi/dsw/util/StringPlus.java | 72 --- .../src/main/resources/service-decoration.xsd | 67 --- .../org/apache/cxf/dosgi/dsw/ActivatorTest.java | 66 --- .../org/apache/cxf/dosgi/dsw/TestUtils.java | 37 -- .../dsw/decorator/DecorationParserTest.java | 63 -- .../dosgi/dsw/decorator/InterfaceRuleTest.java | 163 ----- .../ServiceDecoratorBundleListenerTest.java | 69 --- .../dsw/decorator/ServiceDecoratorImplTest.java | 187 ------ .../handlers/CXFDistributionProviderTest.java | 104 ---- .../cxf/dosgi/dsw/handlers/ClassUtilsTest.java | 134 ----- .../dsw/handlers/HttpServiceManagerTest.java | 125 ---- .../cxf/dosgi/dsw/handlers/JaxRSUtilsTest.java | 195 ------ .../PojoConfigurationTypeHandlerTest.java | 422 ------------- .../SecurityDelegatingHttpContextTest.java | 267 --------- .../handlers/ServiceInvocationHandlerTest.java | 75 --- .../WsdlConfigurationTypeHandlerTest.java | 67 --- .../dsw/handlers/jaxws/MyJaxWsEchoService.java | 26 - .../handlers/jaxws/MyJaxWsEchoServiceImpl.java | 27 - .../handlers/simple/MySimpleEchoService.java | 23 - .../simple/MySimpleEchoServiceImpl.java | 27 - .../dsw/hooks/CxfFindListenerHookTest.java | 341 ----------- .../cxf/dosgi/dsw/hooks/CxfPublishHookTest.java | 299 ---------- .../dosgi/dsw/hooks/ServiceHookUtilsTest.java | 116 ---- .../apache/cxf/dosgi/dsw/hooks/TestService.java | 22 - .../dosgi/dsw/qos/IntentManagerImplTest.java | 278 --------- .../apache/cxf/dosgi/dsw/qos/IntentMapTest.java | 41 -- .../cxf/dosgi/dsw/qos/IntentTrackerTest.java | 80 --- .../cxf/dosgi/dsw/qos/IntentUtilsTest.java | 70 --- .../cxf/dosgi/dsw/util/OsgiUtilsTest.java | 152 ----- .../org/apache/cxf/dosgi/dsw/util/Provider.java | 23 - .../remote-service/alt-remote-services.xml | 32 - .../OSGI-INF/remote-service/multi-services.xml | 38 -- .../OSGI-INF/remote-service/remote-services.xml | 32 - .../src/test/resources/test-resources/rs1.xml | 31 - .../src/test/resources/test-resources/rs2.xml | 28 - .../src/test/resources/test-resources/sd-1.xml | 3 - .../src/test/resources/test-resources/sd.xml | 8 - .../src/test/resources/test-resources/sd0.xml | 2 - .../src/test/resources/test-resources/sd1.xml | 8 - .../src/test/resources/test-resources/sd2.xml | 14 - dsw/cxf-topology-manager/pom.xml | 111 ---- .../cxf/dosgi/topologymanager/Activator.java | 192 ------ .../exporter/DefaultExportPolicy.java | 37 -- .../exporter/EndpointListenerNotifier.java | 133 ----- .../exporter/EndpointRepository.java | 140 ----- .../topologymanager/exporter/StringPlus.java | 57 -- .../exporter/TopologyManagerExport.java | 195 ------ .../importer/EndpointListenerManager.java | 98 ---- .../topologymanager/importer/FilterHelper.java | 43 -- .../importer/ListenerHookImpl.java | 119 ---- .../topologymanager/importer/RSATracker.java | 26 - .../importer/ReferenceCounter.java | 76 --- .../importer/ServiceInterestListener.java | 26 - .../importer/TopologyManagerImport.java | 345 ----------- .../dosgi/topologymanager/ActivatorTest.java | 68 --- .../exporter/EndpointListenerNotifierTest.java | 160 ----- .../exporter/EndpointRepositoryTest.java | 82 --- .../exporter/TopologyManagerExportTest.java | 153 ----- .../importer/EndpointListenerImplTest.java | 111 ---- .../importer/ListenerHookImplTest.java | 89 --- .../importer/ReferenceCounterTest.java | 42 -- .../importer/TopologyManagerImportTest.java | 87 --- dsw/pom.xml | 46 -- features/pom.xml | 82 +++ features/src/main/resources/features.xml | 31 + felix/pom.xml | 42 -- felix/profiles/pom.xml | 201 ------- .../remote-service/alt-remote-services.xml | 32 - .../OSGI-INF/remote-service/multi-services.xml | 38 -- .../OSGI-INF/remote-service/remote-services.xml | 32 - felix/profiles/resources/test-resources/rs1.xml | 31 - felix/profiles/resources/test-resources/rs2.xml | 28 - .../profiles/resources/test-resources/sd-1.xml | 3 - felix/profiles/resources/test-resources/sd.xml | 8 - felix/profiles/resources/test-resources/sd0.xml | 2 - felix/profiles/resources/test-resources/sd1.xml | 8 - felix/profiles/resources/test-resources/sd2.xml | 14 - .../src/main/java/felix/EmptyClass.java | 22 - .../src/main/resources/client_bundles.txt | 82 --- .../src/main/resources/dosgi_bundles.txt | 78 --- .../src/main/resources/server_bundles.txt | 82 --- felix/remote-debug.txt | 1 - felix/shell.tui/LICENSE | 202 ------- felix/shell.tui/NOTICE | 20 - felix/shell.tui/pom.xml | 92 --- .../org/apache/felix/shell/tui/Activator.java | 187 ------ osgi-api/pom.xml | 70 --- parent/pom.xml | 336 +++-------- pom.xml | 118 ++-- provider/pom.xml | 43 ++ provider/tcp/bnd.bnd | 1 + provider/tcp/pom.xml | 28 + .../aries/rsa/provider/tcp/Activator.java | 45 ++ .../provider/tcp/LoaderObjectInputStream.java | 43 ++ .../aries/rsa/provider/tcp/LocalHostUtil.java | 92 +++ .../aries/rsa/provider/tcp/TCPProvider.java | 67 +++ .../aries/rsa/provider/tcp/TCPServer.java | 118 ++++ .../aries/rsa/provider/tcp/TcpEndpoint.java | 58 ++ .../rsa/provider/tcp/TcpInvocationHandler.java | 68 +++ .../aries/rsa/provider/tcp/TcpProviderTest.java | 107 ++++ .../rsa/provider/tcp/myservice/MyService.java | 30 + .../provider/tcp/myservice/MyServiceImpl.java | 36 ++ repository/pom.xml | 83 +++ rsa-api/bnd.bnd | 6 + rsa-api/pom.xml | 40 ++ rsa/bnd.bnd | 5 + rsa/pom.xml | 27 + .../apache/cxf/dosgi/dsw/service/Activator.java | 37 ++ .../dosgi/dsw/service/ClientServiceFactory.java | 110 ++++ .../service/DistributionProviderTracker.java | 73 +++ .../cxf/dosgi/dsw/service/EventAdminHelper.java | 151 +++++ .../cxf/dosgi/dsw/service/EventProducer.java | 114 ++++ .../dosgi/dsw/service/ExportReferenceImpl.java | 77 +++ .../dsw/service/ExportRegistrationImpl.java | 152 +++++ .../dsw/service/ImportRegistrationImpl.java | 230 ++++++++ .../cxf/dosgi/dsw/service/PackageUtil.java | 85 +++ .../dsw/service/RemoteServiceAdminCore.java | 587 +++++++++++++++++++ .../dsw/service/RemoteServiceAdminInstance.java | 99 ++++ .../dsw/service/RemoteServiceadminFactory.java | 51 ++ .../cxf/dosgi/dsw/service/StringPlus.java | 72 +++ .../dsw/service/ClientServiceFactoryTest.java | 92 +++ .../DistributionProviderTrackerTest.java | 82 +++ .../dosgi/dsw/service/EventProducerTest.java | 189 ++++++ .../dsw/service/ImportRegistrationImplTest.java | 178 ++++++ .../dsw/service/RemoteServiceAdminCoreTest.java | 517 ++++++++++++++++ .../cxf/dosgi/dsw/service/StringPlusTest.java | 63 ++ samples/discovery/client/pom.xml | 66 --- .../samples/discovery/consumer/Activator.java | 86 --- samples/discovery/impl/pom.xml | 61 -- .../dosgi/samples/discovery/impl/Activator.java | 71 --- .../discovery/impl/DisplayServiceImpl.java | 40 -- samples/discovery/interface/pom.xml | 52 -- .../dosgi/samples/discovery/DisplayService.java | 24 - samples/discovery/pom.xml | 42 -- samples/ds/client/pom.xml | 63 -- .../dosgi/samples/ds/consumer/Activator.java | 45 -- .../samples/ds/consumer/AdderConsumer.java | 39 -- .../src/main/resources/OSGI-INF/component.xml | 20 - .../OSGI-INF/remote-service/remote-services.xml | 26 - samples/ds/impl/pom.xml | 60 -- .../dosgi/samples/ds/impl/AdderServiceImpl.java | 30 - .../src/main/resources/OSGI-INF/component.xml | 26 - samples/ds/interface/pom.xml | 52 -- .../cxf/dosgi/samples/ds/AdderService.java | 23 - samples/ds/pom.xml | 41 -- samples/greeter/client/pom.xml | 77 --- .../dosgi/samples/greeter/client/Activator.java | 106 ---- .../samples/greeter/client/GreeterDataImpl.java | 46 -- .../samples/greeter/client/GreeterDialog.java | 208 ------- .../OSGI-INF/cxf/intents/intent-map.xml | 75 --- .../OSGI-INF/remote-service/remote-services.xml | 27 - samples/greeter/impl/pom.xml | 76 --- .../dosgi/samples/greeter/impl/Activator.java | 47 -- .../greeter/impl/GreeterServiceImpl.java | 59 -- samples/greeter/interface/pom.xml | 72 --- .../cxf/dosgi/samples/greeter/GreeterData.java | 25 - .../dosgi/samples/greeter/GreeterException.java | 45 -- .../dosgi/samples/greeter/GreeterService.java | 27 - .../dosgi/samples/greeter/GreetingPhrase.java | 50 -- samples/greeter/pom.xml | 42 -- samples/greeter_rest/client/pom.xml | 76 --- .../samples/greeter/client/rest/Activator.java | 126 ---- .../OSGI-INF/remote-service/remote-services.xml | 31 - samples/greeter_rest/impl/pom.xml | 77 --- .../samples/greeter/impl/rest/Activator.java | 59 -- .../greeter/impl/rest/GreeterServiceImpl.java | 49 -- .../greeter/impl/rest/GreeterServiceImpl2.java | 33 -- samples/greeter_rest/impl2/pom.xml | 77 --- .../samples/greeter/impl2/rest/Activator.java | 53 -- .../greeter/impl2/rest/GreeterServiceImpl2.java | 49 -- samples/greeter_rest/interface/pom.xml | 81 --- .../samples/greeter/rest/GreeterException.java | 45 -- .../dosgi/samples/greeter/rest/GreeterInfo.java | 37 -- .../samples/greeter/rest/GreeterService.java | 31 - .../samples/greeter/rest/GreeterService2.java | 24 - .../samples/greeter/rest/GreetingPhrase.java | 64 -- .../cxf/jaxrs/GreeterService2-model.xml | 7 - samples/greeter_rest/pom.xml | 43 -- samples/pom.xml | 45 -- samples/security_filter/pom.xml | 73 --- .../cxf/dosgi/samples/security/Activator.java | 65 -- .../samples/security/SampleSecurityFilter.java | 61 -- .../samples/security/SecureRestEndpoint.java | 35 -- samples/spring_dm/client/pom.xml | 60 -- .../springdm/client/DinnerServiceConsumer.java | 38 -- .../resources/META-INF/spring/client-spring.xml | 31 - .../OSGI-INF/remote-service/remote-services.xml | 29 - samples/spring_dm/impl/pom.xml | 60 -- .../springdm/impl/DinnerServiceImpl.java | 39 -- .../main/resources/META-INF/spring/spring.xml | 32 - samples/spring_dm/interface/pom.xml | 52 -- .../dosgi/samples/springdm/DinnerService.java | 25 - .../cxf/dosgi/samples/springdm/Restaurant.java | 59 -- samples/spring_dm/pom.xml | 41 -- spi/pom.xml | 67 +++ .../cxf/dosgi/dsw/api/DistributionProvider.java | 56 ++ .../org/apache/cxf/dosgi/dsw/api/Endpoint.java | 27 + .../cxf/dosgi/dsw/api/EndpointHelper.java | 41 ++ .../apache/cxf/dosgi/dsw/api/ExportPolicy.java | 46 ++ .../dsw/api/IntentUnsatisfiedException.java | 35 ++ systests2/common/pom.xml | 108 ---- .../systests2/common/test1/GreeterDataImpl.java | 39 -- .../systests2/common/test1/MyActivator.java | 45 -- .../common/test1/MyServiceTracker.java | 76 --- .../common/test1/StartServiceTracker.java | 41 -- .../systests2/common/test2/Test2Service.java | 23 - .../common/test2/client/ClientActivator.java | 37 -- .../test2/client/Test2ServiceTracker.java | 70 --- .../common/test2/server/ServerActivator.java | 53 -- .../common/test2/server/Test2ServiceImpl.java | 36 -- .../common/src/main/resources/rs-test1.xml | 28 - systests2/multi-bundle/pom.xml | 243 -------- .../systests2/multi/AbstractDosgiTest.java | 176 ------ .../dosgi/systests2/multi/MultiBundleTools.java | 106 ---- .../dosgi/systests2/multi/TestCustomIntent.java | 109 ---- .../systests2/multi/TestDiscoveryExport.java | 109 ---- .../systests2/multi/TestExportRestService.java | 96 --- .../systests2/multi/TestExportService.java | 137 ----- .../systests2/multi/TestImportService.java | 161 ----- .../AddGreetingPhraseInterceptor.java | 44 -- .../multi/customintent/CustomFeature.java | 33 -- .../customintent/CustomIntentActivator.java | 37 -- .../service/EmptyGreeterService.java | 41 -- ...GreeterServiceWithCustomIntentActivator.java | 42 -- .../systests2/multi/rest/RestTranslate.java | 34 -- .../systests2/multi/rest/RestTranslateImpl.java | 41 -- .../multi/rest/TranslateActivator.java | 40 -- .../src/test/resources/log4j.properties | 13 - systests2/pom.xml | 42 -- topology-manager/bnd.bnd | 1 + topology-manager/pom.xml | 47 ++ .../cxf/dosgi/topologymanager/Activator.java | 192 ++++++ .../exporter/DefaultExportPolicy.java | 37 ++ .../exporter/EndpointListenerNotifier.java | 133 +++++ .../exporter/EndpointRepository.java | 140 +++++ .../topologymanager/exporter/StringPlus.java | 57 ++ .../exporter/TopologyManagerExport.java | 195 ++++++ .../importer/EndpointListenerManager.java | 98 ++++ .../topologymanager/importer/FilterHelper.java | 43 ++ .../importer/ListenerHookImpl.java | 119 ++++ .../topologymanager/importer/RSATracker.java | 26 + .../importer/ReferenceCounter.java | 76 +++ .../importer/ServiceInterestListener.java | 26 + .../importer/TopologyManagerImport.java | 345 +++++++++++ .../dosgi/topologymanager/ActivatorTest.java | 68 +++ .../exporter/EndpointListenerNotifierTest.java | 160 +++++ .../exporter/EndpointRepositoryTest.java | 82 +++ .../exporter/TopologyManagerExportTest.java | 153 +++++ .../importer/EndpointListenerImplTest.java | 111 ++++ .../importer/ListenerHookImplTest.java | 89 +++ .../importer/ReferenceCounterTest.java | 42 ++ .../importer/TopologyManagerImportTest.java | 87 +++ 398 files changed, 10003 insertions(+), 26424 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/cxf-dosgi-ri-repository/pom.xml ---------------------------------------------------------------------- diff --git a/cxf-dosgi-ri-repository/pom.xml b/cxf-dosgi-ri-repository/pom.xml deleted file mode 100644 index 7e12753..0000000 --- a/cxf-dosgi-ri-repository/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-parent</artifactId> - <version>1.8-SNAPSHOT</version> - <relativePath>../../parent/pom.xml</relativePath> - </parent> - <artifactId>cxf-dosgi-ri-repository</artifactId> - <packaging>pom</packaging> - <properties> - <bnd.version>3.1.0</bnd.version> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <local.index.policy>ALLOWED</local.index.policy> - </properties> - <profiles> - <profile> - <id>RunningInCI</id> - <activation> - <property> - <name>running.in.ci</name> - <value>true</value> - </property> - </activation> - <properties> - <local.url.policy>FORBIDDEN</local.url.policy> - </properties> - </profile> - <profile> - <id>apache-release</id> - <properties> - <local.url.policy>FORBIDDEN</local.url.policy> - </properties> - </profile> - </profiles> - <build> - <plugins> - <plugin> - <groupId>biz.aQute.bnd</groupId> - <artifactId>bnd-indexer-maven-plugin</artifactId> - <version>${bnd.version}</version> - <configuration> - <localURLs>${local.index.policy}</localURLs> - <includeTransitive>true</includeTransitive> - </configuration> - <executions> - <execution> - <id>index</id> - <goals> - <goal>index</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - <dependencies> - <dependency> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-rsa</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-tcp</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-discovery-distributed</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-discovery-distributed-zookeeper-server</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-discovery-distributed-zookeeper-server-config</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> -</project> http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/pom.xml ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/pom.xml b/discovery/distributed/cxf-discovery/pom.xml deleted file mode 100644 index b34a1db..0000000 --- a/discovery/distributed/cxf-discovery/pom.xml +++ /dev/null @@ -1,120 +0,0 @@ -<?xml version='1.0' encoding='UTF-8' ?> -<!-- - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - - <modelVersion>4.0.0</modelVersion> - <artifactId>cxf-dosgi-ri-discovery-distributed</artifactId> - <packaging>bundle</packaging> - <name>CXF DOSGi ZooKeeper-based Discovery Service Bundle</name> - <description>An implementation of the Distributed OSGi Discovery Service using ZooKeeper</description> - - <parent> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-parent</artifactId> - <version>1.8-SNAPSHOT</version> - <relativePath>../../../parent/pom.xml</relativePath> - </parent> - - <properties> - <topDirectoryLocation>../../..</topDirectoryLocation> - </properties> - - <dependencies> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.core</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.compendium</artifactId> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>org.apache.zookeeper</groupId> - <artifactId>zookeeper</artifactId> - <version>${zookeeper.version}</version> - <scope>provided</scope> - <exclusions> - <exclusion> - <groupId>com.sun.jdmk</groupId> - <artifactId>jmxtools</artifactId> - </exclusion> - <exclusion> - <groupId>com.sun.jmx</groupId> - <artifactId>jmxri</artifactId> - </exclusion> - <exclusion> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - </exclusion> - </exclusions> - </dependency> - - <!-- We need the newer log4j as the one from zookeeper has some ugly dependencies --> - <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - <version>${log4j.version}</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-discovery-local</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </dependency> - - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.easymock</groupId> - <artifactId>easymockclassextension</artifactId> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.felix</groupId> - <artifactId>maven-bundle-plugin</artifactId> - <configuration> - <instructions> - <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> - <Bundle-Activator>org.apache.cxf.dosgi.discovery.zookeeper.Activator</Bundle-Activator> - <Export-Package> - !* - </Export-Package> - </instructions> - </configuration> - </plugin> - </plugins> - </build> -</project> http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Activator.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Activator.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Activator.java deleted file mode 100644 index cbbea58..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Activator.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper; - -import java.util.Dictionary; -import java.util.Hashtable; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.service.cm.ManagedService; - -public class Activator implements BundleActivator { - - private ZooKeeperDiscovery zkd; - - public synchronized void start(BundleContext bc) throws Exception { - zkd = new ZooKeeperDiscovery(bc); - Dictionary<String, String> props = new Hashtable<String, String>(); - props.put(Constants.SERVICE_PID, "org.apache.cxf.dosgi.discovery.zookeeper"); - bc.registerService(ManagedService.class.getName(), zkd, props); - } - - public synchronized void stop(BundleContext bc) throws Exception { - zkd.stop(true); - } -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/ZooKeeperDiscovery.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/ZooKeeperDiscovery.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/ZooKeeperDiscovery.java deleted file mode 100644 index 33e2da4..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/ZooKeeperDiscovery.java +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper; - -import java.io.IOException; -import java.util.Dictionary; - -import org.apache.cxf.dosgi.discovery.zookeeper.publish.PublishingEndpointListenerFactory; -import org.apache.cxf.dosgi.discovery.zookeeper.subscribe.EndpointListenerTracker; -import org.apache.cxf.dosgi.discovery.zookeeper.subscribe.InterfaceMonitorManager; -import org.apache.cxf.dosgi.discovery.zookeeper.util.Utils; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZooKeeper; -import org.osgi.framework.BundleContext; -import org.osgi.service.cm.ConfigurationException; -import org.osgi.service.cm.ManagedService; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.util.tracker.ServiceTracker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ZooKeeperDiscovery implements Watcher, ManagedService { - - public static final String DISCOVERY_ZOOKEEPER_ID = "org.apache.cxf.dosgi.discovery.zookeeper"; - - private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperDiscovery.class); - - private final BundleContext bctx; - - private PublishingEndpointListenerFactory endpointListenerFactory; - private ServiceTracker<EndpointListener, EndpointListener> endpointListenerTracker; - private InterfaceMonitorManager imManager; - private ZooKeeper zk; - private boolean closed; - private boolean started; - - private Dictionary<String, ?> curConfiguration; - - public ZooKeeperDiscovery(BundleContext bctx) { - this.bctx = bctx; - } - - private void setDefaults(Dictionary<String, String> configuration) { - Utils.setDefault(configuration, "zookeeper.host", "localhost"); - Utils.setDefault(configuration, "zookeeper.port", "2181"); - Utils.setDefault(configuration, "zookeeper.timeout", "3000"); - } - - @SuppressWarnings("unchecked") - public synchronized void updated(Dictionary<String, ?> configuration) throws ConfigurationException { - LOG.debug("Received configuration update for Zookeeper Discovery: {}", configuration); - if (configuration != null) { - setDefaults((Dictionary<String, String>)configuration); - } - // make changes only if config actually changed, to prevent unnecessary ZooKeeper reconnections - if (!Utils.toMap(configuration).equals(Utils.toMap(curConfiguration))) { - stop(false); - curConfiguration = configuration; - // config is null if it doesn't exist, is being deleted or has not yet been loaded - // in which case we just stop running - if (configuration != null) { - createZooKeeper(configuration); - } - } - } - - private synchronized void start() { - if (closed) { - return; - } - if (started) { - // we must be re-entrant, i.e. can be called when already started - LOG.debug("ZookeeperDiscovery already started"); - return; - } - LOG.debug("starting ZookeeperDiscovery"); - endpointListenerFactory = new PublishingEndpointListenerFactory(zk, bctx); - endpointListenerFactory.start(); - imManager = new InterfaceMonitorManager(bctx, zk); - endpointListenerTracker = new EndpointListenerTracker(bctx, imManager); - endpointListenerTracker.open(); - started = true; - } - - public synchronized void stop(boolean close) { - if (started) { - LOG.debug("stopping ZookeeperDiscovery"); - } - started = false; - closed |= close; - if (endpointListenerFactory != null) { - endpointListenerFactory.stop(); - } - if (endpointListenerTracker != null) { - endpointListenerTracker.close(); - } - if (imManager != null) { - imManager.close(); - } - if (zk != null) { - try { - zk.close(); - } catch (InterruptedException e) { - LOG.error("Error closing ZooKeeper", e); - } - } - } - - private synchronized void createZooKeeper(Dictionary<String, ?> configuration) { - if (closed) { - return; - } - String host = configuration.get("zookeeper.host").toString(); - String port = configuration.get("zookeeper.port").toString(); - int timeout = Integer.parseInt(configuration.get("zookeeper.timeout").toString()); - LOG.debug("ZooKeeper configuration: connecting to {}:{} with timeout {}", - new Object[]{host, port, timeout}); - try { - zk = new ZooKeeper(host + ":" + port, timeout, this); - } catch (IOException e) { - LOG.error("Failed to start the ZooKeeper Discovery component.", e); - } - } - - /* Callback for ZooKeeper */ - public void process(WatchedEvent event) { - LOG.debug("got ZooKeeper event " + event); - switch (event.getState()) { - case SyncConnected: - LOG.info("Connection to ZooKeeper established"); - // this event can be triggered more than once in a row (e.g. after Disconnected event), - // so we must be re-entrant here - start(); - break; - - case Expired: - LOG.info("Connection to ZooKeeper expired. Trying to create a new connection"); - stop(false); - createZooKeeper(curConfiguration); - break; - - default: - // ignore other events - break; - } - } -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/DiscoveryPlugin.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/DiscoveryPlugin.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/DiscoveryPlugin.java deleted file mode 100644 index 5d46585..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/DiscoveryPlugin.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper.publish; - -import java.util.Map; - -/** - * This interface allows transformation of service registration information before it is pushed into the ZooKeeper - * discovery system. - * It can be useful for situations where a host name or port number needs to be changed in cases where the host running - * the service is known differently from the outside to what the local Java process thinks it is. - * Extra service properties can also be added to the registration which can be useful to refine the remote service - * lookup process. <p/> - * - * DiscoveryPlugins use the OSGi WhiteBoard pattern. To add one to the system, register an instance under this interface - * with the OSGi Service Registry. All registered DiscoveryPlugin instances are visited and given a chance to - * process the information before it is pushed into ZooKeeper. <p/> - * - * Note that the changes made using this plugin do not modify the local service registration. - * - */ -public interface DiscoveryPlugin { - - /** - * Process service registration information. Plugins can change this information before it is published into the - * ZooKeeper discovery system. - * - * @param mutableProperties A map of service registration properties. The map is mutable and any changes to the map - * will be reflected in the ZooKeeper registration. - * @param endpointKey The key under which the service is registered in ZooKeeper. This key typically has the - * following format: hostname#port##context. While the actual value of this key is not actually used by the - * system (people can use it as a hint to understand where the service is located), the value <i>must</i> be - * unique for all services of a given type. - * @return The <tt>endpointKey</tt> value to be used. If there is no need to change this simply return the value - * of the <tt>endpointKey</tt> parameter. - */ - String process(Map<String, Object> mutableProperties, String endpointKey); -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListener.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListener.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListener.java deleted file mode 100644 index c703b9f..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListener.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper.publish; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.cxf.dosgi.discovery.zookeeper.util.Utils; -import org.apache.cxf.dosgi.endpointdesc.EndpointDescriptionParser; -import org.apache.cxf.dosgi.endpointdesc.PropertiesMapper; -import org.apache.zookeeper.CreateMode; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.NoNodeException; -import org.apache.zookeeper.KeeperException.NodeExistsException; -import org.apache.zookeeper.ZooDefs.Ids; -import org.apache.zookeeper.ZooKeeper; -import org.osgi.framework.BundleContext; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.util.tracker.ServiceTracker; -import org.osgi.xmlns.rsa.v1_0.EndpointDescriptionType; -import org.osgi.xmlns.rsa.v1_0.PropertyType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Listens for local Endpoints and publishes them to ZooKeeper. - */ -public class PublishingEndpointListener implements EndpointListener { - - private static final Logger LOG = LoggerFactory.getLogger(PublishingEndpointListener.class); - - private final ZooKeeper zk; - private final ServiceTracker<DiscoveryPlugin, DiscoveryPlugin> discoveryPluginTracker; - private final List<EndpointDescription> endpoints = new ArrayList<EndpointDescription>(); - private boolean closed; - - private final EndpointDescriptionParser endpointDescriptionParser; - - public PublishingEndpointListener(ZooKeeper zk, BundleContext bctx) { - this.zk = zk; - discoveryPluginTracker = new ServiceTracker<DiscoveryPlugin, DiscoveryPlugin>(bctx, - DiscoveryPlugin.class, null); - discoveryPluginTracker.open(); - endpointDescriptionParser = new EndpointDescriptionParser(); - } - - public void endpointAdded(EndpointDescription endpoint, String matchedFilter) { - LOG.info("Local EndpointDescription added: {}", endpoint); - - synchronized (endpoints) { - if (closed) { - return; - } - if (endpoints.contains(endpoint)) { - // TODO -> Should the published endpoint be updated here? - return; - } - - try { - addEndpoint(endpoint); - endpoints.add(endpoint); - } catch (Exception ex) { - LOG.error("Exception while processing the addition of an endpoint.", ex); - } - } - } - - private void addEndpoint(EndpointDescription endpoint) throws URISyntaxException, KeeperException, - InterruptedException, IOException { - Collection<String> interfaces = endpoint.getInterfaces(); - String endpointKey = getKey(endpoint.getId()); - Map<String, Object> props = new HashMap<String, Object>(endpoint.getProperties()); - - // process plugins - Object[] plugins = discoveryPluginTracker.getServices(); - if (plugins != null) { - for (Object plugin : plugins) { - if (plugin instanceof DiscoveryPlugin) { - endpointKey = ((DiscoveryPlugin)plugin).process(props, endpointKey); - } - } - } - - for (String name : interfaces) { - String path = Utils.getZooKeeperPath(name); - String fullPath = path + '/' + endpointKey; - LOG.debug("Creating ZooKeeper node: {}", fullPath); - ensurePath(path, zk); - List<PropertyType> propsOut = new PropertiesMapper().fromProps(props); - EndpointDescriptionType epd = new EndpointDescriptionType(); - epd.getProperty().addAll(propsOut); - byte[] epData = endpointDescriptionParser.getData(epd); - createEphemeralNode(fullPath, epData); - } - } - - private void createEphemeralNode(String fullPath, byte[] data) throws KeeperException, InterruptedException { - try { - zk.create(fullPath, data, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); - } catch (NodeExistsException nee) { - // this sometimes happens after a ZooKeeper node dies and the ephemeral node - // that belonged to the old session was not yet deleted. We need to make our - // session the owner of the node so it won't get deleted automatically - - // we do this by deleting and recreating it ourselves. - LOG.info("node for endpoint already exists, recreating: {}", fullPath); - try { - zk.delete(fullPath, -1); - } catch (NoNodeException nne) { - // it's a race condition, but as long as it got deleted - it's ok - } - zk.create(fullPath, data, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); - } - } - - public void endpointRemoved(EndpointDescription endpoint, String matchedFilter) { - LOG.info("Local EndpointDescription removed: {}", endpoint); - - synchronized (endpoints) { - if (closed) { - return; - } - if (!endpoints.contains(endpoint)) { - return; - } - - try { - removeEndpoint(endpoint); - endpoints.remove(endpoint); - } catch (Exception ex) { - LOG.error("Exception while processing the removal of an endpoint", ex); - } - } - } - - private void removeEndpoint(EndpointDescription endpoint) throws UnknownHostException, URISyntaxException { - Collection<String> interfaces = endpoint.getInterfaces(); - String endpointKey = getKey(endpoint.getId()); - - for (String name : interfaces) { - String path = Utils.getZooKeeperPath(name); - String fullPath = path + '/' + endpointKey; - LOG.debug("Removing ZooKeeper node: {}", fullPath); - try { - zk.delete(fullPath, -1); - } catch (Exception ex) { - LOG.debug("Error while removing endpoint: {}", ex); // e.g. session expired - } - } - } - - private static void ensurePath(String path, ZooKeeper zk) throws KeeperException, InterruptedException { - StringBuilder current = new StringBuilder(); - String[] parts = Utils.removeEmpty(path.split("/")); - for (String part : parts) { - current.append('/'); - current.append(part); - try { - zk.create(current.toString(), new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - } catch (NodeExistsException nee) { - // it's not the first node with this path to ever exist - that's normal - } - } - } - - static String getKey(String endpoint) throws URISyntaxException { - URI uri = new URI(endpoint); - - StringBuilder sb = new StringBuilder(); - sb.append(uri.getHost()); - sb.append("#"); - sb.append(uri.getPort()); - sb.append("#"); - sb.append(uri.getPath().replace('/', '#')); - return sb.toString(); - } - - public void close() { - LOG.debug("closing - removing all endpoints"); - synchronized (endpoints) { - closed = true; - for (EndpointDescription endpoint : endpoints) { - try { - removeEndpoint(endpoint); - } catch (Exception ex) { - LOG.error("Exception while removing endpoint during close", ex); - } - } - endpoints.clear(); - } - discoveryPluginTracker.close(); - } -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListenerFactory.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListenerFactory.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListenerFactory.java deleted file mode 100644 index c505bb4..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/publish/PublishingEndpointListenerFactory.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper.publish; - -import java.util.ArrayList; -import java.util.Dictionary; -import java.util.Hashtable; -import java.util.List; - -import org.apache.cxf.dosgi.discovery.zookeeper.ZooKeeperDiscovery; -import org.apache.cxf.dosgi.discovery.zookeeper.util.Utils; -import org.apache.zookeeper.ZooKeeper; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.ServiceFactory; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.service.remoteserviceadmin.RemoteConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Creates local EndpointListeners that publish to ZooKeeper. - */ -public class PublishingEndpointListenerFactory implements ServiceFactory<PublishingEndpointListener> { - - private static final Logger LOG = LoggerFactory.getLogger(PublishingEndpointListenerFactory.class); - - private final BundleContext bctx; - private final ZooKeeper zk; - private final List<PublishingEndpointListener> listeners = new ArrayList<PublishingEndpointListener>(); - private ServiceRegistration serviceRegistration; - - public PublishingEndpointListenerFactory(ZooKeeper zk, BundleContext bctx) { - this.bctx = bctx; - this.zk = zk; - } - - public PublishingEndpointListener getService(Bundle b, ServiceRegistration<PublishingEndpointListener> sr) { - LOG.debug("new EndpointListener from factory"); - synchronized (listeners) { - PublishingEndpointListener pel = new PublishingEndpointListener(zk, bctx); - listeners.add(pel); - return pel; - } - } - - public void ungetService(Bundle b, ServiceRegistration<PublishingEndpointListener> sr, - PublishingEndpointListener pel) { - LOG.debug("remove EndpointListener"); - synchronized (listeners) { - if (listeners.remove(pel)) { - pel.close(); - } - } - } - - public synchronized void start() { - Dictionary<String, String> props = new Hashtable<String, String>(); - props.put(EndpointListener.ENDPOINT_LISTENER_SCOPE, - "(&(" + Constants.OBJECTCLASS + "=*)(" + RemoteConstants.ENDPOINT_FRAMEWORK_UUID - + "=" + Utils.getUUID(bctx) + "))"); - props.put(ZooKeeperDiscovery.DISCOVERY_ZOOKEEPER_ID, "true"); - serviceRegistration = bctx.registerService(EndpointListener.class.getName(), this, props); - } - - public synchronized void stop() { - if (serviceRegistration != null) { - serviceRegistration.unregister(); - serviceRegistration = null; - } - synchronized (listeners) { - for (PublishingEndpointListener pel : listeners) { - pel.close(); - } - listeners.clear(); - } - } - - /** - * Only for the test case! - */ - protected List<PublishingEndpointListener> getListeners() { - synchronized (listeners) { - return listeners; - } - } -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/EndpointListenerTracker.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/EndpointListenerTracker.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/EndpointListenerTracker.java deleted file mode 100644 index 4d0a25f..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/EndpointListenerTracker.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper.subscribe; - -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.util.tracker.ServiceTracker; - -/** - * Tracks interest in EndpointListeners. Delegates to InterfaceMonitorManager to manage - * interest in the scopes of each EndpointListener. - */ -public class EndpointListenerTracker extends ServiceTracker<EndpointListener, EndpointListener> { - private final InterfaceMonitorManager imManager; - - public EndpointListenerTracker(BundleContext bctx, InterfaceMonitorManager imManager) { - super(bctx, EndpointListener.class, null); - this.imManager = imManager; - } - - @Override - public EndpointListener addingService(ServiceReference<EndpointListener> endpointListener) { - imManager.addInterest(endpointListener); - return null; - } - - @Override - public void modifiedService(ServiceReference<EndpointListener> endpointListener, EndpointListener service) { - // called when an EndpointListener updates its service properties, - // e.g. when its interest scope is expanded/reduced - imManager.addInterest(endpointListener); - } - - @Override - public void removedService(ServiceReference<EndpointListener> endpointListener, EndpointListener service) { - imManager.removeInterest(endpointListener); - } - -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java deleted file mode 100644 index 95277d3..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper.subscribe; - -import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.cxf.dosgi.discovery.zookeeper.util.Utils; -import org.apache.cxf.dosgi.endpointdesc.EndpointDescriptionParser; -import org.apache.cxf.dosgi.endpointdesc.PropertiesMapper; -import org.apache.zookeeper.AsyncCallback.StatCallback; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.KeeperException.Code; -import org.apache.zookeeper.WatchedEvent; -import org.apache.zookeeper.Watcher; -import org.apache.zookeeper.ZooKeeper; -import org.apache.zookeeper.data.Stat; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.xmlns.rsa.v1_0.EndpointDescriptionType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Monitors ZooKeeper for changes in published endpoints. - * <p> - * Specifically, it monitors the node path associated with a given interface class, - * whose data is a serialized version of an EndpointDescription, and notifies an - * EndpointListener when changes are detected (which can then propagate the - * notification to other EndpointListeners with a matching scope). - * <p> - * Note that the EndpointListener is used here as a decoupling interface for - * convenience, and is not necessarily used according to its documented contract. - */ -public class InterfaceMonitor implements Watcher, StatCallback { - - private static final Logger LOG = LoggerFactory.getLogger(InterfaceMonitor.class); - - private final String znode; - private final ZooKeeper zk; - private final EndpointListener endpointListener; - private final boolean recursive; - private volatile boolean closed; - - // This map reference changes, so don't synchronize on it - private Map<String, EndpointDescription> nodes = new HashMap<String, EndpointDescription>(); - - private EndpointDescriptionParser parser; - - public InterfaceMonitor(ZooKeeper zk, String objClass, EndpointListener endpointListener, String scope) { - this.zk = zk; - this.znode = Utils.getZooKeeperPath(objClass); - this.recursive = objClass == null || objClass.isEmpty(); - this.endpointListener = endpointListener; - this.parser = new EndpointDescriptionParser(); - LOG.debug("Creating new InterfaceMonitor {} for scope [{}] and objectClass [{}]", - new Object[] {recursive ? "(recursive)" : "", scope, objClass}); - } - - /** - * Returns all endpoints that are currently known to this monitor. - * - * @return all endpoints that are currently known to this monitor - */ - public synchronized List<EndpointDescription> getEndpoints() { - return new ArrayList<EndpointDescription>(nodes.values()); - } - - public void start() { - watch(); - } - - private void watch() { - LOG.debug("registering a ZooKeeper.exists({}) callback", znode); - zk.exists(znode, this, this, null); - } - - /** - * Zookeeper Watcher interface callback. - */ - public void process(WatchedEvent event) { - LOG.debug("ZooKeeper watcher callback on node {} for event {}", znode, event); - processDelta(); - } - - /** - * Zookeeper StatCallback interface callback. - */ - @SuppressWarnings("deprecation") - public void processResult(int rc, String path, Object ctx, Stat stat) { - LOG.debug("ZooKeeper callback on node: {} code: {}", znode, rc); - - switch (rc) { - case Code.Ok: - case Code.NoNode: - processDelta(); - return; - - case Code.SessionExpired: - case Code.NoAuth: - case Code.ConnectionLoss: - return; - - default: - watch(); - } - } - - private void processDelta() { - if (closed) { - return; - } - - if (zk.getState() != ZooKeeper.States.CONNECTED) { - LOG.debug("ZooKeeper connection was already closed! Not processing changed event."); - return; - } - - try { - if (zk.exists(znode, false) != null) { - zk.getChildren(znode, this); - refreshNodes(); - } else { - LOG.debug("znode {} doesn't exist -> not processing any changes", znode); - } - } catch (Exception e) { - if (zk.getState() != ZooKeeper.States.CONNECTED) { - LOG.debug("Error getting Zookeeper data: " + e); // e.g. session expired, handled by ZooKeeperDiscovery - } else { - LOG.error("Error getting ZooKeeper data.", e); - } - } - } - - public synchronized void close() { - closed = true; - for (EndpointDescription endpoint : nodes.values()) { - endpointListener.endpointRemoved(endpoint, null); - } - nodes.clear(); - } - - private synchronized void refreshNodes() { - if (closed) { - return; - } - LOG.info("Processing change on node: {}", znode); - - Map<String, EndpointDescription> newNodes = new HashMap<String, EndpointDescription>(); - Map<String, EndpointDescription> prevNodes = new HashMap<String, EndpointDescription>(nodes); - processChildren(znode, newNodes, prevNodes); - - // whatever is left in prevNodes now has been removed from Discovery - LOG.debug("processChildren done. Nodes that are missing now and need to be removed: {}", prevNodes.values()); - for (EndpointDescription endpoint : prevNodes.values()) { - endpointListener.endpointRemoved(endpoint, null); - } - nodes = newNodes; - } - - /** - * Iterates through all child nodes of the given node and tries to find - * endpoints. If the recursive flag is set it also traverses into the child - * nodes. - * - * @return true if an endpoint was found and if the node therefore needs to - * be monitored for changes - */ - private boolean processChildren(String zn, Map<String, EndpointDescription> newNodes, - Map<String, EndpointDescription> prevNodes) { - List<String> children; - try { - LOG.debug("Processing the children of {}", zn); - children = zk.getChildren(zn, false); - - boolean foundANode = false; - for (String child : children) { - String childZNode = zn + '/' + child; - EndpointDescription endpoint = getEndpointDescriptionFromNode(childZNode); - if (endpoint != null) { - EndpointDescription prevEndpoint = prevNodes.get(child); - LOG.info("found new node " + zn + "/[" + child + "] ( []->child ) props: " - + endpoint.getProperties().values()); - newNodes.put(child, endpoint); - prevNodes.remove(child); - foundANode = true; - LOG.debug("Properties: {}", endpoint.getProperties()); - if (prevEndpoint == null) { - // This guy is new - endpointListener.endpointAdded(endpoint, null); - } else if (!prevEndpoint.getProperties().equals(endpoint.getProperties())) { - // TODO - } - } - if (recursive && processChildren(childZNode, newNodes, prevNodes)) { - zk.getChildren(childZNode, this); - } - } - - return foundANode; - } catch (KeeperException e) { - LOG.error("Problem processing ZooKeeper node", e); - } catch (InterruptedException e) { - LOG.error("Problem processing ZooKeeper node", e); - } - return false; - } - - /** - * Retrieves data from the given node and parses it into an EndpointDescription. - * - * @param node a node path - * @return endpoint found in the node or null if no endpoint was found - */ - private EndpointDescription getEndpointDescriptionFromNode(String node) { - try { - Stat stat = zk.exists(node, false); - if (stat == null || stat.getDataLength() <= 0) { - return null; - } - byte[] data = zk.getData(node, false, null); - LOG.debug("Got data for node: {}", node); - - EndpointDescription endpoint = getFirstEnpointDescription(data); - if (endpoint != null) { - return endpoint; - } - LOG.warn("No Discovery information found for node: {}", node); - } catch (Exception e) { - LOG.error("Problem getting EndpointDescription from node " + node, e); - } - return null; - } - - public EndpointDescription getFirstEnpointDescription(byte[] data) { - List<EndpointDescriptionType> elements = parser.getEndpointDescriptions(new ByteArrayInputStream(data)); - if (elements.isEmpty()) { - return null; - } - Map<String, Object> props = new PropertiesMapper().toProps(elements.get(0).getProperty()); - return new EndpointDescription(props); - } -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d73a3a7f/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java ---------------------------------------------------------------------- diff --git a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java b/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java deleted file mode 100644 index 240e5ea..0000000 --- a/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java +++ /dev/null @@ -1,218 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cxf.dosgi.discovery.zookeeper.subscribe; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.apache.cxf.dosgi.discovery.zookeeper.ZooKeeperDiscovery; -import org.apache.cxf.dosgi.discovery.zookeeper.util.Utils; -import org.apache.zookeeper.ZooKeeper; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.apache.cxf.dosgi.discovery.local.util.Utils.matchFilter; - -/** - * Manages the EndpointListeners and the scopes they are interested in. - * For each scope with interested EndpointListeners an InterfaceMonitor is created. - * The InterfaceMonitor calls back when it detects added or removed external Endpoints. - * These events are then forwarded to all interested EndpointListeners. - */ -public class InterfaceMonitorManager { - - private static final Logger LOG = LoggerFactory.getLogger(InterfaceMonitorManager.class); - - private final BundleContext bctx; - private final ZooKeeper zk; - // map of EndpointListeners and the scopes they are interested in - private final Map<ServiceReference<EndpointListener>, List<String>> endpointListenerScopes = - new HashMap<ServiceReference<EndpointListener>, List<String>>(); - // map of scopes and their interest data - private final Map<String, Interest> interests = new HashMap<String, Interest>(); - - protected static class Interest { - List<ServiceReference<EndpointListener>> endpointListeners = - new CopyOnWriteArrayList<ServiceReference<EndpointListener>>(); - InterfaceMonitor monitor; - } - - public InterfaceMonitorManager(BundleContext bctx, ZooKeeper zk) { - this.bctx = bctx; - this.zk = zk; - } - - public void addInterest(ServiceReference<EndpointListener> endpointListener) { - if (isOurOwnEndpointListener(endpointListener)) { - LOG.debug("Skipping our own EndpointListener"); - return; - } - - LOG.info("updating EndpointListener interests: {}", endpointListener); - if (LOG.isDebugEnabled()) { - LOG.debug("updated EndpointListener properties: {}", Utils.getProperties(endpointListener)); - } - for (String scope : Utils.getScopes(endpointListener)) { - String objClass = Utils.getObjectClass(scope); - LOG.debug("Adding interest in scope {}, objectClass {}", scope, objClass); - addInterest(endpointListener, scope, objClass); - } - } - - private static boolean isOurOwnEndpointListener(ServiceReference<EndpointListener> endpointListener) { - return Boolean.parseBoolean(String.valueOf( - endpointListener.getProperty(ZooKeeperDiscovery.DISCOVERY_ZOOKEEPER_ID))); - } - - @SuppressWarnings("unchecked") - public synchronized void addInterest(ServiceReference<EndpointListener> endpointListener, - String scope, String objClass) { - // get or create interest for given scope and add listener to it - Interest interest = interests.get(scope); - if (interest == null) { - // create interest, add listener and start monitor - interest = new Interest(); - interests.put(scope, interest); - interest.endpointListeners.add(endpointListener); // add it before monitor starts so we don't miss events - interest.monitor = createInterfaceMonitor(scope, objClass, interest); - interest.monitor.start(); - } else { - // interest already exists, so just add listener to it - if (!interest.endpointListeners.contains(endpointListener)) { - interest.endpointListeners.add(endpointListener); - } - // notify listener of all known endpoints for given scope - // (as EndpointListener contract requires of all added/modified listeners) - for (EndpointDescription endpoint : interest.monitor.getEndpoints()) { - notifyListeners(endpoint, scope, true, Arrays.asList(endpointListener)); - } - } - - // add scope to listener's scopes list - List<String> scopes = endpointListenerScopes.get(endpointListener); - if (scopes == null) { - scopes = new ArrayList<String>(1); - endpointListenerScopes.put(endpointListener, scopes); - } - if (!scopes.contains(scope)) { - scopes.add(scope); - } - } - - public synchronized void removeInterest(ServiceReference<EndpointListener> endpointListener) { - LOG.info("removing EndpointListener interests: {}", endpointListener); - List<String> scopes = endpointListenerScopes.get(endpointListener); - if (scopes == null) { - return; - } - - for (String scope : scopes) { - Interest interest = interests.get(scope); - if (interest != null) { - interest.endpointListeners.remove(endpointListener); - if (interest.endpointListeners.isEmpty()) { - interest.monitor.close(); - interests.remove(scope); - } - } - } - endpointListenerScopes.remove(endpointListener); - } - - protected InterfaceMonitor createInterfaceMonitor(final String scope, String objClass, final Interest interest) { - // holding this object's lock in the callbacks can lead to a deadlock with InterfaceMonitor - EndpointListener endpointListener = new EndpointListener() { - - public void endpointRemoved(EndpointDescription endpoint, String matchedFilter) { - notifyListeners(endpoint, scope, false, interest.endpointListeners); - } - - public void endpointAdded(EndpointDescription endpoint, String matchedFilter) { - notifyListeners(endpoint, scope, true, interest.endpointListeners); - } - }; - return new InterfaceMonitor(zk, objClass, endpointListener, scope); - } - - private void notifyListeners(EndpointDescription endpoint, String currentScope, boolean isAdded, - List<ServiceReference<EndpointListener>> endpointListeners) { - for (ServiceReference<EndpointListener> endpointListenerRef : endpointListeners) { - EndpointListener service = bctx.getService(endpointListenerRef); - try { - EndpointListener endpointListener = (EndpointListener)service; - LOG.trace("matching {} against {}", endpoint, currentScope); - if (matchFilter(bctx, currentScope, endpoint)) { - LOG.debug("Matched {} against {}", endpoint, currentScope); - notifyListener(endpoint, currentScope, isAdded, endpointListenerRef.getBundle(), - endpointListener); - } - } finally { - if (service != null) { - bctx.ungetService(endpointListenerRef); - } - } - } - } - - private void notifyListener(EndpointDescription endpoint, String currentScope, boolean isAdded, - Bundle endpointListenerBundle, EndpointListener endpointListener) { - if (endpointListenerBundle == null) { - LOG.info("listening service was unregistered, ignoring"); - } else if (isAdded) { - LOG.info("calling EndpointListener.endpointAdded: " + endpointListener + " from bundle " - + endpointListenerBundle.getSymbolicName() + " for endpoint: " + endpoint); - endpointListener.endpointAdded(endpoint, currentScope); - } else { - LOG.info("calling EndpointListener.endpointRemoved: " + endpointListener + " from bundle " - + endpointListenerBundle.getSymbolicName() + " for endpoint: " + endpoint); - endpointListener.endpointRemoved(endpoint, currentScope); - } - } - - public synchronized void close() { - for (Interest interest : interests.values()) { - interest.monitor.close(); - } - interests.clear(); - endpointListenerScopes.clear(); - } - - /** - * Only for test case! - */ - protected synchronized Map<String, Interest> getInterests() { - return interests; - } - - /** - * Only for test case! - */ - protected synchronized Map<ServiceReference<EndpointListener>, List<String>> getEndpointListenerScopes() { - return endpointListenerScopes; - } -}
