/**
*
* Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
*
* This library 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 library 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 library. If not, see <http://www.gnu.org/licenses/>.
*
**/
package lucee.runtime.converter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.io.Writer;
import lucee.commons.io.IOUtil;
import lucee.commons.io.res.Resource;
import lucee.runtime.PageContext;
import lucee.runtime.coder.Base64Coder;
import lucee.runtime.coder.CoderException;
/**
*
*/
public final class JavaConverter extends ConverterSupport implements BinaryConverter {
@Override
public void writeOut(PageContext pc, Object source, Writer writer) throws ConverterException, IOException {
if(!(source instanceof Serializable))throw new ConverterException("Java Object is not of type Serializable");
writer.write(serialize((Serializable)source));
writer.flush();
}
@Override
public void writeOut(PageContext pc, Object source, OutputStream os) throws ConverterException, IOException {
if(!(source instanceof Serializable))throw new ConverterException("Java Object is not of type Serializable");
serialize((Serializable)source, os);
os.flush();
}
/**
* serialize a Java Object of Type Serializable
* @param o
* @return serialized String
* @throws IOException
*/
public static String serialize(Serializable o) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serialize(o, baos);
return Base64Coder.encode(baos.toByteArray());
}
public static byte[] serializeAsBinary(Serializable o) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serialize(o, baos);
return baos.toByteArray();
}
public static void serialize(Serializable o, lucee.commons.io.res.Resource out) throws IOException {
serialize(o,out.getOutputStream());
}
public static void serialize(Serializable o, OutputStream os) throws IOException {
ObjectOutputStream oos=null;
try {
oos = new ObjectOutputStream(os);
oos.writeObject(o);
}
finally {
IOUtil.closeEL(oos);
IOUtil.closeEL(os);
}
}
/**
* unserialize a serialized Object
* @param str
* @return unserialized Object
* @throws IOException
* @throws ClassNotFoundException
* @throws CoderException
*/
public static Object deserialize(String str) throws IOException, ClassNotFoundException, CoderException {
ByteArrayInputStream bais = new ByteArrayInputStream(Base64Coder.decode(str));
return deserialize(bais);
}
public static Object deserialize(InputStream is) throws IOException, ClassNotFoundException {
ObjectInputStream ois=null;
Object o=null;
try {
ois = new ObjectInputStream(is);
o=ois.readObject();
}
finally {
IOUtil.closeEL(ois);
}
return o;
}
public static Object deserialize(Resource res) throws IOException, ClassNotFoundException {
return deserialize(res.getInputStream());
}
}