package org.marketcetera.util.ws.wrappers; import java.io.Serializable; import javax.xml.bind.annotation.XmlTransient; import org.apache.commons.lang.SerializationException; import org.apache.commons.lang.SerializationUtils; import org.marketcetera.util.misc.ClassVersion; /** * A dual-form wrapper for marshalling a serializable object. The raw * form is an object implementing {@link Serializable}, and the * marshalled form is a byte array. * * <p>This wrapper is itself Java serializable and * JAXB-marshallable. Its own deserialization/unmarshalling succeeds * without an exception even if the wrapped object cannot be * deserialized, in which case the wrapper contains a null value for * the wrapped object's raw and marshalled forms, logs a warning, and * {@link #getDeserializationException()} returns the exception thrown * during deserialization. Similarly, its own * serialization/marshalling succeeds without an exception even if the * wrapped object cannot be serialized, in which case the wrapper * contains a null value for the wrapped object's raw and marshalled * forms, logs a warning, and {@link #getSerializationException()} * returns the exception thrown during serialization.</p> * * @author tlerios@marketcetera.com * @since 1.0.0 * @version $Id: SerWrapper.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ @ClassVersion("$Id: SerWrapper.java 16154 2012-07-14 16:34:05Z colin $") public class SerWrapper<T extends Serializable> extends DualWrapper<T,byte[]> { // CLASS DATA. private static final long serialVersionUID=1L; // INSTANCE DATA. private SerializationException mSerializationException; private SerializationException mDeserializationException; // CONSTRUCTORS. /** * Creates a new wrapper for the given object, in its raw form. It * also sets the internal marshalled form to match. * * @param raw The object, which may be null. */ public SerWrapper (T raw) { super(raw); } /** * Creates a new wrapper. This empty constructor is intended for * use by JAXB and Java serialization. */ public SerWrapper() {} // INSTANCE METHODS. /** * Returns the exception encountered during the most recent * serialization attempt; it is null if that attempt was * successful, or no attempt has been made yet. * * @return The exception. */ @XmlTransient public SerializationException getSerializationException() { return mSerializationException; } /** * Sets the exception encountered during the most recent * serialization attempt to the given exception. * * @param serializationException The exception. */ private void setSerializationException (SerializationException serializationException) { mSerializationException=serializationException; } /** * Returns the exception encountered during the most recent * deserialization attempt; it is null if that attempt was * successful, or no attempt has been made yet. * * @return The exception. */ @XmlTransient public SerializationException getDeserializationException() { return mDeserializationException; } /** * Sets the exception encountered during the most recent * deserialization attempt to the given exception. * * @param deserializationException The exception. */ private void setDeserializationException (SerializationException deserializationException) { mDeserializationException=deserializationException; } // DualWrapper. @SuppressWarnings("unchecked") @Override protected void toRaw() { try { setRawOnly((T)SerializationUtils.deserialize(getMarshalled())); setDeserializationException(null); } catch (SerializationException ex) { setDeserializationException(ex); Messages.DESERIALIZATION_FAILED.warn (this,getDeserializationException()); setRawOnly(null); } } @Override protected void toMarshalled() { try { setMarshalledOnly(SerializationUtils.serialize(getRaw())); setSerializationException(null); } catch (SerializationException ex) { setSerializationException(ex); Messages.SERIALIZATION_FAILED.warn (this,getSerializationException()); setMarshalledOnly(null); } } }