diff options
author | slewis | 2013-02-07 01:51:46 +0000 |
---|---|---|
committer | slewis | 2013-02-07 01:51:46 +0000 |
commit | 3f187375c0349b92d1848669c7b8a0e3fee569cc (patch) | |
tree | 2489eff346f0e5c7d3b6cbe4f4a4134b920579c5 | |
parent | ceedf34d784eb1ca757db255d34fad9cada8a218 (diff) | |
download | org.eclipse.ecf-3f187375c0349b92d1848669c7b8a0e3fee569cc.tar.gz org.eclipse.ecf-3f187375c0349b92d1848669c7b8a0e3fee569cc.tar.xz org.eclipse.ecf-3f187375c0349b92d1848669c7b8a0e3fee569cc.zip |
Added IRemoteServiceProxyCreator for bug
https://bugs.eclipse.org/bugs/show_bug.cgi?id=400164
4 files changed, 54 insertions, 6 deletions
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice/META-INF/MANIFEST.MF b/framework/bundles/org.eclipse.ecf.remoteservice/META-INF/MANIFEST.MF index 157203800..9c285918e 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice/META-INF/MANIFEST.MF +++ b/framework/bundles/org.eclipse.ecf.remoteservice/META-INF/MANIFEST.MF @@ -2,14 +2,14 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin.name Bundle-SymbolicName: org.eclipse.ecf.remoteservice;singleton:=true -Bundle-Version: 6.0.200.qualifier +Bundle-Version: 7.0.0.qualifier Bundle-Activator: org.eclipse.ecf.internal.remoteservice.Activator Bundle-Vendor: %plugin.provider Bundle-Localization: plugin Eclipse-LazyStart: true Export-Package: org.eclipse.ecf.internal.remoteservice;x-internal:=true, - org.eclipse.ecf.remoteservice;version="6.0.0", - org.eclipse.ecf.remoteservice.client;version="6.0.0", + org.eclipse.ecf.remoteservice;version="7.0.0", + org.eclipse.ecf.remoteservice.client;version="7.0.0", org.eclipse.ecf.remoteservice.events;version="6.0.0", org.eclipse.ecf.remoteservice.util;version="6.0.0", org.eclipse.ecf.remoteservice.util.tracker;version="6.0.0" diff --git a/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/internal/remoteservice/Activator.java b/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/internal/remoteservice/Activator.java index ffa8572cc..a3c75b63d 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/internal/remoteservice/Activator.java +++ b/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/internal/remoteservice/Activator.java @@ -11,11 +11,15 @@ package org.eclipse.ecf.internal.remoteservice; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Proxy; +import java.util.Dictionary; +import java.util.Hashtable; import org.eclipse.core.runtime.IStatus; import org.eclipse.ecf.core.util.LogHelper; import org.eclipse.ecf.core.util.SystemLogService; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; +import org.eclipse.ecf.remoteservice.IRemoteServiceProxyCreator; +import org.osgi.framework.*; import org.osgi.service.log.LogService; import org.osgi.util.tracker.ServiceTracker; @@ -36,6 +40,8 @@ public class Activator implements BundleActivator { private LogService logService = null; + private ServiceRegistration remoteServiceProxyCreator; + /** * The constructor */ @@ -55,6 +61,14 @@ public class Activator implements BundleActivator { public void start(BundleContext c) throws Exception { // nothing to do this.context = c; + // Register default IRemoteServiceProxyCreator + Dictionary props = new Hashtable(); + props.put(Constants.SERVICE_RANKING, Integer.MIN_VALUE); + this.remoteServiceProxyCreator = this.context.registerService(new String[] {IRemoteServiceProxyCreator.class.getName()}, new IRemoteServiceProxyCreator() { + public Object createProxy(ClassLoader classloader, Class[] interfaces, InvocationHandler handler) { + return Proxy.newProxyInstance(classloader, interfaces, handler); + } + }, props); } /* @@ -63,6 +77,10 @@ public class Activator implements BundleActivator { * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext c) throws Exception { + if (this.remoteServiceProxyCreator != null) { + this.remoteServiceProxyCreator.unregister(); + this.remoteServiceProxyCreator = null; + } if (logServiceTracker != null) { logServiceTracker.close(); logServiceTracker = null; diff --git a/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/remoteservice/AbstractRemoteService.java b/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/remoteservice/AbstractRemoteService.java index 202ce1660..0192f181a 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/remoteservice/AbstractRemoteService.java +++ b/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/remoteservice/AbstractRemoteService.java @@ -19,6 +19,7 @@ import org.eclipse.equinox.concurrent.future.IFuture; import org.eclipse.equinox.concurrent.future.IProgressRunnable; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceException; +import org.osgi.util.tracker.ServiceTracker; /** * Abstract remote service implementation. Clients may subclass to avoid re-implementing @@ -126,7 +127,10 @@ public abstract class AbstractRemoteService implements IRemoteService, Invocatio } } - class ProxyClassLoader extends ClassLoader { + /** + * @since 7.0 + */ + public class ProxyClassLoader extends ClassLoader { private ClassLoader cl; @@ -153,9 +157,23 @@ public abstract class AbstractRemoteService implements IRemoteService, Invocatio } /** + * @since 7.0 + */ + protected IRemoteServiceProxyCreator getRemoteServiceProxyCreator() { + ServiceTracker st = new ServiceTracker(Activator.getDefault().getContext(), IRemoteServiceProxyCreator.class, null); + st.open(); + IRemoteServiceProxyCreator result = (IRemoteServiceProxyCreator) st.getService(); + st.close(); + return result; + } + + /** * @since 6.0 */ protected Object createProxy(ClassLoader cl, Class[] classes) { + IRemoteServiceProxyCreator proxyCreator = getRemoteServiceProxyCreator(); + if (proxyCreator != null) + return proxyCreator.createProxy(new ProxyClassLoader(cl), classes, this); return Proxy.newProxyInstance(new ProxyClassLoader(cl), classes, this); } diff --git a/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/remoteservice/IRemoteServiceProxyCreator.java b/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/remoteservice/IRemoteServiceProxyCreator.java new file mode 100644 index 000000000..24d7ccbd4 --- /dev/null +++ b/framework/bundles/org.eclipse.ecf.remoteservice/src/org/eclipse/ecf/remoteservice/IRemoteServiceProxyCreator.java @@ -0,0 +1,12 @@ +package org.eclipse.ecf.remoteservice; + +import java.lang.reflect.InvocationHandler; + +/** + * @since 7.0 + */ +public interface IRemoteServiceProxyCreator { + + public Object createProxy(ClassLoader classloader, Class[] interfaces, InvocationHandler handler); + +} |