summaryrefslogtreecommitdiff
path: root/java/src/Ice/AsyncResult.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/Ice/AsyncResult.java')
-rw-r--r--java/src/Ice/AsyncResult.java471
1 files changed, 12 insertions, 459 deletions
diff --git a/java/src/Ice/AsyncResult.java b/java/src/Ice/AsyncResult.java
index eed405ad00c..7c015d67c8c 100644
--- a/java/src/Ice/AsyncResult.java
+++ b/java/src/Ice/AsyncResult.java
@@ -14,50 +14,29 @@ package Ice;
* With this object, an application can obtain several attributes of the
* invocation and discover its outcome.
**/
-public class AsyncResult
+public interface AsyncResult
{
- protected AsyncResult(Communicator communicator, IceInternal.Instance instance, String op,
- IceInternal.CallbackBase del)
- {
- _communicator = communicator;
- _instance = instance;
- _operation = op;
- _os = new IceInternal.BasicStream(instance, IceInternal.Protocol.currentProtocolEncoding, false, false);
- _state = 0;
- _sentSynchronously = false;
- _exception = null;
- _callback = del;
- }
/**
* Returns the communicator that sent the invocation.
*
* @return The communicator.
**/
- public Communicator getCommunicator()
- {
- return _communicator;
- }
+ public Communicator getCommunicator();
/**
* Returns the connection that was used for the invocation.
*
* @return The connection.
**/
- public Connection getConnection()
- {
- return null;
- }
+ public Connection getConnection();
/**
* Returns the proxy that was used to call the <code>begin_</code> method.
*
* @return The proxy.
**/
- public ObjectPrx getProxy()
- {
- return null;
- }
+ public ObjectPrx getProxy();
/**
* Indicates whether the result of an invocation is available.
@@ -65,34 +44,12 @@ public class AsyncResult
* @return True if the result is available, which means a call to the <code>end_</code>
* method will not block. The method returns false if the result is not yet available.
**/
- public final boolean isCompleted()
- {
- synchronized(_monitor)
- {
- return (_state & Done) > 0;
- }
- }
+ public boolean isCompleted();
/**
* Blocks the caller until the result of the invocation is available.
**/
- public final void waitForCompleted()
- {
- synchronized(_monitor)
- {
- while((_state & Done) == 0)
- {
- try
- {
- _monitor.wait();
- }
- catch(InterruptedException ex)
- {
- throw new Ice.OperationInterruptedException();
- }
- }
- }
- }
+ public void waitForCompleted();
/**
* When you call the <code>begin_</code> method, the Ice run time attempts to
@@ -105,48 +62,17 @@ public class AsyncResult
*
* @return True if the request has been sent, or false if the request is queued.
**/
- public final boolean isSent()
- {
- synchronized(_monitor)
- {
- return (_state & Sent) > 0;
- }
- }
+ public boolean isSent();
/**
* Blocks the caller until the request has been written to the client-side transport.
**/
- public final void waitForSent()
- {
- synchronized(_monitor)
- {
- while((_state & Sent) == 0 && _exception == null)
- {
- try
- {
- _monitor.wait();
- }
- catch(InterruptedException ex)
- {
- throw new Ice.OperationInterruptedException();
- }
- }
- }
- }
+ public void waitForSent();
/**
* If the invocation failed with a local exception, throws the local exception.
**/
- public final void throwLocalException()
- {
- synchronized(_monitor)
- {
- if(_exception != null)
- {
- throw _exception;
- }
- }
- }
+ public void throwLocalException();
/**
* This method returns true if a request was written to the client-side
@@ -157,385 +83,12 @@ public class AsyncResult
* @return True if the request was sent without being queued, or false
* otherwise.
**/
- public final boolean sentSynchronously()
- {
- return _sentSynchronously; // No lock needed, immutable once __send() is called
- }
+ public boolean sentSynchronously();
/**
* Returns the name of the operation.
*
* @return The operation name.
**/
- public final String getOperation()
- {
- return _operation;
- }
-
- public final IceInternal.BasicStream __getOs()
- {
- return _os;
- }
-
- public IceInternal.BasicStream
- __startReadParams()
- {
- _is.startReadEncaps();
- return _is;
- }
-
- public void
- __endReadParams()
- {
- _is.endReadEncaps();
- }
-
- public void
- __readEmptyParams()
- {
- _is.skipEmptyEncaps(null);
- }
-
- public byte[]
- __readParamEncaps()
- {
- return _is.readEncaps(null);
- }
-
- public final boolean __wait()
- {
- synchronized(_monitor)
- {
- if((_state & EndCalled) > 0)
- {
- throw new java.lang.IllegalArgumentException("end_ method called more than once");
- }
- _state |= EndCalled;
- while((_state & Done) == 0)
- {
- try
- {
- _monitor.wait();
- }
- catch(InterruptedException ex)
- {
- //
- // Remove the EndCalled flag since it should be possible to
- // call end_* again on the AsyncResult.
- //
- _state &= ~EndCalled;
- throw new Ice.OperationInterruptedException();
- }
- }
- if(_exception != null)
- {
- //throw (LocalException)_exception.fillInStackTrace();
- throw _exception;
- }
- return (_state & OK) > 0;
- }
- }
-
- public final void __throwUserException()
- throws UserException
- {
- try
- {
- _is.startReadEncaps();
- _is.throwException(null);
- }
- catch(UserException ex)
- {
- _is.endReadEncaps();
- throw ex;
- }
- }
-
- public final void __invokeExceptionAsync(final Ice.Exception ex)
- {
- //
- // This is called when it's not safe to call the exception callback synchronously
- // from this thread. Instead the exception callback is called asynchronously from
- // the client thread pool.
- //
- try
- {
- _instance.clientThreadPool().dispatch(new IceInternal.DispatchWorkItem(_cachedConnection)
- {
- @Override
- public void
- run()
- {
- __invokeException(ex);
- }
- });
- }
- catch(CommunicatorDestroyedException exc)
- {
- throw exc; // CommunicatorDestroyedException is the only exception that can propagate directly.
- }
- }
-
- public final void __invokeException(Ice.Exception ex)
- {
- synchronized(_monitor)
- {
- _state |= Done;
- _os.resize(0, false); // Clear buffer now, instead of waiting for AsyncResult deallocation
- _exception = ex;
- _monitor.notifyAll();
- }
-
- __invokeCompleted();
- }
-
- protected final void __invokeSentInternal()
- {
- //
- // Note: no need to change the _state here, specializations are responsible for
- // changing the state.
- //
-
- if(_callback != null)
- {
- if(_instance.useApplicationClassLoader())
- {
- Thread.currentThread().setContextClassLoader(_callback.getClass().getClassLoader());
- }
-
- try
- {
- _callback.__sent(this);
- }
- catch(RuntimeException ex)
- {
- __warning(ex);
- }
- catch(AssertionError exc)
- {
- __error(exc);
- }
- catch(OutOfMemoryError exc)
- {
- __error(exc);
- }
- finally
- {
- if(_instance.useApplicationClassLoader())
- {
- Thread.currentThread().setContextClassLoader(null);
- }
- }
- }
-
- if(_observer != null)
- {
- Ice.ObjectPrx proxy = getProxy();
- if(proxy == null || !proxy.ice_isTwoway())
- {
- _observer.detach();
- }
- }
- }
-
- public void
- __attachRemoteObserver(Ice.ConnectionInfo info, Ice.Endpoint endpt, int requestId, int size)
- {
- if(_observer != null)
- {
- _childObserver = _observer.getRemoteObserver(info, endpt, requestId, size);
- if(_childObserver != null)
- {
- _childObserver.attach();
- }
- }
- }
-
- public void __attachCollocatedObserver(Ice.ObjectAdapter adapter, int requestId)
- {
- if(_observer != null)
- {
- _childObserver = _observer.getCollocatedObserver(adapter,
- requestId,
- _os.size() - IceInternal.Protocol.headerSize - 4);
- if(_childObserver != null)
- {
- _childObserver.attach();
- }
- }
- }
-
- public final void __invokeSentAsync()
- {
- //
- // This is called when it's not safe to call the sent callback synchronously
- // from this thread. Instead the exception callback is called asynchronously from
- // the client thread pool.
- //
- try
- {
- _instance.clientThreadPool().dispatch(new IceInternal.DispatchWorkItem(_cachedConnection)
- {
- @Override
- public void
- run()
- {
- __invokeSentInternal();
- }
- });
- }
- catch(CommunicatorDestroyedException exc)
- {
- }
- }
-
- public static void __check(AsyncResult r, ObjectPrx prx, String operation)
- {
- __check(r, operation);
- if(r.getProxy() != prx)
- {
- throw new IllegalArgumentException("Proxy for call to end_" + operation +
- " does not match proxy that was used to call corresponding begin_" +
- operation + " method");
- }
- }
-
- public static void __check(AsyncResult r, Connection con, String operation)
- {
- __check(r, operation);
- if(r.getConnection() != con)
- {
- throw new IllegalArgumentException("Connection for call to end_" + operation +
- " does not match connection that was used to call corresponding begin_" +
- operation + " method");
- }
- }
-
- public static void __check(AsyncResult r, Communicator com, String operation)
- {
- __check(r, operation);
- if(r.getCommunicator() != com)
- {
- throw new IllegalArgumentException("Communicator for call to end_" + operation +
- " does not match communicator that was used to call corresponding " +
- "begin_" + operation + " method");
- }
- }
-
- protected static void __check(AsyncResult r, String operation)
- {
- if(r == null)
- {
- throw new IllegalArgumentException("AsyncResult == null");
- }
- else if(r.getOperation() != operation) // Do NOT use equals() here - we are comparing reference equality
- {
- throw new IllegalArgumentException("Incorrect operation for end_" + operation + " method: " +
- r.getOperation());
- }
- }
-
- protected final void __invokeCompleted()
- {
- //
- // Note: no need to change the _state here, specializations are responsible for
- // changing the state.
- //
-
- if(_callback != null)
- {
- if(_instance.useApplicationClassLoader())
- {
- Thread.currentThread().setContextClassLoader(_callback.getClass().getClassLoader());
- }
-
- try
- {
- _callback.__completed(this);
- }
- catch(RuntimeException ex)
- {
- __warning(ex);
- }
- catch(AssertionError exc)
- {
- __error(exc);
- }
- catch(OutOfMemoryError exc)
- {
- __error(exc);
- }
- finally
- {
- if(_instance.useApplicationClassLoader())
- {
- Thread.currentThread().setContextClassLoader(null);
- }
- }
- }
-
- if(_observer != null)
- {
- _observer.detach();
- _observer = null;
- }
- }
-
- protected void
- __runTimerTask()
- {
- IceInternal.RequestHandler handler;
- synchronized(_monitor)
- {
- handler = _timeoutRequestHandler;
- _timeoutRequestHandler = null;
- }
-
- if(handler != null)
- {
- handler.asyncRequestCanceled((IceInternal.OutgoingAsyncMessageCallback)this,
- new Ice.InvocationTimeoutException());
- }
- }
-
- protected final void __warning(RuntimeException ex)
- {
- if(_instance.initializationData().properties.getPropertyAsIntWithDefault("Ice.Warn.AMICallback", 1) > 0)
- {
- String s = "exception raised by AMI callback:\n" + IceInternal.Ex.toString(ex);
- _instance.initializationData().logger.warning(s);
- }
- }
-
- protected final void __error(Error error)
- {
- String s = "error raised by AMI callback:\n" + IceInternal.Ex.toString(error);
- _instance.initializationData().logger.error(s);
- }
-
- protected Communicator _communicator;
- protected IceInternal.Instance _instance;
- protected String _operation;
- protected Ice.Connection _cachedConnection;
-
- protected java.lang.Object _monitor = new java.lang.Object();
- protected IceInternal.BasicStream _is;
- protected IceInternal.BasicStream _os;
-
- protected IceInternal.RequestHandler _timeoutRequestHandler;
- protected java.util.concurrent.Future<?> _future;
-
- protected static final byte OK = 0x1;
- protected static final byte Done = 0x2;
- protected static final byte Sent = 0x4;
- protected static final byte EndCalled = 0x8;
-
- protected byte _state;
- protected boolean _sentSynchronously;
- protected Ice.Exception _exception;
-
- protected Ice.Instrumentation.InvocationObserver _observer;
- protected Ice.Instrumentation.ChildInvocationObserver _childObserver;
-
- private IceInternal.CallbackBase _callback;
-}
+ public String getOperation();
+} \ No newline at end of file