|
@@ -34,6 +34,7 @@ package com.jme3.network.service.rpc.msg;
|
|
|
|
|
|
import com.jme3.network.AbstractMessage;
|
|
|
import com.jme3.network.serializing.Serializable;
|
|
|
+import com.jme3.network.serializing.Serializer;
|
|
|
import java.io.PrintWriter;
|
|
|
import java.io.StringWriter;
|
|
|
|
|
@@ -50,6 +51,7 @@ public class RpcResponseMessage extends AbstractMessage {
|
|
|
private long msgId;
|
|
|
private Object result;
|
|
|
private String error;
|
|
|
+ private Object exception; // if it was serializable
|
|
|
|
|
|
public RpcResponseMessage() {
|
|
|
}
|
|
@@ -61,12 +63,31 @@ public class RpcResponseMessage extends AbstractMessage {
|
|
|
|
|
|
public RpcResponseMessage( long msgId, Throwable t ) {
|
|
|
this.msgId = msgId;
|
|
|
-
|
|
|
- StringWriter sOut = new StringWriter();
|
|
|
- PrintWriter out = new PrintWriter(sOut);
|
|
|
- t.printStackTrace(out);
|
|
|
- out.close();
|
|
|
- this.error = sOut.toString();
|
|
|
+
|
|
|
+ // See if the exception is serializable
|
|
|
+ if( isSerializable(t) ) {
|
|
|
+ // Can send the exception itself
|
|
|
+ this.exception = t;
|
|
|
+ } else {
|
|
|
+ // We'll compose all of the info into a string
|
|
|
+ StringWriter sOut = new StringWriter();
|
|
|
+ PrintWriter out = new PrintWriter(sOut);
|
|
|
+ t.printStackTrace(out);
|
|
|
+ out.close();
|
|
|
+ this.error = sOut.toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static boolean isSerializable( Throwable error ) {
|
|
|
+ if( error == null ) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ for( Throwable t = error; t != null; t = t.getCause() ) {
|
|
|
+ if( Serializer.getExactSerializerRegistration(t.getClass()) == null ) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
public long getMessageId() {
|
|
@@ -81,10 +102,15 @@ public class RpcResponseMessage extends AbstractMessage {
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
+ public Throwable getThrowable() {
|
|
|
+ return (Throwable)exception;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public String toString() {
|
|
|
return getClass().getSimpleName() + "[#" + msgId + ", result=" + result
|
|
|
+ (error != null ? ", error=" + error : "")
|
|
|
+ + (exception != null ? ", exception=" + exception : "")
|
|
|
+ "]";
|
|
|
}
|
|
|
}
|