Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2008-11-04 09:58:14 +0000
committerEike Stepper2008-11-04 09:58:14 +0000
commit29d2ec870a4666f4ddfba4bcd0727aa60953eafc (patch)
tree58ca1d644294f6c2fb41b6ed6a19a96dd553dea0 /plugins/org.eclipse.net4j/src
parentaac49607637484bcd3de42fa09393b2f896caa10 (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Indication.java21
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/IndicationWithResponse.java12
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RemoteExceptionIndication.java (renamed from plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/ExceptionMessageIndication.java)23
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RemoteExceptionRequest.java (renamed from plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/ExceptionMessageRequest.java)14
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/Request.java3
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/RequestWithConfirmation.java24
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalActor.java4
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/SignalProtocol.java10
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/AbstractFailOverStrategy.java3
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/FailOverStrategy.java4
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/IFailOverStrategy.java6
-rw-r--r--plugins/org.eclipse.net4j/src/org/eclipse/net4j/signal/failover/NOOPFailOverStrategy.java6
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
}
}

Back to the top