You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by da...@apache.org on 2009/04/22 10:36:30 UTC

svn commit: r767409 - in /cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src: main/java/org/apache/cxf/dosgi/discovery/zookeeper/ test/java/org/apache/cxf/dosgi/discovery/zookeeper/

Author: davidb
Date: Wed Apr 22 08:36:30 2009
New Revision: 767409

URL: http://svn.apache.org/viewvc?rev=767409&view=rev
Log:
[Discovery] Added support for modifications in the Discovered Service Tracker (modifiedService and removedService callbacks).
New unit tests included.

Modified:
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitor.java
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBean.java
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizer.java
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/PublishToZooKeeperCustomizer.java
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitorTest.java
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBeanTest.java
    cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizerTest.java

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitor.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitor.java?rev=767409&r1=767408&r2=767409&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitor.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitor.java Wed Apr 22 08:36:30 2009
@@ -40,7 +40,10 @@
         listener = new DataMonitorListenerImpl(zk, intf, dst);
         zookeeper = zk;
         znode = Util.getZooKeeperPath(intf);
-        
+    }
+    
+    public void process() {
+        /* */ System.out.println("*** Kicking off a zookeeper.exists()");
         zookeeper.exists(znode, true, this, null);
     }
 
@@ -61,7 +64,7 @@
             LOG.info("ZooKeeper reports: NoAuth on node: " + znode);
             return;
         default:
-            zookeeper.exists(znode, true, this, null);
+            process();
             return;
         }
         

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBean.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBean.java?rev=767409&r1=767408&r2=767409&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBean.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBean.java Wed Apr 22 08:36:30 2009
@@ -35,6 +35,7 @@
     private BundleContext bundleContext;
     private DiscoveryServiceImpl discoveryService;
 
+    FindInZooKeeperCustomizer finderCustomizer;
     ServiceTracker lookupTracker;
     ServiceTracker publicationTracker;
     ZooKeeper zooKeeper;
@@ -56,8 +57,9 @@
                 new PublishToZooKeeperCustomizer(bundleContext, zooKeeper));
         publicationTracker.open();
         
+        finderCustomizer = new FindInZooKeeperCustomizer(bundleContext, zooKeeper);
         lookupTracker = new ServiceTracker(bundleContext, DiscoveredServiceTracker.class.getName(),
-                new FindInZooKeeperCustomizer(bundleContext, zooKeeper));
+                finderCustomizer);
         lookupTracker.open();        
     }
 
@@ -72,8 +74,6 @@
     }
 
     public void process(WatchedEvent event) {
-        System.out.println("*** [Spring] process (dropped): " + event);
-        // TODO do we need this? The zookeeper examples do this, but I'm unsure why...
-        // finderCustomizer.process(event);
+        finderCustomizer.processGlobalEvent(event);
     }
 }

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizer.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizer.java?rev=767409&r1=767408&r2=767409&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizer.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizer.java Wed Apr 22 08:36:30 2009
@@ -18,10 +18,14 @@
   */
 package org.apache.cxf.dosgi.discovery.zookeeper;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.ZooKeeper;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -31,7 +35,8 @@
 public class FindInZooKeeperCustomizer implements ServiceTrackerCustomizer {
     private final BundleContext bundleContext;
     private final ZooKeeper zookeeper;
-    final Map<String, DataMonitor> watchers = new HashMap<String, DataMonitor>();
+    final Map<DiscoveredServiceTracker, List<DataMonitor>> watchers = 
+        new ConcurrentHashMap<DiscoveredServiceTracker, List<DataMonitor>>();
     
     public FindInZooKeeperCustomizer(BundleContext bc, ZooKeeper zk) {
         bundleContext = bc;
@@ -42,26 +47,44 @@
         Object svcObj = bundleContext.getService(sr);
 
         if (svcObj instanceof DiscoveredServiceTracker) {
-            DiscoveredServiceTracker dst = (DiscoveredServiceTracker) svcObj;
-            Collection<String> interfaces = Util.getMultiValueProperty(
-                sr.getProperty(DiscoveredServiceTracker.PROP_KEY_MATCH_CRITERIA_INTERFACES));
-
-            for (String intf : interfaces) {
-                DataMonitor dm = new DataMonitor(zookeeper, intf, dst);
-                watchers.put(intf, dm);
-            }
+            addingService(sr, (DiscoveredServiceTracker) svcObj);
         }
         return svcObj;
     }
 
-    public void modifiedService(ServiceReference arg0, Object arg1) {
-        // TODO Auto-generated method stub
-
+    private void addingService(ServiceReference sr, DiscoveredServiceTracker dst) { 
+        removedService(sr, dst);
+        
+        Collection<String> interfaces = Util.getMultiValueProperty(
+            sr.getProperty(DiscoveredServiceTracker.PROP_KEY_MATCH_CRITERIA_INTERFACES));
+
+        List<DataMonitor> dmList = new ArrayList<DataMonitor>(interfaces.size());
+        for (String intf : interfaces) {
+            DataMonitor dm = new DataMonitor(zookeeper, intf, dst);
+            dmList.add(dm);
+            dm.process();
+        }
+        watchers.put(dst, Collections.unmodifiableList(dmList));        
+    }
+    
+    public void modifiedService(ServiceReference sr, Object svcObj) {
+        if (svcObj instanceof DiscoveredServiceTracker) {
+            addingService(sr, (DiscoveredServiceTracker) svcObj);
+        }
     }
 
-    public void removedService(ServiceReference arg0, Object arg1) {
-        // TODO Auto-generated method stub
-
+    public void removedService(ServiceReference sr, Object svcObj) {
+        List<DataMonitor> oldVal = watchers.remove(svcObj);
+        if (oldVal != null) {
+            // TODO unregister any listeners directly registered with ZooKeeper
+        }
     }
 
+    public void processGlobalEvent(WatchedEvent event) {
+        for (List<DataMonitor> dmList : watchers.values()) {
+            for (DataMonitor dm : dmList) {
+                dm.process();
+            }
+        }
+    }
 }

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/PublishToZooKeeperCustomizer.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/PublishToZooKeeperCustomizer.java?rev=767409&r1=767408&r2=767409&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/PublishToZooKeeperCustomizer.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/PublishToZooKeeperCustomizer.java Wed Apr 22 08:36:30 2009
@@ -62,7 +62,7 @@
                 LOG.info("Creating ZooKeeper node: " + fullPath);
 
                 ensurePath(path);
-                Object x = zookeeper.create(fullPath, getData(sr),
+                zookeeper.create(fullPath, getData(sr),
                         Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
             }
             return obj;
@@ -78,7 +78,14 @@
     }
 
     public void removedService(ServiceReference sr, Object obj) {
-        // TODO Auto-generated method stub
+//        Collection<String> interfaces = Util.getMultiValueProperty(sr.getProperty("service.interface"));
+//        String endpoint = sr.getProperty("osgi.remote.endpoint.location").toString();
+//        String endpointKey = getKey(endpoint);
+//        
+//        for (String name : interfaces) {
+//            
+//        }
+//        zookeeper.delete(fullPath, -1);
 
     }
 

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitorTest.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitorTest.java?rev=767409&r1=767408&r2=767409&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitorTest.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DataMonitorTest.java Wed Apr 22 08:36:30 2009
@@ -154,12 +154,6 @@
     
     public void testDataMonitorNoExist() throws Exception {
         ZooKeeper zk = EasyMock.createMock(ZooKeeper.class);
-        zk.exists(
-            EasyMock.eq(Util.getZooKeeperPath(String.class.getName())),
-            EasyMock.eq(true),
-            (StatCallback) EasyMock.anyObject(), 
-            EasyMock.isNull());
-        EasyMock.expectLastCall();
         EasyMock.replay(zk);
 
         DataMonitor dm = new DataMonitor(zk, String.class.getName(), null);        
@@ -168,7 +162,7 @@
         EasyMock.verify(zk);
     }
     
-    public void testDataMonitorDefault() {
+    public void testProcess() {
         ZooKeeper zk = EasyMock.createMock(ZooKeeper.class);
         zk.exists(
             EasyMock.eq(Util.getZooKeeperPath(String.class.getName())),
@@ -178,6 +172,16 @@
         EasyMock.expectLastCall();
         EasyMock.replay(zk);
 
+        DataMonitor dm = new DataMonitor(zk, String.class.getName(), null);        
+        dm.process();
+
+        EasyMock.verify(zk);        
+    }
+
+    public void testDataMonitorDefault() {
+        ZooKeeper zk = EasyMock.createMock(ZooKeeper.class);
+        EasyMock.replay(zk);
+
         DataMonitor dm = new DataMonitor(zk, String.class.getName(), null);
         EasyMock.verify(zk);        
         

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBeanTest.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBeanTest.java?rev=767409&r1=767408&r2=767409&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBeanTest.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/DiscoveryBeanTest.java Wed Apr 22 08:36:30 2009
@@ -19,6 +19,9 @@
 package org.apache.cxf.dosgi.discovery.zookeeper;
 
 import java.io.IOException;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.List;
 
 import junit.framework.TestCase;
 
@@ -98,4 +101,38 @@
         EasyMock.expect(bc.getServiceReferences(objectClass, null))
             .andReturn(new ServiceReference [0]).anyTimes();
     }
+    
+    public void testProcessEvent() {
+        DiscoveryBean db = new DiscoveryBean();
+        
+        FindInZooKeeperCustomizer fc = new FindInZooKeeperCustomizer(null, null);
+        List<DataMonitor> l1 = new ArrayList<DataMonitor>();
+        DataMonitor dm1a = EasyMock.createMock(DataMonitor.class);
+        dm1a.process();
+        EasyMock.expectLastCall();
+        EasyMock.replay(dm1a);
+        DataMonitor dm1b = EasyMock.createMock(DataMonitor.class);
+        dm1b.process();
+        EasyMock.expectLastCall();
+        EasyMock.replay(dm1b);
+        l1.add(dm1a);
+        l1.add(dm1b);
+        
+        List<DataMonitor> l2 = new ArrayList<DataMonitor>();
+        DataMonitor dm2 = EasyMock.createMock(DataMonitor.class);
+        dm2.process();
+        EasyMock.expectLastCall();
+        EasyMock.replay(dm2);
+        l2.add(dm2);
+
+        fc.watchers.put(EasyMock.createMock(DiscoveredServiceTracker.class), l1);
+        fc.watchers.put(EasyMock.createMock(DiscoveredServiceTracker.class), l2);
+        
+        db.finderCustomizer = fc;
+        db.process(null);
+        
+        EasyMock.verify(dm1a);
+        EasyMock.verify(dm1b);
+        EasyMock.verify(dm2);
+    }
 }

Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizerTest.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizerTest.java?rev=767409&r1=767408&r2=767409&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizerTest.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/test/java/org/apache/cxf/dosgi/discovery/zookeeper/FindInZooKeeperCustomizerTest.java Wed Apr 22 08:36:30 2009
@@ -18,11 +18,14 @@
  */
 package org.apache.cxf.dosgi.discovery.zookeeper;
 
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 
 import junit.framework.TestCase;
 
 import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.AsyncCallback.StatCallback;
 import org.easymock.classextension.EasyMock;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
@@ -33,6 +36,8 @@
     public void testAddingService() {
         DiscoveredServiceTracker dst = new DiscoveredServiceTracker() {
             public void serviceChanged(DiscoveredServiceNotification dsn) {
+                // TODO are we expecting something here?
+                // maybe a separate test?
             }            
         };
         
@@ -41,25 +46,106 @@
             andReturn(Collections.singleton(String.class.getName()));
         EasyMock.replay(sr);
         
+        DiscoveredServiceTracker dst2 = new DiscoveredServiceTracker() {
+            public void serviceChanged(DiscoveredServiceNotification dsn) {
+                // TODO are we expecting something here?
+                // maybe a separate test?
+            }            
+        };
+        
+        ServiceReference sr2 = EasyMock.createMock(ServiceReference.class);
+        EasyMock.expect(sr2.getProperty(DiscoveredServiceTracker.PROP_KEY_MATCH_CRITERIA_INTERFACES)).
+            andReturn(Arrays.asList(Integer.class.getName(), Comparable.class.getName()));
+        EasyMock.replay(sr2);
+        
         BundleContext bc = EasyMock.createMock(BundleContext.class);
         EasyMock.expect(bc.getService(sr)).andReturn(dst);
+        EasyMock.expect(bc.getService(sr2)).andReturn(dst2);
         EasyMock.replay(bc);
         
-        ZooKeeper zk = EasyMock.createNiceMock(ZooKeeper.class);
+        ZooKeeper zk = EasyMock.createStrictMock(ZooKeeper.class);
+        zkExpectExists(zk, String.class.getName());
+        zkExpectExists(zk, Integer.class.getName());
+        zkExpectExists(zk, Comparable.class.getName());
+        EasyMock.expectLastCall();
         EasyMock.replay(zk);
         
         FindInZooKeeperCustomizer fc = new FindInZooKeeperCustomizer(bc, zk);
+
+        // ---------------------------------------------------------------
+        // Test the addingService APIs
+        // ---------------------------------------------------------------
         
         assertEquals("Precondition failed", 0, fc.watchers.size());
         fc.addingService(sr);
         assertEquals(1, fc.watchers.size());
         
-        String key = fc.watchers.keySet().iterator().next();
-        assertEquals(String.class.getName(), key);
-        DataMonitor dm = fc.watchers.get(key);
+        DiscoveredServiceTracker key = fc.watchers.keySet().iterator().next();
+        assertSame(dst, key);
+        List<DataMonitor> dmList = fc.watchers.get(key);
+        assertEquals(1, dmList.size());
+        DataMonitor dm = dmList.iterator().next();
         assertNotNull(dm.listener);
         assertSame(zk, dm.zookeeper);
-        assertEquals(Util.getZooKeeperPath(String.class.getName()), dm.znode);
+        assertEquals(Util.getZooKeeperPath(String.class.getName()), dm.znode);        
+
+        assertEquals("Precondition failed", 1, fc.watchers.size());
+        fc.addingService(sr2);
+        assertEquals(2, fc.watchers.size());
+        
+        assertTrue(fc.watchers.containsKey(dst));
+        assertTrue(fc.watchers.containsKey(dst2));
+        assertEquals(dmList, fc.watchers.get(dst));
+        List<DataMonitor> dmList2 = fc.watchers.get(dst2);
+        assertEquals(2, dmList2.size());
+        assertEquals(Util.getZooKeeperPath(Integer.class.getName()), dmList2.get(0).znode);
+        assertEquals(Util.getZooKeeperPath(Comparable.class.getName()), dmList2.get(1).znode);
         
+        EasyMock.verify(zk);
+
+        // ---------------------------------------------------------------
+        // Test the modifiedService APIs
+        // ---------------------------------------------------------------
+        EasyMock.reset(zk);
+        zkExpectExists(zk, List.class.getName());
+        EasyMock.replay(zk);
+        
+        EasyMock.reset(sr);
+        EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.PROP_KEY_MATCH_CRITERIA_INTERFACES)).
+            andReturn(Collections.singleton(List.class.getName()));
+        EasyMock.replay(sr);
+        
+        assertEquals("Precondition failed", 2, fc.watchers.size());
+        fc.modifiedService(sr, dst);
+        assertEquals("Precondition failed", 2, fc.watchers.size());
+        
+        assertTrue(fc.watchers.containsKey(dst));
+        assertTrue(fc.watchers.containsKey(dst2));
+        assertEquals(dmList2, fc.watchers.get(dst2));
+        List<DataMonitor> dmList3 = fc.watchers.get(dst);
+        assertEquals(1, dmList3.size());
+        assertEquals(Util.getZooKeeperPath(List.class.getName()), dmList3.iterator().next().znode);
+
+        EasyMock.verify(zk);       
+
+        // ---------------------------------------------------------------
+        // Test the removedService APIs
+        // ---------------------------------------------------------------
+        EasyMock.reset(zk);
+        EasyMock.replay(zk);
+        
+        assertEquals("Precondition failed", 2, fc.watchers.size());
+        fc.removedService(sr2, dst2);
+        assertEquals("Precondition failed", 1, fc.watchers.size());
+        
+        assertEquals(dmList3, fc.watchers.get(dst));
+        assertNull(fc.watchers.get(dst2));
+        
+        EasyMock.verify(zk);       
+    }
+
+    private void zkExpectExists(ZooKeeper zk, String className) {
+        zk.exists(EasyMock.eq(Util.getZooKeeperPath(className)), EasyMock.eq(true), 
+                (StatCallback) EasyMock.anyObject(), EasyMock.isNull());
     }
 }