cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From egl...@apache.org
Subject svn commit: r707662 - in /cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks: AbstractClientHook.java AbstractHook.java CxfListenerHook.java ServiceHookUtils.java
Date Fri, 24 Oct 2008 15:56:44 GMT
Author: eglynn
Date: Fri Oct 24 08:56:44 2008
New Revision: 707662

URL: http://svn.apache.org/viewvc?rev=707662&view=rev
Log:
[dOSGI] Use asynchronous Discovery service lookup when no reference available synchronously

Modified:
    cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractClientHook.java
    cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractHook.java
    cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/CxfListenerHook.java
    cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/ServiceHookUtils.java

Modified: cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractClientHook.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractClientHook.java?rev=707662&r1=707661&r2=707662&view=diff
==============================================================================
--- cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractClientHook.java
(original)
+++ cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractClientHook.java
Fri Oct 24 08:56:44 2008
@@ -19,6 +19,7 @@
 package org.apache.cxf.dosgi.dsw.hooks;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Hashtable;
@@ -35,6 +36,7 @@
 import org.osgi.framework.Filter;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.discovery.ServiceEndpointDescription;
+import org.osgi.service.discovery.ServiceListener;
 
 public class AbstractClientHook extends AbstractHook {
     
@@ -44,15 +46,24 @@
         super(bc, dp);
     }
     
-    protected List<ServiceEndpointDescription> processClientDescriptions(BundleContext
requestingContext, 
-                                                            String interfaceName, 
-                                                            String filter, 
-                                                            boolean matchAll, 
-                                                            boolean allServices) {
-        List<ServiceEndpointDescription> sds = 
-            getServiceDescriptions(requestingContext, interfaceName, filter, false);
-        List<ServiceEndpointDescription> actualSds = new ArrayList<ServiceEndpointDescription>(sds.size());

-        
+    protected void processClientDescriptions(BundleContext requestingContext, 
+                                             String interfaceName, 
+                                             String filter, 
+                                             boolean matchAll, 
+                                             boolean allServices) {
+    	processServiceDescriptions(getServiceDescriptions(requestingContext, interfaceName,
filter, false),
+    			                   requestingContext, 
+                                   interfaceName, 
+                                   filter, 
+                                   allServices);        
+    }
+    
+    protected void processServiceDescriptions(List<ServiceEndpointDescription> sds,
+    		                                  BundleContext requestingContext, 
+                                              String interfaceName, 
+                                              String filter, 
+                                              boolean allServices) {
+
         for (ServiceEndpointDescription sd  : sds) {
             
             
@@ -95,14 +106,14 @@
                         }
                         
                     }
-                    actualSds.add(sd);
+                    //actualSds.add(sd);
                 }
             } catch (ClassNotFoundException ex) {
                 LOG.warning("No class can be found for " + interfaceName);
                 continue;
             }
         }
-        return actualSds;
+        //return actualSds;
     }
     
     @SuppressWarnings("unchecked")
@@ -116,8 +127,10 @@
     
     @SuppressWarnings("unchecked")
     protected List<ServiceEndpointDescription> getServiceDescriptions(
-        BundleContext context, String interfaceName, String filterValue, 
-        boolean matchAll) {
+        final BundleContext  context, 
+        final String interfaceName, 
+        final String filterValue, 
+        final boolean matchAll) {
         
         // if bundle has remote-services.xml attached then those metadata takes precedence
         List<ServiceEndpointDescription> sds = new ArrayList<ServiceEndpointDescription>();
@@ -131,7 +144,58 @@
         // found some SDs as it may find more suitable SDs ?
         if (sds.isEmpty()) {
             // try discovery service
-            sds.addAll(getFromDiscoveryService(interfaceName, filterValue));
+        	
+        	// REVISIT Discovery RI will change soon to use standard "objectClass" 
+        	// property key, instead of "interface-name". At that point we can
+        	// just reuse the given filter instead of constructing a modified one. Also
+        	// we currently throw away any filter predicates unrelated to the interface
+        	// name, which is clearly inappropriate.
+        	
+			String modifiedFilter = 
+				"(" + ServiceEndpointDescription.PROP_KEY_INTERFACE_NAME 
+				+ "=" + interfaceName + ")";
+
+        	Collection<ServiceEndpointDescription> discovered = 
+        		getFromDiscoveryService(interfaceName, modifiedFilter);
+        	if (discovered.size() != 0) {
+				LOG.info("synchronous lookup discovered " + discovered.size()
+						 + " references for interface: " + interfaceName);
+                sds.addAll(discovered);
+        	} else {
+        		LOG.info("nothing discovered initially for interface: " 
+						 + interfaceName +  ", fallback to async lookup");
+				if (filterValue != null && filterValue.length() > 0) {
+					LOG.fine("installing service listener for: " + modifiedFilter);
+	        	    listenToDiscoveryService(
+	        	        new ServiceListener() {
+							public void serviceAvailable(ServiceEndpointDescription sd) {
+								LOG.info("received serviceAvailable callback: " 
+										 + sd.getProperties());
+							    List<ServiceEndpointDescription> notified = 
+							    	new ArrayList<ServiceEndpointDescription>();
+							    notified.add(sd);
+							    processServiceDescriptions(notified,
+							    		                   context,
+							    		                   interfaceName,
+							    		                   filterValue,
+							    		                   matchAll);
+								LOG.fine("removing service listener : " + this);
+							    unlistenToDiscoveryService(this);
+							}
+							public void serviceModified(ServiceEndpointDescription oldSD,
+									                    ServiceEndpointDescription newSD) {
+								// we don't currently use this notification, but we could do
+								// so to allow to support transparent service re-location 
+							}
+	
+							public void serviceUnavailable(ServiceEndpointDescription sd) {
+						        // we don't currently use this notification, but we could do
+								// so to allow to drive transparent fail-over
+							}	        	
+	        	        },
+	        	        modifiedFilter);
+				}
+        	}
         }
         
         // do it just in case too for the moment

Modified: cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractHook.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractHook.java?rev=707662&r1=707661&r2=707662&view=diff
==============================================================================
--- cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractHook.java
(original)
+++ cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/AbstractHook.java
Fri Oct 24 08:56:44 2008
@@ -33,6 +33,7 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.service.discovery.Discovery;
 import org.osgi.service.discovery.ServiceEndpointDescription;
+import org.osgi.service.discovery.ServiceListener;
 
 public abstract class AbstractHook {
     private final CxfDistributionProvider distributionProvider;
@@ -87,7 +88,6 @@
         return props;
     }
     
-    @SuppressWarnings("unchecked")
     protected Collection<ServiceEndpointDescription> getFromDiscoveryService(
         String interfaceName, String filterValue) {
        
@@ -113,6 +113,37 @@
         return Collections.emptyList();
     }
     
+    protected Collection<ServiceEndpointDescription> listenToDiscoveryService(
+    		ServiceListener listener, String filterValue) {
+              
+        OsgiService<Discovery> pair = OsgiUtils.getOsgiService(getContext(), Discovery.class);
+        if (pair != null) {
+            try {
+                pair.getService().addServiceListener(listener, filterValue);
+            } finally {
+                pair.ungetService(getContext());
+            }
+        }
+       
+        return Collections.emptyList();
+    }
+
+    protected Collection<ServiceEndpointDescription> unlistenToDiscoveryService(
+    		ServiceListener listener) {
+              
+        OsgiService<Discovery> pair = OsgiUtils.getOsgiService(getContext(), Discovery.class);
+        if (pair != null) {
+            try {
+                pair.getService().removeServiceListener(listener);
+            } finally {
+                pair.ungetService(getContext());
+            }
+        }
+       
+        return Collections.emptyList();
+    }
+
+    
     protected String getIdentificationProperty() {
         Bundle b = bc.getBundle();
         Object name = 

Modified: cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/CxfListenerHook.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/CxfListenerHook.java?rev=707662&r1=707661&r2=707662&view=diff
==============================================================================
--- cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/CxfListenerHook.java
(original)
+++ cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/CxfListenerHook.java
Fri Oct 24 08:56:44 2008
@@ -43,6 +43,10 @@
     static {
         SYSTEM_PACKAGES = new HashSet<String>();
         SYSTEM_PACKAGES.add("org.osgi.service");
+        SYSTEM_PACKAGES.add("org.apache.felix");
+        SYSTEM_PACKAGES.add("org.ops4j.pax.logging");
+        SYSTEM_PACKAGES.add("ch.ethz.iks.slp");
+        SYSTEM_PACKAGES.add("org.ungoverned.osgi.service");
     }
     
     private ThreadLocal<Boolean> findCallsInProgress

Modified: cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/ServiceHookUtils.java
URL: http://svn.apache.org/viewvc/cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/ServiceHookUtils.java?rev=707662&r1=707661&r2=707662&view=diff
==============================================================================
--- cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/ServiceHookUtils.java
(original)
+++ cxf/sandbox/dosgi/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/hooks/ServiceHookUtils.java
Fri Oct 24 08:56:44 2008
@@ -54,6 +54,10 @@
                 Map<String, String> javaInterfaces = getJavaInterfaceVersionMap(sd);
                 Map<String, String> endpointInterfaces = getJavaInterfaceEndpointInterfaceMap(sd);
                 Map<String, Object> properties = getPropertiesMap(sd);
+                LOG.info("publish java interfaces: " + javaInterfaces
+                		 + ",\nendpoint interfaces: " + endpointInterfaces
+                		 + ",\nproperties: " + properties);
+                
                 sdPublished = pair.getService().publishService(javaInterfaces,
                                                                endpointInterfaces,
                                                                properties);



Mime
View raw message