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/05/28 11:29:39 UTC
svn commit: r779506 - 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: Thu May 28 09:29:39 2009
New Revision: 779506
URL: http://svn.apache.org/viewvc?rev=779506&view=rev
Log:
Support for filters in Discovery
Modified:
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/Util.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/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=779506&r1=779505&r2=779506&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 Thu May 28 09:29:39 2009
@@ -21,8 +21,10 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.zookeeper.WatchedEvent;
@@ -55,8 +57,10 @@
private void addingService(ServiceReference sr, DiscoveredServiceTracker dst) {
removedService(sr, dst);
- Collection<String> interfaces = Util.getMultiValueProperty(
- sr.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA));
+ Set<String> interfaces = new HashSet<String>(Util.getMultiValueProperty(
+ sr.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA)));
+ interfaces.addAll(getInterfacesFromFilter(Util.getMultiValueProperty(
+ sr.getProperty(DiscoveredServiceTracker.FILTER_MATCH_CRITERIA))));
List<InterfaceMonitor> dmList = new ArrayList<InterfaceMonitor>(interfaces.size());
for (String intf : interfaces) {
@@ -67,6 +71,35 @@
watchers.put(dst, Collections.unmodifiableList(dmList));
}
+ static Collection<String> getInterfacesFromFilter(Collection<String> filters) {
+ String oc = "objectclass";
+
+ Set<String> interfaces = new HashSet<String>();
+ for (String filter : filters) {
+ String lcFilter = filter.toLowerCase();
+ int idx = lcFilter.indexOf(oc);
+ if (idx < 0) {
+ continue;
+ }
+
+ String s1 = filter.substring(idx + oc.length()).trim();
+ if (!s1.startsWith("=")) {
+ continue;
+ }
+ String s2 = s1.substring(1).trim();
+
+ int idx2 = 0;
+ while ((s2.charAt(idx2) == '.' || Character.isJavaIdentifierPart(s2.charAt(idx2))) &&
+ idx2 < s2.length()) {
+ idx2++;
+ }
+
+ interfaces.add(s2.substring(0, idx2));
+ }
+
+ return interfaces;
+ }
+
public void modifiedService(ServiceReference sr, Object svcObj) {
if (svcObj instanceof DiscoveredServiceTracker) {
addingService(sr, (DiscoveredServiceTracker) svcObj);
Modified: cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Util.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Util.java?rev=779506&r1=779505&r2=779506&view=diff
==============================================================================
--- cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Util.java (original)
+++ cxf/dosgi/trunk/discovery/distributed/cxf-discovery/src/main/java/org/apache/cxf/dosgi/discovery/zookeeper/Util.java Thu May 28 09:29:39 2009
@@ -31,6 +31,8 @@
return (Collection<String>) property;
} else if (property instanceof String []) {
return Arrays.asList((String []) property);
+ } else if (property == null) {
+ return Collections.emptySet();
} else {
return Collections.singleton(property.toString());
}
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=779506&r1=779505&r2=779506&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 Thu May 28 09:29:39 2009
@@ -20,7 +20,9 @@
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import junit.framework.TestCase;
@@ -35,29 +37,27 @@
import org.osgi.service.discovery.DiscoveredServiceTracker;
public class FindInZooKeeperCustomizerTest extends TestCase {
- public void testAddingService() {
+ public void testAddingServiceInterface() {
DiscoveredServiceTracker dst = new DiscoveredServiceTracker() {
- public void serviceChanged(DiscoveredServiceNotification dsn) {
- // TODO are we expecting something here?
- // maybe a separate test?
- }
+ public void serviceChanged(DiscoveredServiceNotification dsn) {}
};
ServiceReference sr = EasyMock.createMock(ServiceReference.class);
EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA)).
andReturn(Collections.singleton(String.class.getName()));
+ EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.FILTER_MATCH_CRITERIA)).
+ andReturn(null);
EasyMock.replay(sr);
DiscoveredServiceTracker dst2 = new DiscoveredServiceTracker() {
- public void serviceChanged(DiscoveredServiceNotification dsn) {
- // TODO are we expecting something here?
- // maybe a separate test?
- }
+ public void serviceChanged(DiscoveredServiceNotification dsn) {}
};
ServiceReference sr2 = EasyMock.createMock(ServiceReference.class);
EasyMock.expect(sr2.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA)).
andReturn(Arrays.asList(Integer.class.getName(), Comparable.class.getName()));
+ EasyMock.expect(sr2.getProperty(DiscoveredServiceTracker.FILTER_MATCH_CRITERIA)).
+ andReturn(null);
EasyMock.replay(sr2);
BundleContext bc = EasyMock.createMock(BundleContext.class);
@@ -65,7 +65,7 @@
EasyMock.expect(bc.getService(sr2)).andReturn(dst2);
EasyMock.replay(bc);
- ZooKeeper zk = EasyMock.createStrictMock(ZooKeeper.class);
+ ZooKeeper zk = EasyMock.createMock(ZooKeeper.class);
zkExpectExists(zk, String.class.getName());
zkExpectExists(zk, Integer.class.getName());
zkExpectExists(zk, Comparable.class.getName());
@@ -100,8 +100,15 @@
assertEquals(dmList, fc.watchers.get(dst));
List<InterfaceMonitor> 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);
+
+ Set<String> actual = new HashSet<String>();
+ for (InterfaceMonitor im : dmList2) {
+ actual.add(im.znode);
+ }
+ Set<String> expected = new HashSet<String>(Arrays.asList(
+ Util.getZooKeeperPath(Integer.class.getName()),
+ Util.getZooKeeperPath(Comparable.class.getName())));
+ assertEquals(expected, actual);
EasyMock.verify(zk);
@@ -115,6 +122,129 @@
EasyMock.reset(sr);
EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA)).
andReturn(Collections.singleton(List.class.getName()));
+ EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.FILTER_MATCH_CRITERIA)).
+ andReturn(null);
+ 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<InterfaceMonitor> 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);
+ }
+
+ public void testAddingServiceFilter() {
+ DiscoveredServiceTracker dst = new DiscoveredServiceTracker() {
+ public void serviceChanged(DiscoveredServiceNotification dsn) {}
+ };
+
+ ServiceReference sr = EasyMock.createMock(ServiceReference.class);
+ EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA)).
+ andReturn(null);
+ Set<String> stringFilter = Collections.singleton("(objectClass=java.lang.String)");
+ EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.FILTER_MATCH_CRITERIA)).
+ andReturn(stringFilter);
+ EasyMock.replay(sr);
+
+ DiscoveredServiceTracker dst2 = new DiscoveredServiceTracker() {
+ public void serviceChanged(DiscoveredServiceNotification dsn) {}
+ };
+
+ ServiceReference sr2 = EasyMock.createMock(ServiceReference.class);
+ EasyMock.expect(sr2.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA)).
+ andReturn(null);
+ List<String> combinedFilter =
+ Arrays.asList("(objectClass=java.lang.Integer)","(objectClass=java.lang.Comparable)");
+ EasyMock.expect(sr2.getProperty(DiscoveredServiceTracker.FILTER_MATCH_CRITERIA)).
+ andReturn(combinedFilter);
+ 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.createMock(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());
+
+ DiscoveredServiceTracker key = fc.watchers.keySet().iterator().next();
+ assertSame(dst, key);
+ List<InterfaceMonitor> dmList = fc.watchers.get(key);
+ assertEquals(1, dmList.size());
+ InterfaceMonitor dm = dmList.iterator().next();
+ assertNotNull(dm.listener);
+ assertSame(zk, dm.zookeeper);
+ 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<InterfaceMonitor> dmList2 = fc.watchers.get(dst2);
+ assertEquals(2, dmList2.size());
+ Set<String> actual = new HashSet<String>();
+ for (InterfaceMonitor im : dmList2) {
+ actual.add(im.znode);
+ }
+ Set<String> expected = new HashSet<String>(Arrays.asList(
+ Util.getZooKeeperPath(Integer.class.getName()),
+ Util.getZooKeeperPath(Comparable.class.getName())));
+ assertEquals(expected, actual);
+
+ EasyMock.verify(zk);
+
+ // ---------------------------------------------------------------
+ // Test the modifiedService APIs
+ // ---------------------------------------------------------------
+ EasyMock.reset(zk);
+ zkExpectExists(zk, List.class.getName());
+ EasyMock.replay(zk);
+
+ EasyMock.reset(sr);
+ Set<String> listFilter = Collections.singleton("(objectClass=java.util.List)");
+ EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.INTERFACE_MATCH_CRITERIA)).
+ andReturn(null);
+ EasyMock.expect(sr.getProperty(DiscoveredServiceTracker.FILTER_MATCH_CRITERIA)).
+ andReturn(listFilter);
EasyMock.replay(sr);
assertEquals("Precondition failed", 2, fc.watchers.size());
@@ -145,6 +275,27 @@
EasyMock.verify(zk);
}
+
+ public void testGetInterfacesFromFilter() {
+ testGetInterfacesFromFilter("ojectClass=org.apache_2.Some$FunnyClass",
+ "org.apache_2.Some$FunnyClass");
+ testGetInterfacesFromFilter("(&(a=b)(objectClass = org.acme.Q)",
+ "org.acme.Q");
+ testGetInterfacesFromFilter("(&(objectClassIdentifier=b)(objectClass = org.acme.Q)",
+ "org.acme.Q");
+ testGetInterfacesFromFilter("(|(OBJECTCLASS= X )(objectclass = Y)",
+ "X", "Y");
+ testGetInterfacesFromFilter(new String [] {"(objectClass=X)", "(objectClass=Y)"},
+ "X", "Y");
+ }
+
+ private void testGetInterfacesFromFilter(String filter, String ... interfaces) {
+ testGetInterfacesFromFilter(new String [] {filter}, interfaces);
+ }
+
+ private void testGetInterfacesFromFilter(String [] filters, String ... interfaces) {
+ FindInZooKeeperCustomizer.getInterfacesFromFilter(Arrays.asList(filters));
+ }
private void zkExpectExists(ZooKeeper zk, String className) {
zk.exists(EasyMock.eq(Util.getZooKeeperPath(className)),