You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by am...@apache.org on 2013/07/03 02:24:11 UTC

svn commit: r1499161 - in /cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe: InterfaceMonitor.java InterfaceMonitorManager.java

Author: amichai
Date: Wed Jul  3 00:24:10 2013
New Revision: 1499161

URL: http://svn.apache.org/r1499161
Log:
DOSGI-198 Fix imported service disappearing after client bundle is restarted

Modified:
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java?rev=1499161&r1=1499160&r2=1499161&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitor.java Wed Jul  3 00:24:10 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.cxf.dosgi.discovery.zookeeper.subscribe;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -69,6 +70,15 @@ public class InterfaceMonitor implements
                 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();
     }
@@ -146,7 +156,7 @@ public class InterfaceMonitor implements
         LOG.info("Processing change on node: {}", znode);
 
         Map<String, EndpointDescription> newNodes = new HashMap<String, EndpointDescription>();
-        Map<String, EndpointDescription> prevNodes = nodes;
+        Map<String, EndpointDescription> prevNodes = new HashMap<String, EndpointDescription>(nodes);
         processChildren(znode, newNodes, prevNodes);
 
         // whatever is left in prevNodes now has been removed from Discovery

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java?rev=1499161&r1=1499160&r2=1499161&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/subscribe/InterfaceMonitorManager.java Wed Jul  3 00:24:10 2013
@@ -19,6 +19,7 @@
 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;
@@ -81,9 +82,16 @@ public class InterfaceMonitorManager {
             interest.listeners.add(sref); // add it before monitor starts so we don't miss events
             interest.im = createInterfaceMonitor(scope, objClass, interest);
             interest.im.start();
-        } else if (!interest.listeners.contains(sref)) {
+        } else {
             // interest already exists, so just add listener to it
-            interest.listeners.add(sref);
+            if (!interest.listeners.contains(sref)) {
+                interest.listeners.add(sref);
+            }
+            // notify listener of all known endpoints for given scope
+            // (as EndpointListener contract requires of all added/modified listeners)
+            for (EndpointDescription endpoint : interest.im.getEndpoints()) {
+                notifyListeners(endpoint, scope, true, Arrays.asList(sref));
+            }
         }
 
         // add scope to listener's scopes list