001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999-2004 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: MarshallTool.java 9901 2006-12-18 16:31:33Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas_ejb.lib;
025:
026: import java.io.ByteArrayInputStream;
027: import java.io.ByteArrayOutputStream;
028: import java.io.IOException;
029: import java.io.InputStream;
030: import java.io.ObjectInputStream;
031: import java.io.ObjectOutputStream;
032: import java.io.ObjectStreamClass;
033: import java.io.Serializable;
034:
035: /**
036: * Contains static methods to marshall/unmarshall objects to/from a byte[]
037: *
038: * @author Vincent Trussart (vincent@linuxfreak.com) : Initial developer
039: * @author Helene Joanin
040: */
041:
042: public class MarshallTool {
043:
044: /**
045: * Converts an instance of java.io.Serializable to a serialized byte array
046: * @param o Object to serialize
047: * @return byte array containing the serialization of the Serializable object
048: * @throws IOException in error case
049: */
050: public static synchronized byte[] toBytes(Serializable o)
051: throws IOException {
052:
053: ByteArrayOutputStream bas = new ByteArrayOutputStream();
054: ObjectOutputStream oos = new ObjectOutputStream(bas);
055:
056: oos.writeObject(o);
057: oos.close();
058:
059: return bas.toByteArray();
060: }
061:
062: /**
063: * Converts byte array to an instance of java.io.Serializable
064: * @param bytes A byte array containing the a serialized object
065: * @return the unmarshalled object
066: * @throws IOException in error case
067: * @throws ClassNotFoundException in error case
068: */
069: public static synchronized Serializable fromBytes(byte[] bytes)
070: throws IOException, ClassNotFoundException {
071:
072: /**
073: * Specialization of the java.io.ObjectInputStream to re-implement the
074: * resolveClass method
075: */
076: class SpecializedOIS extends ObjectInputStream {
077:
078: /**
079: * Default constructor
080: * @param is input stream to read from
081: * @throws IOException in error case
082: */
083: SpecializedOIS(InputStream is) throws IOException {
084: super (is);
085: }
086:
087: /**
088: * Load the local class equivalent of the specified stream class
089: * description using the context class loader.
090: * @param osc an instance of class ObjectStreamClass
091: * @return a Class object corresponding to the osc
092: * @throws IOException in error case
093: * @throws ClassNotFoundException in error case
094: */
095: protected Class resolveClass(ObjectStreamClass osc)
096: throws IOException, ClassNotFoundException {
097: try {
098: return super .resolveClass(osc);
099: } catch (ClassNotFoundException e) {
100: // Use the thread classloader
101: return Class.forName(osc.getName(), false, Thread
102: .currentThread().getContextClassLoader());
103: }
104: }
105: }
106:
107: if (bytes == null) {
108: return null;
109: }
110:
111: ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
112: SpecializedOIS sois = new SpecializedOIS(bis);
113: return (Serializable) sois.readObject();
114: }
115:
116: }
|