package org.unsynchronized;
import java.io.*;
import java.util.*;
/**
* <p>
* This object contains embedded information about a serialization that failed, throwing
* an exception. It includes the actual exception object (which was serialized by the
* ObjectOutputStream) and the raw bytes of the stream data that was read before the
* exception was recognized.
* </p>
*
* <p>
* For the mechanics of exception serialization, see the Object Serialization
* Specification.
* </p>
*/
public class ExceptionState extends ContentBase {
/**
* The serialized exception object.
*/
public Content exceptionobj;
/**
* <p>
* An array of bytes representing the data read before the exception was encountered.
* Generally, this starts with the first "tc" byte (cf. protocol spec), which is an
* ObjectStreamConstants value and ends with 0x78 (the tc byte corresponding to
* TC_EXCEPTION). However, this isn't guaranteed; it may include *more* data.
* </p>
*
* <p>
* In other words, this is the incomplete object that was being written while the
* exception was caught by the ObjectOutputStream. It is not likely to be cleanly
* parseable.
* </p>
*
* <p>
* The uncertainty centers around the fact that this data is gathered by jdeserialize
* using a LoggerInputStream, and the underlying DataInputStream may have read more
* than is necessary. In all tests conducted so far, the above description is
* accurate.
* </p>
*/
public byte[] streamdata;
/**
* Consturctor.
* @param exobj the serialized exception object
* @param data the array of stream bytes that led up to the exception
*/
public ExceptionState(Content exobj, byte[] data) {
super(ContentType.EXCEPTIONSTATE);
this.exceptionobj = exobj;
this.streamdata = data;
this.handle = exobj.getHandle();
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("[exceptionstate object " + exceptionobj.toString() + " buflen " + streamdata.length);
if(streamdata.length > 0) {
for(int i = 0; i < streamdata.length; i++) {
if((i % 16) == 0) {
sb.append(JDeserialize.linesep).append(String.format("%7x: ", Integer.valueOf(i)));
}
sb.append(" ").append(JDeserialize.hexnoprefix(streamdata[i]));
}
sb.append(JDeserialize.linesep);
}
sb.append("]");
return sb.toString();
}
}