You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by eg...@apache.org on 2008/10/24 17:56:44 UTC
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
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);