package org.allcolor.alc.webapp;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import org.allcolor.alc.reflect.Dynamic;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
/**
* @author (Author)
* @version $Revision$
*/
public class SerializableObject
implements Serializable {
//~ Static fields/initializers -----------------------------------------------
/**
* DOCUMENT ME!
*/
private static transient List<WeakReference<SerializableObject>> list = new ArrayList<WeakReference<SerializableObject>>();
/** */
private static final long serialVersionUID = 3829808570940646550L;
//~ Instance fields ----------------------------------------------------------
/**
* DOCUMENT ME!
*/
private transient Object obj = null;
/**
* DOCUMENT ME!
*/
private transient byte array[] = null;
//~ Constructors -------------------------------------------------------------
/**
* Creates a new SerializableObject object.
*
* @param obj DOCUMENT ME!
*/
public SerializableObject (final Object obj) {
super();
this.obj = obj;
SerializableObject.register (this);
} // end SerializableObject()
//~ Methods ------------------------------------------------------------------
/**
* DOCUMENT ME!
*/
public static void destroy () {
SerializableObject._TestList ();
for (int i = 0; i < SerializableObject.list.size (); i++) {
final WeakReference<SerializableObject> ref = SerializableObject.list
.get (i);
final SerializableObject so = ref.get ();
if (so != null) {
so.serialize ();
} // end if
} // end for
SerializableObject.list.clear ();
} // end destroy()
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final Object getObj () {
if (this.array != null) {
try {
final String xml = new String(this.array, "utf-8");
final XStream xt = new XStream(new DomDriver());
this.obj = xt.fromXML (xml);
} // end try
catch (final Exception e) {
e.printStackTrace ();
this.obj = null;
} // end catch
this.array = null;
} // end if
return this.obj;
} // end getObj()
/**
* DOCUMENT ME!
*/
private static void _TestList () {
if (SerializableObject.list == null) {
SerializableObject.list = new ArrayList<WeakReference<SerializableObject>>();
} // end if
} // end _TestList()
/**
* DOCUMENT ME!
*
* @param obj DOCUMENT ME!
*/
private static void register (final SerializableObject obj) {
SerializableObject._TestList ();
SerializableObject.list.add (new WeakReference<SerializableObject>(obj));
} // end register()
/**
* DOCUMENT ME!
*
* @param stream DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
* @throws ClassNotFoundException DOCUMENT ME!
*/
private void readObject (final ObjectInputStream stream)
throws IOException,
ClassNotFoundException {
stream.defaultReadObject ();
this.array = ( byte [] ) stream.readObject ();
SerializableObject.register (this);
} // end readObject()
/**
* DOCUMENT ME!
*/
private void serialize () {
final ClassLoader cl = Dynamic._.ContextClassLoader (
ALCWebFilter.getFsClassLoader ());
try {
final XStream xt = new XStream(new DomDriver());
final String xml = xt.toXML (this.obj);
this.array = xml.getBytes ("utf-8");
} // end try
catch (final Exception e) {
e.printStackTrace ();
this.array = new byte[0];
} // end catch
finally {
Dynamic._.ContextClassLoader (cl);
} // end finally
} // end serialize()
/**
* DOCUMENT ME!
*
* @param stream DOCUMENT ME!
*
* @throws IOException DOCUMENT ME!
*/
private void writeObject (final ObjectOutputStream stream)
throws IOException {
stream.defaultWriteObject ();
if (this.array == null) {
this.serialize ();
} // end if
stream.writeObject (this.array);
stream.flush ();
this.array = null;
} // end writeObject()
} // end SerializableObject
|