diff options
Diffstat (limited to 'framework/bundles')
5 files changed, 116 insertions, 20 deletions
diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/META-INF/MANIFEST.MF b/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/META-INF/MANIFEST.MF index 13189fc78..7b11af8c4 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/META-INF/MANIFEST.MF +++ b/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/META-INF/MANIFEST.MF @@ -11,5 +11,4 @@ Bundle-Localization: bundle Export-Package: org.eclipse.ecf.remoteservice.asyncproxy;version="2.1.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy -Require-Bundle: org.eclipse.osgi.util;bundle-version="3.3.100";resolution:=optional, - org.eclipse.equinox.common +Require-Bundle: org.eclipse.equinox.common diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java b/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java index 215b75f52..458aa7fbc 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java +++ b/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy.j8/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java @@ -17,12 +17,35 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.equinox.concurrent.future.IFuture; -import org.eclipse.equinox.concurrent.future.TimeoutException; +import org.eclipse.equinox.concurrent.future.IProgressRunnable; +import org.eclipse.equinox.concurrent.future.ImmediateExecutor; +import org.osgi.util.promise.Deferred; import org.osgi.util.promise.Promise; public class AsyncReturnUtil { + private static IFuture<?> createIFuture(final Object returnObject) { + return new ImmediateExecutor().execute(new IProgressRunnable<Object>() { + public Object run(IProgressMonitor monitor) throws Exception { + return returnObject; + } + }, null); + } + + private static Promise<?> createPromise(final Object returnObject) { + Deferred<Object> deferred = new Deferred<Object>(); + deferred.resolve(returnObject); + return deferred.getPromise(); + } + + private static CompletableFuture<?> createCompletableFuture(final Object returnObject) { + CompletableFuture<Object> cf = new CompletableFuture<Object>(); + cf.complete(returnObject); + return cf; + } + public static boolean isAsyncType(Class<?> type) { return (type == null) ? false : (CompletableFuture.class.isAssignableFrom(type) || CompletionStage.class.isAssignableFrom(type) @@ -30,19 +53,51 @@ public class AsyncReturnUtil { || Promise.class.isAssignableFrom(type)); } - @SuppressWarnings("rawtypes") - public static Object asyncReturn(Object returnObject, Class<?> asyncReturnType, long timeout) throws TimeoutException, - InterruptedException, ExecutionException, java.util.concurrent.TimeoutException, InvocationTargetException { + public static boolean isAsyncType(String className) { + return (className == null) ? false + : (CompletableFuture.class.getName().equals(className) + || CompletionStage.class.getName().equals(className) || Future.class.getName().equals(className) + || IFuture.class.getName().equals(className) || Promise.class.getName().equals(className)); + } + + public static Object convertAsyncToReturn(Object returnObject, Class<?> asyncReturnType, long timeout) + throws InterruptedException, ExecutionException, java.util.concurrent.TimeoutException, + InvocationTargetException { if (returnObject == null) return null; else if (asyncReturnType.isAssignableFrom(Future.class)) - return ((Future) returnObject).get(timeout, TimeUnit.MILLISECONDS); + return ((Future<?>) returnObject).get(timeout, TimeUnit.MILLISECONDS); else if (asyncReturnType.isAssignableFrom(CompletionStage.class)) - return ((CompletionStage) returnObject).toCompletableFuture().get(timeout, TimeUnit.MILLISECONDS); + return ((CompletionStage<?>) returnObject).toCompletableFuture().get(timeout, TimeUnit.MILLISECONDS); else if (asyncReturnType.isAssignableFrom(IFuture.class)) - return ((IFuture) returnObject).get(); + return ((IFuture<?>) returnObject).get(); else if (asyncReturnType.isAssignableFrom(Promise.class)) - return ((Promise) returnObject).getValue(); + return ((Promise<?>) returnObject).getValue(); + return null; + } + + public static Object convertReturnToAsync(Object returnObject, Class<?> returnType) { + if (IFuture.class.isAssignableFrom(returnType)) { + return createIFuture(returnObject); + } else if (Promise.class.isAssignableFrom(returnType)) { + return createPromise(returnObject); + } else if (CompletableFuture.class.isAssignableFrom(returnType) + || CompletionStage.class.isAssignableFrom(returnType) || Future.class.isAssignableFrom(returnType)) { + return createCompletableFuture(returnObject); + } + return null; + } + + public static Object convertReturnToAsync(Object returnObject, String returnType) { + if (IFuture.class.getName().equals(returnType)) { + return createIFuture(returnObject); + } else if (Promise.class.getName().equals(returnType)) { + return createPromise(returnObject); + } else if (CompletableFuture.class.getName().equals(returnType) + || CompletionStage.class.getName().equals(returnType) || Future.class.getName().equals(returnType)) { + return createCompletableFuture(returnObject); + } return returnObject; } + } diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java b/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java index 6255dbf38..21efa8427 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java +++ b/framework/bundles/org.eclipse.ecf.remoteservice.asyncproxy/src/org/eclipse/ecf/remoteservice/asyncproxy/AsyncReturnUtil.java @@ -11,29 +11,71 @@ package org.eclipse.ecf.remoteservice.asyncproxy; import java.lang.reflect.InvocationTargetException; +import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.equinox.concurrent.future.IFuture; -import org.eclipse.equinox.concurrent.future.TimeoutException; +import org.eclipse.equinox.concurrent.future.IProgressRunnable; +import org.eclipse.equinox.concurrent.future.ImmediateExecutor; public class AsyncReturnUtil { - public static boolean isAsyncType(Class<?> type) { + public static boolean isAsyncType(final Class<?> type) { return (type == null) ? false : (Future.class.isAssignableFrom(type) || IFuture.class.isAssignableFrom(type)); } - @SuppressWarnings("rawtypes") - public static Object asyncReturn(Object returnObject, Class<?> asyncReturnType, long timeout) throws TimeoutException, - InterruptedException, ExecutionException, java.util.concurrent.TimeoutException, InvocationTargetException { + public static boolean isAsyncType(String className) { + return (className == null) ? false + : (Future.class.getName().equals(className) + || IFuture.class.getName().equals(className)); + } + + public static Object convertAsyncToReturn(final Object returnObject, final Class<?> asyncReturnType, long timeout) + throws InterruptedException, ExecutionException, java.util.concurrent.TimeoutException, + InvocationTargetException { if (returnObject == null) return null; - else if (asyncReturnType.isAssignableFrom(IFuture.class)) - return ((IFuture) returnObject).get(); else if (asyncReturnType.isAssignableFrom(Future.class)) - return ((Future) returnObject).get(timeout,TimeUnit.MILLISECONDS); - return returnObject; + return ((Future<?>) returnObject).get(timeout, TimeUnit.MILLISECONDS); + else if (asyncReturnType.isAssignableFrom(IFuture.class)) + return ((IFuture<?>) returnObject).get(); + return null; + } + + private static IFuture<?> createIFuture(final Object returnObject) { + return new ImmediateExecutor().execute(new IProgressRunnable<Object>() { + public Object run(IProgressMonitor monitor) throws Exception { + return returnObject; + } + }, null); + } + + private static Future<?> createFuture(final Object returnObject) { + return Executors.newSingleThreadExecutor().submit(new Callable<Object>() { + public Object call() throws Exception { + return returnObject; + }}); + } + + public static Object convertReturnToAsync(final Object returnObject, final Class<?> returnType) { + if (IFuture.class.isAssignableFrom(returnType)) + return createIFuture(returnObject); + else if (Future.class.isAssignableFrom(returnType)) + return createFuture(returnObject); + return null; + } + + public static Object convertReturnToAsync(final Object returnObject, final String returnType) { + if (IFuture.class.getName().equals(returnType)) { + return createIFuture(returnObject); + } else if (Future.class.getName().equals(returnType)) { + return createFuture(returnObject); + } + return null; } } diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.rpc/META-INF/MANIFEST.MF b/framework/bundles/org.eclipse.ecf.remoteservice.rpc/META-INF/MANIFEST.MF index 36b8e0d40..652352a89 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice.rpc/META-INF/MANIFEST.MF +++ b/framework/bundles/org.eclipse.ecf.remoteservice.rpc/META-INF/MANIFEST.MF @@ -31,6 +31,7 @@ Import-Package: javax.servlet;version="2.6.0", org.eclipse.ecf.remoteservice;version="6.0.0", org.eclipse.ecf.remoteservice.asyncproxy, org.eclipse.ecf.remoteservice.client, + org.eclipse.equinox.concurrent.future;version="1.1.0", org.osgi.framework, org.osgi.service.log;version="1.3.0", org.osgi.util.tracker diff --git a/framework/bundles/org.eclipse.ecf.remoteservice.rpc/build.properties b/framework/bundles/org.eclipse.ecf.remoteservice.rpc/build.properties index dd3df998b..16d547646 100644 --- a/framework/bundles/org.eclipse.ecf.remoteservice.rpc/build.properties +++ b/framework/bundles/org.eclipse.ecf.remoteservice.rpc/build.properties @@ -11,5 +11,4 @@ bin.includes = META-INF/,\ .,\ plugin.xml,\ plugin.properties -additional.bundles = org.eclipse.equinox.concurrent jars.extra.classpath = platform:/plugin/org.eclipse.equinox.concurrent |