diff options
author | Eike Stepper | 2008-11-04 09:58:14 +0000 |
---|---|---|
committer | Eike Stepper | 2008-11-04 09:58:14 +0000 |
commit | 29d2ec870a4666f4ddfba4bcd0727aa60953eafc (patch) | |
tree | 58ca1d644294f6c2fb41b6ed6a19a96dd553dea0 /plugins/org.eclipse.net4j/src | |
parent | aac49607637484bcd3de42fa09393b2f896caa10 (diff) | |
download | cdo-29d2ec870a4666f4ddfba4bcd0727aa60953eafc.tar.gz cdo-29d2ec870a4666f4ddfba4bcd0727aa60953eafc.tar.xz cdo-29d2ec870a4666f4ddfba4bcd0727aa60953eafc.zip |
[252221] Provide proper RemoteException for signals
https://bugs.eclipse.org/bugs/show_bug.cgi?id=252221
Diffstat (limited to 'plugins/org.eclipse.net4j/src')
12 files changed, 85 insertions, 45 deletions
diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Indication.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Indication.java index 89f2c945ce..7e7e9aacc6 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Indication.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Indication.java @@ -14,12 +14,12 @@ import org.eclipse.net4j.buffer.BufferInputStream; import org.eclipse.net4j.buffer.BufferOutputStream; import org.eclipse.net4j.util.ReflectUtil; import org.eclipse.net4j.util.StringUtil; +import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.io.ExtendedDataInputStream; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.internal.net4j.bundle.OM; -import java.io.IOException; import java.io.InputStream; /** @@ -51,14 +51,17 @@ public abstract class Indication extends SignalReactor { indicating(ExtendedDataInputStream.wrap(wrappedInputStream)); } - catch (IOException ex) + catch (Error ex) { + OM.LOG.error(ex); + sendExceptionSignal(ex); throw ex; } catch (Exception ex) { + ex = WrappedException.unwrap(ex); OM.LOG.error(ex); - sendExceptionMessage(ex); + sendExceptionSignal(ex); throw ex; } finally @@ -67,21 +70,21 @@ public abstract class Indication extends SignalReactor } } - protected abstract void indicating(ExtendedDataInputStream in) throws IOException; + protected abstract void indicating(ExtendedDataInputStream in) throws Exception; /** * @since 2.0 */ - protected String getMessage(Exception ex) + protected String getMessage(Throwable t) { - return StringUtil.formatException(ex); + return StringUtil.formatException(t); } - void sendExceptionMessage(Exception ex) throws Exception + void sendExceptionSignal(Throwable t) throws Exception { SignalProtocol<?> protocol = getProtocol(); int correlationID = -getCorrelationID(); - String message = getMessage(ex); - new ExceptionMessageRequest(protocol, correlationID, message).send(); + String message = getMessage(t); + new RemoteExceptionRequest(protocol, correlationID, message, t).send(); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithResponse.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithResponse.java index 44e2dafd09..5c16fb3c29 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithResponse.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithResponse.java @@ -13,12 +13,12 @@ package org.eclipse.net4j.signal; import org.eclipse.net4j.buffer.BufferInputStream; import org.eclipse.net4j.buffer.BufferOutputStream; import org.eclipse.net4j.util.ReflectUtil; +import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.io.ExtendedDataOutputStream; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.internal.net4j.bundle.OM; -import java.io.IOException; import java.io.OutputStream; /** @@ -51,14 +51,17 @@ public abstract class IndicationWithResponse extends Indication { responding(ExtendedDataOutputStream.wrap(wrappedOutputStream)); } - catch (IOException ex) + catch (Error ex) { + OM.LOG.error(ex); + sendExceptionSignal(ex); throw ex; } catch (Exception ex) { + ex = WrappedException.unwrap(ex); OM.LOG.error(ex); - sendExceptionMessage(ex); + sendExceptionSignal(ex); throw ex; } finally @@ -73,6 +76,7 @@ public abstract class IndicationWithResponse extends Indication /** * <b>Important Note:</b> The response must not be empty, i.e. the stream must be used at least to write a * <code>boolean</code>. Otherwise synchronization problems will result! + * @throws Exception TODO */ - protected abstract void responding(ExtendedDataOutputStream out) throws IOException; + protected abstract void responding(ExtendedDataOutputStream out) throws Exception; } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/ExceptionMessageIndication.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RemoteExceptionIndication.java index 9a7523db9c..de18a1b3bb 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/ExceptionMessageIndication.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RemoteExceptionIndication.java @@ -12,23 +12,34 @@ package org.eclipse.net4j.signal; import org.eclipse.net4j.util.io.ExtendedDataInputStream; -import java.io.IOException; +import org.eclipse.internal.net4j.bundle.OM; /** * @author Eike Stepper */ -class ExceptionMessageIndication extends Indication +class RemoteExceptionIndication extends Indication { - public ExceptionMessageIndication(SignalProtocol<?> protocol) + public RemoteExceptionIndication(SignalProtocol<?> protocol) { - super(protocol, SignalProtocol.SIGNAL_EXCEPTION_MESSAGE); + super(protocol, SignalProtocol.SIGNAL_REMOTE_EXCEPTION); } @Override - protected void indicating(ExtendedDataInputStream in) throws IOException + protected void indicating(ExtendedDataInputStream in) throws Exception { int correlationID = in.readInt(); String message = in.readString(); - getProtocol().stopSignal(correlationID, message); + Throwable t; + + try + { + t = (Throwable)in.readObject(OM.class.getClassLoader()); + } + catch (Throwable couldNotLoadExceptionClass) + { + t = new SignalRemoteException(message); + } + + getProtocol().stopSignal(correlationID, t); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/ExceptionMessageRequest.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RemoteExceptionRequest.java index b529df2992..8dd6f083f0 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/ExceptionMessageRequest.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RemoteExceptionRequest.java @@ -12,28 +12,30 @@ package org.eclipse.net4j.signal; import org.eclipse.net4j.util.io.ExtendedDataOutputStream; -import java.io.IOException; - /** * @author Eike Stepper */ -class ExceptionMessageRequest extends Request +class RemoteExceptionRequest extends Request { private int correlationID; private String message; - public ExceptionMessageRequest(SignalProtocol<?> protocol, int correlationID, String message) + private Throwable t; + + public RemoteExceptionRequest(SignalProtocol<?> protocol, int correlationID, String message, Throwable t) { - super(protocol, SignalProtocol.SIGNAL_EXCEPTION_MESSAGE); + super(protocol, SignalProtocol.SIGNAL_REMOTE_EXCEPTION); this.correlationID = correlationID; this.message = message; + this.t = t; } @Override - protected void requesting(ExtendedDataOutputStream out) throws IOException + protected void requesting(ExtendedDataOutputStream out) throws Exception { out.writeInt(correlationID); out.writeString(message); + out.writeObject(t); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Request.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Request.java index 4f38651d61..e79a162163 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Request.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Request.java @@ -18,7 +18,6 @@ import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.internal.net4j.bundle.OM; -import java.io.IOException; import java.io.OutputStream; /** @@ -50,5 +49,5 @@ public abstract class Request extends SignalActor out.flushWithEOS(); } - protected abstract void requesting(ExtendedDataOutputStream out) throws IOException; + protected abstract void requesting(ExtendedDataOutputStream out) throws Exception; } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithConfirmation.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithConfirmation.java index db3d3cdb05..a5d47735ce 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithConfirmation.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithConfirmation.java @@ -18,7 +18,6 @@ import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.internal.net4j.bundle.OM; -import java.io.IOException; import java.io.InputStream; /** @@ -38,14 +37,14 @@ public abstract class RequestWithConfirmation<RESULT> extends Request @Override @SuppressWarnings("unchecked") - public RESULT send() throws Exception + public RESULT send() throws Exception, SignalRemoteException { return (RESULT)super.send(); } @Override @SuppressWarnings("unchecked") - public RESULT send(long timeout) throws Exception + public RESULT send(long timeout) throws Exception, SignalRemoteException { return (RESULT)super.send(timeout); } @@ -68,11 +67,24 @@ public abstract class RequestWithConfirmation<RESULT> extends Request /** * <b>Important Note:</b> The confirmation must not be empty, i.e. the stream must be used at least to read a * <code>boolean</code>. Otherwise synchronization problems will result! + * + * @throws Exception + * TODO */ - protected abstract RESULT confirming(ExtendedDataInputStream in) throws IOException; + protected abstract RESULT confirming(ExtendedDataInputStream in) throws Exception; - void setExceptionMessage(String message) + void setRemoteException(Throwable t) { - getBufferInputStream().setException(new SignalRemoteException(message)); + SignalRemoteException remoteException; + if (t instanceof SignalRemoteException) + { + remoteException = (SignalRemoteException)t; + } + else + { + remoteException = new SignalRemoteException(t); + } + + getBufferInputStream().setException(remoteException); } } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalActor.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalActor.java index 6e4eea4184..7e30b589ae 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalActor.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalActor.java @@ -35,12 +35,12 @@ public abstract class SignalActor extends Signal setCorrelationID(protocol.getNextCorrelationID()); } - public Object send() throws Exception + public Object send() throws Exception, SignalRemoteException { return send(NO_TIMEOUT); } - public Object send(long timeout) throws Exception + public Object send(long timeout) throws Exception, SignalRemoteException { if (terminated) { diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java index a9368de4a5..5c2fb306f4 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java @@ -43,7 +43,7 @@ public abstract class SignalProtocol<INFRA_STRUCTURE> extends Protocol<INFRA_STR /** * @since 2.0 */ - public static final short SIGNAL_EXCEPTION_MESSAGE = -1; + public static final short SIGNAL_REMOTE_EXCEPTION = -1; private static final int MIN_CORRELATION_ID = 1; @@ -245,9 +245,9 @@ public abstract class SignalProtocol<INFRA_STRUCTURE> extends Protocol<INFRA_STR protected final SignalReactor provideSignalReactor(short signalID) { checkActive(); - if (signalID == SIGNAL_EXCEPTION_MESSAGE) + if (signalID == SIGNAL_REMOTE_EXCEPTION) { - return new ExceptionMessageIndication(this); + return new RemoteExceptionIndication(this); } SignalReactor signal = createSignalReactor(signalID); @@ -314,7 +314,7 @@ public abstract class SignalProtocol<INFRA_STRUCTURE> extends Protocol<INFRA_STR } } - void stopSignal(int correlationID, String message) + void stopSignal(int correlationID, Throwable t) { synchronized (signals) { @@ -322,7 +322,7 @@ public abstract class SignalProtocol<INFRA_STRUCTURE> extends Protocol<INFRA_STR if (signal instanceof RequestWithConfirmation) { RequestWithConfirmation<?> request = (RequestWithConfirmation<?>)signal; - request.setExceptionMessage(message); + request.setRemoteException(t); } signals.notifyAll(); diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/AbstractFailOverStrategy.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/AbstractFailOverStrategy.java index ec56cbcddf..ff782e1d45 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/AbstractFailOverStrategy.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/AbstractFailOverStrategy.java @@ -12,6 +12,7 @@ package org.eclipse.net4j.signal.failover; import org.eclipse.net4j.signal.RequestWithConfirmation; import org.eclipse.net4j.signal.SignalActor; +import org.eclipse.net4j.signal.SignalRemoteException; import org.eclipse.net4j.util.event.Notifier; /** @@ -36,7 +37,7 @@ public abstract class AbstractFailOverStrategy extends Notifier implements IFail this.defaultTimeout = defaultTimeout; } - public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request) throws Exception + public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request) throws Exception, SignalRemoteException { return send(request, defaultTimeout); } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/FailOverStrategy.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/FailOverStrategy.java index 9774c06e3d..242824fcc6 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/FailOverStrategy.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/FailOverStrategy.java @@ -14,6 +14,7 @@ import org.eclipse.net4j.channel.IChannel; import org.eclipse.net4j.connector.IConnector; import org.eclipse.net4j.signal.RequestWithConfirmation; import org.eclipse.net4j.signal.SignalProtocol; +import org.eclipse.net4j.signal.SignalRemoteException; import org.eclipse.net4j.util.CheckUtil; import java.util.concurrent.TimeoutException; @@ -27,7 +28,8 @@ public abstract class FailOverStrategy extends AbstractFailOverStrategy { } - public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception + public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception, + SignalRemoteException { for (;;) { diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/IFailOverStrategy.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/IFailOverStrategy.java index c156202e86..245e57663a 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/IFailOverStrategy.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/IFailOverStrategy.java @@ -11,6 +11,7 @@ package org.eclipse.net4j.signal.failover; import org.eclipse.net4j.signal.RequestWithConfirmation; +import org.eclipse.net4j.signal.SignalRemoteException; import org.eclipse.net4j.util.event.INotifier; /** @@ -28,7 +29,8 @@ public interface IFailOverStrategy extends INotifier */ public void setDefaultTimeout(long defaultTimeout); - public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request) throws Exception; + public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request) throws Exception, SignalRemoteException; - public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception; + public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception, + SignalRemoteException; } diff --git a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/NOOPFailOverStrategy.java b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/NOOPFailOverStrategy.java index c717ba5b31..689675c1aa 100644 --- a/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/NOOPFailOverStrategy.java +++ b/plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/NOOPFailOverStrategy.java @@ -11,6 +11,7 @@ package org.eclipse.net4j.signal.failover; import org.eclipse.net4j.signal.RequestWithConfirmation; +import org.eclipse.net4j.signal.SignalRemoteException; import org.eclipse.net4j.util.event.IListener; /** @@ -22,7 +23,8 @@ public class NOOPFailOverStrategy extends AbstractFailOverStrategy { } - public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception + public <RESULT> RESULT send(RequestWithConfirmation<RESULT> request, long timeout) throws Exception, + SignalRemoteException { return request.send(timeout); } @@ -30,10 +32,12 @@ public class NOOPFailOverStrategy extends AbstractFailOverStrategy @Override public void addListener(IListener listener) { + // Do nothing } @Override public void removeListener(IListener listener) { + // Do nothing } } |