summaryrefslogtreecommitdiffstats
path: root/java/sca/modules/implementation-osgi-runtime/src
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-03-17 22:53:11 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-03-17 22:53:11 +0000
commitc7a8cd70aacea40d19aad4107d3417fa4d10e2d3 (patch)
treeb469091aa7eb73f59b3487e8911865ee528dbdd1 /java/sca/modules/implementation-osgi-runtime/src
parentc3f91c976547412d0a0aae5b4351c310a44064d0 (diff)
Bring up the binding.rmi to connect two OSGi bundles
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@755436 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules/implementation-osgi-runtime/src')
-rw-r--r--java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java7
-rw-r--r--java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiTargetInvoker.java39
2 files changed, 27 insertions, 19 deletions
diff --git a/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java b/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java
index 0bcd135550..5e592ee97a 100644
--- a/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java
+++ b/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiImplementationProvider.java
@@ -57,6 +57,7 @@ public class OSGiImplementationProvider implements ImplementationProvider {
ProxyFactoryExtensionPoint proxyFactoryExtensionPoint) throws BundleException {
this.component = component;
this.proxyFactoryExtensionPoint = proxyFactoryExtensionPoint;
+ this.implementation = impl;
this.osgiBundle = impl.getBundle();
}
@@ -71,8 +72,9 @@ public class OSGiImplementationProvider implements ImplementationProvider {
JavaInterface javaInterface = (JavaInterface)interfaceContract.getInterface();
final Class<?> interfaceClass = javaInterface.getJavaClass();
- Hashtable<String, Object> targetProperties = getOSGiProperties(reference);
+ final Hashtable<String, Object> targetProperties = getOSGiProperties(reference);
targetProperties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+ targetProperties.put("sca.reference", component.getURI() + "#reference(" + ref.getName() + ")");
ProxyFactory proxyService = proxyFactoryExtensionPoint.getInterfaceProxyFactory();
if (!interfaceClass.isInterface()) {
@@ -81,12 +83,11 @@ public class OSGiImplementationProvider implements ImplementationProvider {
for (RuntimeWire wire : reference.getRuntimeWires()) {
final Object proxy = proxyService.createProxy(interfaceClass, wire);
- final Hashtable<String, Object> finalTargetProperties = targetProperties;
AccessController.doPrivileged(new PrivilegedAction<ServiceRegistration>() {
public ServiceRegistration run() {
return osgiBundle.getBundleContext().registerService(interfaceClass.getName(),
proxy,
- finalTargetProperties);
+ targetProperties);
}
});
}
diff --git a/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiTargetInvoker.java b/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiTargetInvoker.java
index 6268b59142..52313a84e7 100644
--- a/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiTargetInvoker.java
+++ b/java/sca/modules/implementation-osgi-runtime/src/main/java/org/apache/tuscany/sca/implementation/osgi/runtime/OSGiTargetInvoker.java
@@ -40,15 +40,9 @@ import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
/**
- * Java->OSGi references use OSGiTargetInvoker to call methods from OSGi bundles
- * OSGi->Java references use JDKProxyService and invocation handler and do not use this class
- * OSGi->OSGi references go through OSGi reference mechanisms when a proxy is not used
- * When a proxy is used, this invoker is used to call methods from OSGi bundles
- * A proxy is used for OSGi->OSGi if
- * 1) target reference properties are specified OR
- * 2) there are one or more non-blocking methods in the target interface OR
- * 3) scope is not COMPOSITE
- *
+ * The Invoker looks up the corresponding OSGi service from the OSGi service registry
+ * and delegate the call to it.
+ *
* @version $Rev$ $Date$
*/
public class OSGiTargetInvoker<T> implements Invoker {
@@ -81,9 +75,10 @@ public class OSGiTargetInvoker<T> implements Invoker {
JavaInterface javaInterface = (JavaInterface)op.getInterface();
// String filter = getOSGiFilter(provider.getOSGiProperties(service));
// FIXME: What is the filter?
- String filter = "(sca.service=" + component.getURI() + "#service-name\\(" + service.getName() + "\\))";
- ServiceReference[] refs = bundleContext.getServiceReferences(javaInterface.getName(), filter);
- Object instance = bundleContext.getService(refs[0]);
+ String filter = "(!(sca.reference=*))";
+ // "(sca.service=" + component.getURI() + "#service-name\\(" + service.getName() + "\\))";
+ ServiceReference ref = bundleContext.getServiceReferences(javaInterface.getName(), filter)[0];
+ Object instance = bundleContext.getService(ref);
Method m = findMethod(instance.getClass(), operation);
Object ret = invokeMethod(instance, m, msg);
@@ -132,16 +127,28 @@ public class OSGiTargetInvoker<T> implements Invoker {
if (props != null && props.size() > 0) {
int propCount = 0;
for (String propName : props.keySet()) {
- if (propName.equals("service.pid"))
+ if (propName.equals("service.pid")) {
continue;
- filter = filter + "(" + propName + "=" + props.get(propName) + ")";
+ }
+ String value = String.valueOf(props.get(propName));
+ StringBuffer buf = new StringBuffer();
+ for (char c : value.toCharArray()) {
+ if (c == '(' || c == ')') {
+ buf.append("\\" + c);
+ } else {
+ buf.append(c);
+ }
+ }
+ filter = filter + "(" + propName + "=" + buf.toString() + ")";
propCount++;
}
- if (propCount > 1)
+ if (propCount > 1) {
filter = "(&" + filter + ")";
- } else
+ }
+ } else {
filter = null;
+ }
return filter;
}