Author: julien_viet
Date: 2011-09-07 13:30:31 -0400 (Wed, 07 Sep 2011)
New Revision: 7332
Added:
portal/trunk/component/common/src/main/java/org/exoplatform/commons/serialization/MarshalledObject.java
portal/trunk/component/common/src/test/java/org/exoplatform/commons/utils/TestMarshalledObject.java
Log:
GTNPORTAL-2087 : Simple MarshalledObject to contain an marshalled object into bytes
Added:
portal/trunk/component/common/src/main/java/org/exoplatform/commons/serialization/MarshalledObject.java
===================================================================
---
portal/trunk/component/common/src/main/java/org/exoplatform/commons/serialization/MarshalledObject.java
(rev 0)
+++
portal/trunk/component/common/src/main/java/org/exoplatform/commons/serialization/MarshalledObject.java 2011-09-07
17:30:31 UTC (rev 7332)
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.commons.serialization;
+
+import org.gatein.common.io.IOTools;
+import org.gatein.common.io.UndeclaredIOException;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.reflect.UndeclaredThrowableException;
+import java.util.Arrays;
+
+/**
+ * A simple marshalled object that retain the state of an object as a bytes.
+ *
+ * @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
+ */
+public class MarshalledObject<S extends Serializable>
+{
+
+ public static <S extends Serializable> MarshalledObject<S> marshall(S
serializable) throws NullPointerException
+ {
+ if (serializable == null)
+ {
+ throw new NullPointerException("Cannot marshall null");
+ }
+ try
+ {
+ byte[] bytes = IOTools.serialize(serializable);
+ return new MarshalledObject<S>(serializable.getClass().getClassLoader(),
bytes);
+ }
+ catch (IOException e)
+ {
+ throw new UndeclaredIOException(e);
+ }
+ }
+
+ /** . */
+ private final ClassLoader loader;
+
+ /** . */
+ private final byte[] state;
+
+ private MarshalledObject(ClassLoader loader, byte[] state)
+ {
+ this.loader = loader;
+ this.state = state;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (obj == this)
+ {
+ return true;
+ }
+ if (obj instanceof MarshalledObject)
+ {
+ MarshalledObject<?> that = (MarshalledObject<?>)obj;
+ return Arrays.equals(state, that.state);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return Arrays.hashCode(state);
+ }
+
+ public S unmarshall() throws UndeclaredThrowableException
+ {
+ try
+ {
+ return (S)IOTools.unserialize(state, loader);
+ }
+ catch (IOException e)
+ {
+ throw new UndeclaredIOException(e);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new UndeclaredThrowableException(e);
+ }
+ }
+}
Added:
portal/trunk/component/common/src/test/java/org/exoplatform/commons/utils/TestMarshalledObject.java
===================================================================
---
portal/trunk/component/common/src/test/java/org/exoplatform/commons/utils/TestMarshalledObject.java
(rev 0)
+++
portal/trunk/component/common/src/test/java/org/exoplatform/commons/utils/TestMarshalledObject.java 2011-09-07
17:30:31 UTC (rev 7332)
@@ -0,0 +1,72 @@
+/**
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+
+package org.exoplatform.commons.utils;
+
+import org.exoplatform.commons.serialization.MarshalledObject;
+import org.exoplatform.component.test.AbstractGateInTest;
+
+/** @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a> */
+public class TestMarshalledObject extends AbstractGateInTest
+{
+
+ public void testSerialization()
+ {
+ String from = "foo";
+ MarshalledObject<String> marshalled = MarshalledObject.marshall(from);
+ String to = marshalled.unmarshall();
+ assertEquals(to, from);
+ }
+
+ public void testNPE()
+ {
+ try
+ {
+ MarshalledObject.marshall(null);
+ fail();
+ }
+ catch (NullPointerException e)
+ {
+ }
+ }
+
+ public void testHashCode()
+ {
+ MarshalledObject<String> marshalled1 =
MarshalledObject.marshall("foo");
+ assertEquals(marshalled1.hashCode(), marshalled1.hashCode());
+ MarshalledObject<String> marshalled2 =
MarshalledObject.marshall("foo");
+ assertEquals(marshalled1.hashCode(), marshalled2.hashCode());
+ assertEquals(marshalled2.hashCode(), marshalled1.hashCode());
+ MarshalledObject<String> marshalled3 =
MarshalledObject.marshall("bar");
+ assertNotSame(marshalled1.hashCode(), marshalled3.hashCode());
+ assertNotSame(marshalled3.hashCode(), marshalled1.hashCode());
+ }
+
+ public void testEquals()
+ {
+ MarshalledObject<String> marshalled1 =
MarshalledObject.marshall("foo");
+ assertTrue(marshalled1.equals(marshalled1));
+ MarshalledObject<String> marshalled2 =
MarshalledObject.marshall("foo");
+ assertTrue(marshalled1.equals(marshalled2));
+ assertTrue(marshalled2.equals(marshalled1));
+ MarshalledObject<String> marshalled3 =
MarshalledObject.marshall("bar");
+ assertFalse(marshalled1.equals(marshalled3));
+ assertFalse(marshalled3.equals(marshalled1));
+ }
+}