package pt.ist.fenixframework.core; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class Externalization { // The NullClass and the NULL_OBJECT are public so that they can be used by anyone who needs an // object representation for null public static class NullClass implements Serializable { private static final long serialVersionUID = 1L; } public static final NullClass NULL_OBJECT = new NullClass(); public static byte[] externalizeObject(Object obj) { if (obj == null) { return externalizeSerializable(NULL_OBJECT); } else if (!(obj instanceof Serializable)) { throw new UnsupportedOperationException(obj.getClass().getName()); } return externalizeSerializable((Serializable)obj); } public static <T> T internalizeObject(byte[] bytes) { Object obj = internalizeSerializable(bytes); if (obj instanceof NullClass) { return null; } else { return (T)obj; } } public static byte[] externalizeSerializable(Serializable obj) { return externalizeSerializable(obj, false); } public static <T> T internalizeSerializable(byte[] bytes) { return (T) internalizeSerializable(bytes, false); } public static byte[] externalizeSerializableGZiped(Serializable obj) { return externalizeSerializable(obj, true); } public static <T> T internalizeSerializableGZiped(byte[] bytes) { return (T) internalizeSerializable(bytes, true); } private static byte[] externalizeSerializable(Serializable obj, boolean gziped) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(gziped ? new GZIPOutputStream(baos) : baos); oos.writeObject(obj); oos.close(); return baos.toByteArray(); } catch (IOException ioe) { throw new ExternalizationException(ioe); } } private static Object internalizeSerializable(byte[] bytes, boolean gziped) { try { ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(gziped ? new GZIPInputStream(bais) : bais); Object result = ois.readObject(); ois.close(); return result; } catch (IOException ioe) { throw new ExternalizationException(ioe); } catch (ClassNotFoundException cnfe) { throw new ExternalizationException(cnfe); } } }