/*
 * JBoss, the OpenSource J2EE webOS
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */

package org.jboss.cache.marshall;

import org.jboss.util.stream.MarshalledValueInputStream;
import org.jboss.util.stream.MarshalledValueOutputStream;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

/**
 * Utility methods related to marshalling and unmarshalling objects.
 *
 * @author <a href="mailto://brian.stansberry@jboss.com">Brian Stansberry</a>
 * @version $Revision$
 */
public class MarshallUtil
{

    /**
     * Creates an object from a byte buffer using
     * {@link MarshalledValueInputStream}.
     *
     * @param bytes serialized form of an object
     * @return the object, or <code>null</code> if <code>bytes</code>
     *         is <code>null</code>
     */
    public static Object objectFromByteBuffer(byte[] bytes) throws Exception
    {
        if (bytes == null)
        {
            return null;
        }

        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        MarshalledValueInputStream input = new MarshalledValueInputStream(bais);
        Object result = input.readObject();
        input.close();
        return result;
    }

    /**
     * Creates an object from a byte buffer using
     * {@link MarshalledValueInputStream}.
     *
     * @param bytes serialized form of an object
     * @return the object, or <code>null</code> if <code>bytes</code>
     *         is <code>null</code>
     */
    public static Object objectFromByteBuffer(InputStream bytes) throws Exception
    {
        if (bytes == null)
        {
            return null;
        }

        MarshalledValueInputStream input = new MarshalledValueInputStream(bytes);
        Object result = input.readObject();
        input.close();
        return result;
    }

    /**
     * Serializes an object into a byte buffer using
     * {@link org.jboss.util.stream.MarshalledValueOutputStream}.
     *
     * @param obj an object that implements Serializable or Externalizable
     * @return serialized form of the object
     */
    public static byte[] objectToByteBuffer(Object obj) throws Exception
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        MarshalledValueOutputStream out = new MarshalledValueOutputStream(baos);
        out.writeObject(obj);
        out.close();
        return baos.toByteArray();
    }

}
