Package org.eclipse.ecf.remoteservice

## Class AbstractRemoteService

- java.lang.Object
- - org.eclipse.ecf.remoteservice.asyncproxy.AbstractAsyncProxyRemoteService
  - - org.eclipse.ecf.remoteservice.AbstractRemoteService

All Implemented Interfaces:
  `InvocationHandler`, `IRemoteService`

Direct Known Subclasses:
  `AbstractClientService`, `RemoteServiceImpl`

    public abstract class AbstractRemoteService
    extends AbstractAsyncProxyRemoteService
    implements IRemoteService, InvocationHandler

Abstract remote service implementation. Clients may subclass to avoid re-implementing methods from IRemoteService.

Since:
  4.1

### Nested Class Summary

Nested Classes
`class` `AbstractRemoteService.AsyncArgs`
`class` `AbstractRemoteService.ProxyClassLoader`

### Field Summary

Fields
`protected static Object[]` `EMPTY_ARGS`
`protected ExecutorService` `futureExecutorService`
`protected int` `futureExecutorServiceMaxThreads`
`protected org.eclipse.equinox.concurrent.future.IExecutor` `iFutureExecutor`

### Constructor Summary

Constructors
`AbstractRemoteService()`

### Method Summary

All Methods Instance Methods Abstract Methods Concrete Methods
`protected List` `addAsyncProxyClasses​(ClassLoader cl, Class[] interfaces)`
`protected void` `addRemoteServiceProxyToProxy​(List classes)`
`protected org.eclipse.equinox.concurrent.future.IFuture` `callAsync​(AbstractAsyncProxyRemoteCall call)`
`org.eclipse.equinox.concurrent.future.IFuture` `callAsync​(IRemoteCall call)` Call remote method specified by call parameter asynchronously, and immediately return `IFuture` instance.
`Future<Object>` `callAsync​(IRemoteCall call, Callable<Object> callable)`
`protected Object` `callAsyncWithResult​(IRemoteCall call, IRemoteCallListener listener)`
`protected Future<Object>` `callAsyncWithTimeout​(IRemoteCall call, Callable<Object> callable)`
`protected void` `callAsyncWithTimeout​(IRemoteCall call, Callable<IRemoteCallCompleteEvent> callable, IRemoteCallListener callback)`
`protected void` `callCompletableAsync​(AbstractAsyncProxyRemoteCall call, IAsyncProxyCompletable completable)`
`protected Future` `callFutureAsync​(AbstractAsyncProxyRemoteCall call)`
`protected Future` `callFutureAsync​(IRemoteCall call)`
`Object` `callSync​(IRemoteCall call, Callable<Object> callable)`
`protected String` `convertInterfaceNameToAsyncInterfaceName​(String interfaceName)`
`protected Object` `createProxy​(Class[] classes)`
`protected Object` `createProxy​(ClassLoader cl, Class[] classes)`
`protected IRemoteCallCompleteEvent` `createRCCE​(Object result, Throwable e)`
`protected IRemoteCallCompleteEvent` `createRCCEFailure​(Throwable e)`
`protected IRemoteCallCompleteEvent` `createRCCESuccess​(Object result)`
`protected IRemoteCall` `createRemoteCall​(String callMethod, Object[] callParameters, long callTimeout)`
`void` `dispose()`
`protected Class` `findAsyncRemoteServiceProxyClass​(Class c)`
`protected Class` `findAsyncRemoteServiceProxyClass​(ClassLoader cl, Class c)`
`protected AbstractRemoteService.AsyncArgs` `getAsyncArgs​(Method method, Object[] args)`
`protected String` `getAsyncInvokeMethodName​(Method method)`
`protected RemoteCall` `getAsyncRemoteCall​(String invokeMethodName, Object[] asyncArgs)`
`protected String` `getCallMethodNameForProxyInvoke​(Method method, Object[] args)`
`protected Object[]` `getCallParametersForProxyInvoke​(String callMethod, Method proxyMethod, Object[] args)`
`protected long` `getCallTimeoutForProxyInvoke​(String callMethod, Method proxyMethod, Object[] args)`
`protected long` `getDefaultTimeout()`
`protected ExecutorService` `getFutureExecutorService​(IRemoteCall call)`
`protected org.eclipse.equinox.concurrent.future.IExecutor` `getIFutureExecutor​(IRemoteCall call)`
`protected abstract String[]` `getInterfaceClassNames()`
`Object` `getProxy()` Get local proxy for remote interface.
`Object` `getProxy​(ClassLoader cl, Class[] interfaces)` Get local proxy for remote interface.
`protected IRemoteService` `getRemoteService()`
`protected abstract IRemoteServiceID` `getRemoteServiceID()`
`protected IRemoteServiceProxyCreator` `getRemoteServiceProxyCreator()`
`protected abstract IRemoteServiceReference` `getRemoteServiceReference()`
`protected void` `handleInvokeSyncException​(String methodName, ECFException e)`
`protected void` `handleProxyException​(String message, Throwable t)`
`Object` `invoke​(Object proxy, Method method, Object[] args)`
`protected Object` `invokeAsync​(Method method, Object[] args)`
`protected Object` `invokeObject​(Object proxy, Method method, Object[] args)`
`protected Object` `invokeReturnAsync​(Object proxy, Method method, Object[] args)`
`protected Object` `invokeSync​(IRemoteCall call)`
`protected boolean` `isAsync​(Object proxy, Method method, Object[] args)`
`protected boolean` `isInterfaceAsync​(Class interfaceClass)`
`protected boolean` `isMethodAsync​(String methodName)`
`protected boolean` `isOSGIAsync()`
`protected Class` `loadInterfaceClass​(ClassLoader cl, String className)`
`protected Class` `loadInterfaceClass​(String className)`
`protected void` `logWarning​(String string, Throwable e)`
`protected void` `setFutureExecutorService​(ExecutorService executorService)`
`protected void` `setIFutureExecutor​(org.eclipse.equinox.concurrent.future.IExecutor executor)`

### Methods inherited from class org.eclipse.ecf.remoteservice.asyncproxy.AbstractAsyncProxyRemoteService

`callFuture, isReturnAsync`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface org.eclipse.ecf.remoteservice.IRemoteService

`callAsync, callSync, fireAsync`

### Field Detail

#### EMPTY_ARGS

    protected static final Object[] EMPTY_ARGS

#### futureExecutorServiceMaxThreads

    protected int futureExecutorServiceMaxThreads

Since:
  8.2

#### futureExecutorService

    protected ExecutorService futureExecutorService

Since:
  8.2

#### iFutureExecutor

    protected org.eclipse.equinox.concurrent.future.IExecutor iFutureExecutor

Since:
  8.2

### Constructor Detail

#### AbstractRemoteService

    public AbstractRemoteService()

### Method Detail

#### getFutureExecutorService

    protected ExecutorService getFutureExecutorService​(IRemoteCall call)

Parameters:
  `call` - the remote call to get the ExecutorService for
Returns:
  ExecutorService
Since:
  8.2

#### setFutureExecutorService

    protected void setFutureExecutorService​(ExecutorService executorService)

Parameters:
  `executorService` - the ExecutorService to use for this remote service
Since:
  8.2

#### getIFutureExecutor

    protected org.eclipse.equinox.concurrent.future.IExecutor getIFutureExecutor​(IRemoteCall call)

Parameters:
  `call` - the IRemoteCall to get the IExecutor for
Returns:
  IExecutor the executor to use for the given call instance.
Since:
  8.2

#### setIFutureExecutor

    protected void setIFutureExecutor​(org.eclipse.equinox.concurrent.future.IExecutor executor)

Parameters:
  `executor` - executor
Since:
  8.2

#### getInterfaceClassNames

    protected abstract String[] getInterfaceClassNames()

#### getRemoteServiceID

    protected abstract IRemoteServiceID getRemoteServiceID()

#### getRemoteServiceReference

    protected abstract IRemoteServiceReference getRemoteServiceReference()

#### loadInterfaceClass

    protected Class loadInterfaceClass​(String className)
                                throws ClassNotFoundException

Throws:
  `ClassNotFoundException`

#### loadInterfaceClass

    protected Class loadInterfaceClass​(ClassLoader cl,
                                       String className)
                                throws ClassNotFoundException

Parameters:
  `cl` - the ClassLoader to load the interface class. Will not be `null`
  `className` - the interface class to load
Returns:
  Class the class loaded. Must not be `null`
Throws:
  `ClassNotFoundException` - if class cannot be found
Since:
  6.0

#### getRemoteService

    protected IRemoteService getRemoteService()

#### getDefaultTimeout

    protected long getDefaultTimeout()

#### callAsync

    protected org.eclipse.equinox.concurrent.future.IFuture callAsync​(AbstractAsyncProxyRemoteCall call)

Specified by:
  `callAsync` in class `AbstractAsyncProxyRemoteService`

#### callAsync

    public org.eclipse.equinox.concurrent.future.IFuture callAsync​(IRemoteCall call)

Description copied from interface: `IRemoteService`
Call remote method specified by call parameter asynchronously, and immediately return `IFuture` instance. Returned IFuture will not be `null`, and allows the caller to retrieve the actual resulting value from the remote call (or exception).

Specified by:
  `callAsync` in interface `IRemoteService`
Parameters:
  `call` - the remote call to make. Must not be `null` .
Returns:
  IFuture the asynchronous result to allow the caller to poll for whether the result `IFuture.isDone()`, and then to `IFuture.get()` the actual result.

#### getProxy

    public Object getProxy()
                    throws ECFException

Description copied from interface: `IRemoteService`
Get local proxy for remote interface. The local proxy may then be used to make remote method calls transparently by invoking the local proxy method

Specified by:
  `getProxy` in interface `IRemoteService`
Returns:
  Object that implements the interface specified in the IRemoteServiceReference instance used to retrieve the IRemoteService object. The result may then be cast to the appropriate type. Will not be `null`.
Throws:
  `ECFException` - If some problem in creating the proxy. The underlying problem is conveyed in the nested exception.

#### addRemoteServiceProxyToProxy

    protected void addRemoteServiceProxyToProxy​(List classes)

Parameters:
  `classes` - the interface classes to add to
Since:
  6.0

#### addAsyncProxyClasses

    protected List addAsyncProxyClasses​(ClassLoader cl,
                                        Class[] interfaces)

Parameters:
  `cl` - ClassLoader to use to add async proxy classes
  `interfaces` - the Class[] of interface classes
Returns:
  List the list of interfaces plus any async proxy interface classes.
Since:
  8.3

#### getProxy

    public Object getProxy​(ClassLoader cl,
                           Class[] interfaces)
                    throws ECFException

Description copied from interface: `IRemoteService`
Get local proxy for remote interface. The local proxy may then be used to make remote method calls transparently by invoking the local proxy method

Specified by:
  `getProxy` in interface `IRemoteService`
Parameters:
  `cl` - ClassLoader to use to create the proxy class. Must not be `null`.
  `interfaces` - array of Class that has the loaded interface classes. Must not be `null` and should have dimension of one or more.
Returns:
  Object that implements the given interfaceClasses. The result may then be cast to the one of the types given in interfaceClasses. Will not be `null`
Throws:
  `ECFException` - If some problem in creating the proxy. The underlying problem is conveyed in the nested exception.
Since:
  6.0

#### getRemoteServiceProxyCreator

    protected IRemoteServiceProxyCreator getRemoteServiceProxyCreator()

Returns:
  IRemoteServiceProxyCreator
Since:
  8.0

#### createProxy

    protected Object createProxy​(ClassLoader cl,
                                 Class[] classes)

Parameters:
  `cl` - ClassLoader for proxy creation
  `classes` - the Class[] for proxy classes
Returns:
  Object the proxy implementing the given Class[]
Since:
  6.0

#### createProxy

    protected Object createProxy​(Class[] classes)

#### findAsyncRemoteServiceProxyClass

    protected Class findAsyncRemoteServiceProxyClass​(Class c)

Parameters:
  `c` - Class
Returns:
  Class
Since:
  3.3

#### findAsyncRemoteServiceProxyClass

    protected Class findAsyncRemoteServiceProxyClass​(ClassLoader cl,
                                                     Class c)

Parameters:
  `cl` - ClassLoader
  `c` - Class
Returns:
  Class
Since:
  6.0

#### convertInterfaceNameToAsyncInterfaceName

    protected String convertInterfaceNameToAsyncInterfaceName​(String interfaceName)

#### getCallParametersForProxyInvoke

    protected Object[] getCallParametersForProxyInvoke​(String callMethod,
                                                       Method proxyMethod,
                                                       Object[] args)

#### getCallTimeoutForProxyInvoke

    protected long getCallTimeoutForProxyInvoke​(String callMethod,
                                                Method proxyMethod,
                                                Object[] args)

#### getCallMethodNameForProxyInvoke

    protected String getCallMethodNameForProxyInvoke​(Method method,
                                                     Object[] args)

#### invokeObject

    protected Object invokeObject​(Object proxy,
                                  Method method,
                                  Object[] args)
                           throws Throwable

Throws:
  `Throwable`

#### invokeSync

    protected Object invokeSync​(IRemoteCall call)
                         throws ECFException

Throws:
  `ECFException`

#### isAsync

    protected boolean isAsync​(Object proxy,
                              Method method,
                              Object[] args)

Parameters:
  `proxy` - proxy instance
  `method` - the java Method invoked
  `args` - arguments
Returns:
  true if given proxy/method/args combination represents an async proxy class
Since:
  8.3

#### createRemoteCall

    protected IRemoteCall createRemoteCall​(String callMethod,
                                           Object[] callParameters,
                                           long callTimeout)

Parameters:
  `callMethod` - call method
  `callParameters` - call parameters
  `callTimeout` - call timeout
Returns:
  IRemoteCall remote call created. Should not be `null`
Since:
  8.3

#### handleProxyException

    protected void handleProxyException​(String message,
                                        Throwable t)
                                 throws ServiceException

Parameters:
  `message` - message for exception
  `t` - Throwable to wrap
Throws:
  `ServiceException` - thrown if subclasses do not override
Since:
  8.6

#### handleInvokeSyncException

    protected void handleInvokeSyncException​(String methodName,
                                             ECFException e)
                                      throws Throwable

Parameters:
  `methodName` - method name
  `e` - exception thrown if subclasses do not override
Throws:
  `Throwable` - thrown if subclasses to not override
Since:
  8.6

#### invokeReturnAsync

    protected Object invokeReturnAsync​(Object proxy,
                                       Method method,
                                       Object[] args)
                                throws Throwable

Throws:
  `Throwable`
Since:
  8.13

#### isOSGIAsync

    protected boolean isOSGIAsync()

Since:
  8.13

#### isInterfaceAsync

    protected boolean isInterfaceAsync​(Class interfaceClass)

Since:
  8.13

#### isMethodAsync

    protected boolean isMethodAsync​(String methodName)

Since:
  8.13

#### invoke

    public Object invoke​(Object proxy,
                         Method method,
                         Object[] args)
                  throws Throwable

Specified by:
  `invoke` in interface `InvocationHandler`
Throws:
  `Throwable`

#### getAsyncRemoteCall

    protected RemoteCall getAsyncRemoteCall​(String invokeMethodName,
                                            Object[] asyncArgs)

Parameters:
  `invokeMethodName` - invoke method name
  `asyncArgs` - asynch arguments
Returns:
  RemoteCall remote call created. Should not be `null`
Since:
  8.4

#### invokeAsync

    protected Object invokeAsync​(Method method,
                                 Object[] args)
                          throws Throwable

Parameters:
  `method` - java Method invoked
  `args` - arguments
Returns:
  Object async future result. Should be of type IFuture, Future, or CompletableFuture
Throws:
  `Throwable` - thrown if some problem invoking async
Since:
  3.3

#### callAsyncWithResult

    protected Object callAsyncWithResult​(IRemoteCall call,
                                         IRemoteCallListener listener)

Parameters:
  `call` - remote call
  `listener` - remote call listener
Returns:
  Object will be `null` unless subclasses override
Since:
  8.2

#### callCompletableAsync

    protected void callCompletableAsync​(AbstractAsyncProxyRemoteCall call,
                                        IAsyncProxyCompletable completable)

Specified by:
  `callCompletableAsync` in class `AbstractAsyncProxyRemoteService`
Parameters:
  `call` - abstract remote call
  `completable` - async proxy completable
Since:
  8.4

#### callFutureAsync

    protected Future callFutureAsync​(AbstractAsyncProxyRemoteCall call)

Specified by:
  `callFutureAsync` in class `AbstractAsyncProxyRemoteService`
Parameters:
  `call` - abstract async proxy remote call
Returns:
  Future future result
Since:
  8.4

#### callFutureAsync

    protected Future callFutureAsync​(IRemoteCall call)

Parameters:
  `call` - remote call
Returns:
  Future future result
Since:
  8.2

#### getAsyncArgs

    protected AbstractRemoteService.AsyncArgs getAsyncArgs​(Method method,
                                                           Object[] args)

Parameters:
  `method` - method
  `args` - args
Returns:
  AsyncArgs async arguments
Since:
  3.3

#### getAsyncInvokeMethodName

    protected String getAsyncInvokeMethodName​(Method method)

Parameters:
  `method` - java method invoked
Returns:
  String synchronous method name without asynchronous suffix (i.e. fooAsync to foo)
Since:
  3.3

#### logWarning

    protected void logWarning​(String string,
                              Throwable e)

#### callAsync

    public Future<Object> callAsync​(IRemoteCall call,
                                    Callable<Object> callable)

Since:
  8.13

#### callSync

    public Object callSync​(IRemoteCall call,
                           Callable<Object> callable)
                    throws InterruptedException,
                           ExecutionException,
                           TimeoutException

Throws:
  `TimeoutException`
  `ExecutionException`
  `InterruptedException`
Since:
  8.13

#### dispose

    public void dispose()

Since:
  8.2

#### callAsyncWithTimeout

    protected Future<Object> callAsyncWithTimeout​(IRemoteCall call,
                                                  Callable<Object> callable)

Since:
  8.13

#### createRCCESuccess

    protected IRemoteCallCompleteEvent createRCCESuccess​(Object result)

Since:
  8.13

#### createRCCEFailure

    protected IRemoteCallCompleteEvent createRCCEFailure​(Throwable e)

Since:
  8.13

#### createRCCE

    protected IRemoteCallCompleteEvent createRCCE​(Object result,
                                                  Throwable e)

Since:
  8.13

#### callAsyncWithTimeout

    protected void callAsyncWithTimeout​(IRemoteCall call,
                                        Callable<IRemoteCallCompleteEvent> callable,
                                        IRemoteCallListener callback)

Since:
  8.13