[ARIES-1778] Improved naming and documentation
Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/d5bfc376 Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/d5bfc376 Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/d5bfc376 Branch: refs/heads/master Commit: d5bfc3769bb3ed501f41927766a0b9d02ebd3a70 Parents: de9f1a4 Author: Christian Schneider <cschn...@adobe.com> Authored: Mon Feb 12 18:02:44 2018 +0100 Committer: Christian Schneider <cschn...@adobe.com> Committed: Mon Feb 12 18:02:44 2018 +0100 ---------------------------------------------------------------------- .../discovery/zookeeper/ZooKeeperDiscovery.java | 6 +- .../subscribe/EndpointListenerTracker.java | 7 +- .../zookeeper/subscribe/InterestManager.java | 164 ++++++++++++++++++ .../subscribe/InterfaceMonitorManager.java | 165 ------------------- .../subscribe/InterfaceMonitorManagerTest.java | 2 +- 5 files changed, 171 insertions(+), 173 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d5bfc376/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/ZooKeeperDiscovery.java ---------------------------------------------------------------------- diff --git a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/ZooKeeperDiscovery.java b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/ZooKeeperDiscovery.java index 50d9598..5e55d8c 100644 --- a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/ZooKeeperDiscovery.java +++ b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/ZooKeeperDiscovery.java @@ -28,7 +28,7 @@ import java.util.Map; import org.apache.aries.rsa.discovery.zookeeper.publish.PublishingEndpointListener; import org.apache.aries.rsa.discovery.zookeeper.repository.ZookeeperEndpointRepository; import org.apache.aries.rsa.discovery.zookeeper.subscribe.EndpointListenerTracker; -import org.apache.aries.rsa.discovery.zookeeper.subscribe.InterfaceMonitorManager; +import org.apache.aries.rsa.discovery.zookeeper.subscribe.InterestManager; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; @@ -49,7 +49,7 @@ public class ZooKeeperDiscovery implements Watcher, ManagedService { private PublishingEndpointListener endpointListener; private ServiceTracker<?, ?> endpointListenerTracker; - private InterfaceMonitorManager imManager; + private InterestManager imManager; private ZooKeeper zkClient; private boolean closed; private boolean started; @@ -98,7 +98,7 @@ public class ZooKeeperDiscovery implements Watcher, ManagedService { repository = new ZookeeperEndpointRepository(zkClient); endpointListener = new PublishingEndpointListener(repository); endpointListener.start(bctx); - imManager = new InterfaceMonitorManager(repository); + imManager = new InterestManager(repository); repository.addListener(imManager); endpointListenerTracker = new EndpointListenerTracker(bctx, imManager); endpointListenerTracker.open(); http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d5bfc376/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/EndpointListenerTracker.java ---------------------------------------------------------------------- diff --git a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/EndpointListenerTracker.java b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/EndpointListenerTracker.java index d4805d0..4bb37cf 100644 --- a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/EndpointListenerTracker.java +++ b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/EndpointListenerTracker.java @@ -28,14 +28,13 @@ 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. + * Tracks EndpointListeners and EndpointEventListeners. Delegates to InterestManager to handle them */ @SuppressWarnings({ "rawtypes", "deprecation", "unchecked" }) public class EndpointListenerTracker extends ServiceTracker { - private final InterfaceMonitorManager imManager; + private final InterestManager imManager; - public EndpointListenerTracker(BundleContext bctx, InterfaceMonitorManager imManager) { + public EndpointListenerTracker(BundleContext bctx, InterestManager imManager) { super(bctx, getfilter(), null); this.imManager = imManager; } http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d5bfc376/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterestManager.java ---------------------------------------------------------------------- diff --git a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterestManager.java b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterestManager.java new file mode 100644 index 0000000..cf5d5fb --- /dev/null +++ b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterestManager.java @@ -0,0 +1,164 @@ +/** + * 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.aries.rsa.discovery.zookeeper.subscribe; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.aries.rsa.discovery.zookeeper.ZooKeeperDiscovery; +import org.apache.aries.rsa.discovery.zookeeper.repository.ZookeeperEndpointRepository; +import org.apache.aries.rsa.util.StringPlus; +import org.osgi.framework.ServiceReference; +import org.osgi.service.remoteserviceadmin.EndpointDescription; +import org.osgi.service.remoteserviceadmin.EndpointEvent; +import org.osgi.service.remoteserviceadmin.EndpointEventListener; +import org.osgi.service.remoteserviceadmin.EndpointListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Manages the EndpointEventListeners and the scopes they are interested in. + * Establishes a listener with the repository to be called back on all changes in the repo. + * Events from repository are then forwarded to all interested EndpointEventListeners. + */ +@SuppressWarnings({"deprecation", "rawtypes"}) +public class InterestManager implements EndpointEventListener { + private static final Logger LOG = LoggerFactory.getLogger(InterestManager.class); + + private final ZookeeperEndpointRepository repository; + private final Map<ServiceReference, Interest> interests = new HashMap<ServiceReference, Interest>(); + + protected static class Interest { + List<String> scopes; + Object epListener; + } + + public InterestManager(ZookeeperEndpointRepository repository) { + this.repository = repository; + } + + public void addInterest(ServiceReference<?> sref, Object epListener) { + if (isOurOwnEndpointEventListener(sref)) { + LOG.debug("Skipping our own EndpointEventListener"); + return; + } + List<String> scopes = getScopes(sref); + LOG.debug("adding Interests: {}", scopes); + + // get or create interest for given scope and add listener to it + Interest interest = interests.get(epListener); + if (interest == null) { + // create interest, add listener and start monitor + interest = new Interest(); + interest.epListener = epListener; + interest.scopes = scopes; + interests.put(sref, interest); + sendExistingEndpoints(scopes, epListener); + } + } + + private void sendExistingEndpoints(List<String> scopes, Object epListener) { + for (EndpointDescription endpoint : repository.getAll()) { + EndpointEvent event = new EndpointEvent(EndpointEvent.ADDED, endpoint); + notifyListener(event, scopes, epListener); + } + } + + private static boolean isOurOwnEndpointEventListener(ServiceReference<?> EndpointEventListener) { + return Boolean.parseBoolean(String.valueOf( + EndpointEventListener.getProperty(ZooKeeperDiscovery.DISCOVERY_ZOOKEEPER_ID))); + } + + public synchronized void removeInterest(ServiceReference<EndpointEventListener> epListenerRef) { + LOG.info("removing EndpointEventListener interests: {}", epListenerRef); + interests.remove(epListenerRef); + } + + @Override + public void endpointChanged(EndpointEvent event, String filter) { + for (Interest interest : interests.values()) { + notifyListener(event, interest.scopes, interest.epListener); + } + } + + private void notifyListener(EndpointEvent event, List<String> scopes, Object service) { + EndpointDescription endpoint = event.getEndpoint(); + String currentScope = getFirstMatch(scopes, endpoint); + if (currentScope == null) { + return; + } + LOG.debug("Matched {} against {}", endpoint, currentScope); + if (service instanceof EndpointEventListener) { + notifyEEListener(event, currentScope, (EndpointEventListener)service); + } else if (service instanceof EndpointListener) { + notifyEListener(event, currentScope, (EndpointListener)service); + } + } + + private String getFirstMatch(List<String> scopes, EndpointDescription endpoint) { + for (String scope : scopes) { + if (endpoint.matches(scope)) { + return scope; + } + } + return null; + } + + private void notifyEEListener(EndpointEvent event, String currentScope, EndpointEventListener listener) { + EndpointDescription endpoint = event.getEndpoint(); + LOG.info("Calling endpointchanged on class {} for filter {}, type {}, endpoint {} ", listener, currentScope, endpoint); + listener.endpointChanged(event, currentScope); + } + + private void notifyEListener(EndpointEvent event, String currentScope, EndpointListener listener) { + EndpointDescription endpoint = event.getEndpoint(); + LOG.info("Calling old listener on class {} for filter {}, type {}, endpoint {} ", listener, currentScope, endpoint); + switch (event.getType()) { + case EndpointEvent.ADDED: + listener.endpointAdded(endpoint, currentScope); + break; + + case EndpointEvent.MODIFIED: + listener.endpointAdded(endpoint, currentScope); + listener.endpointRemoved(endpoint, currentScope); + break; + + case EndpointEvent.REMOVED: + listener.endpointRemoved(endpoint, currentScope); + break; + } + } + + public synchronized void close() { + interests.clear(); + } + + /** + * Only for test case! + */ + protected synchronized Map<ServiceReference, Interest> getInterests() { + return interests; + } + + protected List<String> getScopes(ServiceReference<?> sref) { + return StringPlus.normalize(sref.getProperty(EndpointEventListener.ENDPOINT_LISTENER_SCOPE)); + } + +} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d5bfc376/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManager.java ---------------------------------------------------------------------- diff --git a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManager.java b/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManager.java deleted file mode 100644 index 7b5c7d2..0000000 --- a/discovery/zookeeper/src/main/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManager.java +++ /dev/null @@ -1,165 +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.aries.rsa.discovery.zookeeper.subscribe; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.aries.rsa.discovery.zookeeper.ZooKeeperDiscovery; -import org.apache.aries.rsa.discovery.zookeeper.repository.ZookeeperEndpointRepository; -import org.apache.aries.rsa.util.StringPlus; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointEvent; -import org.osgi.service.remoteserviceadmin.EndpointEventListener; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Manages the EndpointEventListeners and the scopes they are interested in. - * For each scope with interested EndpointEventListeners an InterfaceMonitor is created. - * The InterfaceMonitor calls back when it detects added or removed external Endpoints. - * These events are then forwarded to all interested EndpointEventListeners. - */ -@SuppressWarnings({"deprecation", "rawtypes"}) -public class InterfaceMonitorManager implements EndpointEventListener { - private static final Logger LOG = LoggerFactory.getLogger(InterfaceMonitorManager.class); - - private final ZookeeperEndpointRepository repository; - private final Map<ServiceReference, Interest> interests = new HashMap<ServiceReference, Interest>(); - - protected static class Interest { - List<String> scopes; - Object epListener; - } - - public InterfaceMonitorManager(ZookeeperEndpointRepository repository) { - this.repository = repository; - } - - public void addInterest(ServiceReference<?> sref, Object epListener) { - if (isOurOwnEndpointEventListener(sref)) { - LOG.debug("Skipping our own EndpointEventListener"); - return; - } - List<String> scopes = getScopes(sref); - LOG.debug("adding Interests: {}", scopes); - - // get or create interest for given scope and add listener to it - Interest interest = interests.get(epListener); - if (interest == null) { - // create interest, add listener and start monitor - interest = new Interest(); - interest.epListener = epListener; - interest.scopes = scopes; - interests.put(sref, interest); - sendExistingEndpoints(scopes, epListener); - } - } - - private void sendExistingEndpoints(List<String> scopes, Object epListener) { - for (EndpointDescription endpoint : repository.getAll()) { - EndpointEvent event = new EndpointEvent(EndpointEvent.ADDED, endpoint); - notifyListener(event, scopes, epListener); - } - } - - private static boolean isOurOwnEndpointEventListener(ServiceReference<?> EndpointEventListener) { - return Boolean.parseBoolean(String.valueOf( - EndpointEventListener.getProperty(ZooKeeperDiscovery.DISCOVERY_ZOOKEEPER_ID))); - } - - public synchronized void removeInterest(ServiceReference<EndpointEventListener> epListenerRef) { - LOG.info("removing EndpointEventListener interests: {}", epListenerRef); - interests.remove(epListenerRef); - } - - @Override - public void endpointChanged(EndpointEvent event, String filter) { - for (Interest interest : interests.values()) { - notifyListener(event, interest.scopes, interest.epListener); - } - } - - private void notifyListener(EndpointEvent event, List<String> scopes, Object service) { - EndpointDescription endpoint = event.getEndpoint(); - String currentScope = getFirstMatch(scopes, endpoint); - if (currentScope == null) { - return; - } - LOG.debug("Matched {} against {}", endpoint, currentScope); - if (service instanceof EndpointEventListener) { - notifyEEListener(event, currentScope, (EndpointEventListener)service); - } else if (service instanceof EndpointListener) { - notifyEListener(event, currentScope, (EndpointListener)service); - } - } - - private String getFirstMatch(List<String> scopes, EndpointDescription endpoint) { - for (String scope : scopes) { - if (endpoint.matches(scope)) { - return scope; - } - } - return null; - } - - private void notifyEEListener(EndpointEvent event, String currentScope, EndpointEventListener listener) { - EndpointDescription endpoint = event.getEndpoint(); - LOG.info("Calling endpointchanged on class {} for filter {}, type {}, endpoint {} ", listener, currentScope, endpoint); - listener.endpointChanged(event, currentScope); - } - - private void notifyEListener(EndpointEvent event, String currentScope, EndpointListener listener) { - EndpointDescription endpoint = event.getEndpoint(); - LOG.info("Calling old listener on class {} for filter {}, type {}, endpoint {} ", listener, currentScope, endpoint); - switch (event.getType()) { - case EndpointEvent.ADDED: - listener.endpointAdded(endpoint, currentScope); - break; - - case EndpointEvent.MODIFIED: - listener.endpointAdded(endpoint, currentScope); - listener.endpointRemoved(endpoint, currentScope); - break; - - case EndpointEvent.REMOVED: - listener.endpointRemoved(endpoint, currentScope); - break; - } - } - - public synchronized void close() { - interests.clear(); - } - - /** - * Only for test case! - */ - protected synchronized Map<ServiceReference, Interest> getInterests() { - return interests; - } - - protected List<String> getScopes(ServiceReference<?> sref) { - return StringPlus.normalize(sref.getProperty(EndpointEventListener.ENDPOINT_LISTENER_SCOPE)); - } - -} http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/d5bfc376/discovery/zookeeper/src/test/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManagerTest.java ---------------------------------------------------------------------- diff --git a/discovery/zookeeper/src/test/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManagerTest.java b/discovery/zookeeper/src/test/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManagerTest.java index 41b0795..79b2d8d 100644 --- a/discovery/zookeeper/src/test/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManagerTest.java +++ b/discovery/zookeeper/src/test/java/org/apache/aries/rsa/discovery/zookeeper/subscribe/InterfaceMonitorManagerTest.java @@ -48,7 +48,7 @@ public class InterfaceMonitorManagerTest { c.replay(); - InterfaceMonitorManager eltc = new InterfaceMonitorManager(repository); + InterestManager eltc = new InterestManager(repository); // sref has no scope -> nothing should happen assertEquals(0, eltc.getInterests().size());