/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package tests.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.URL;
/**
* This class simplifies the serialization test.
*/
public class SerializationTester {
/*
* --------------------------------------------------------------------
* Class variables
* --------------------------------------------------------------------
*/
// the last deserialized object
private static Object lastOutput = null;
/*
* -------------------------------------------------------------------
* Constructors
* -------------------------------------------------------------------
*/
private SerializationTester() {
}
/*
* -------------------------------------------------------------------
* Methods
* -------------------------------------------------------------------
*/
/**
* Serialize an object and then deserialize it.
*
* @param inputObject the input object
* @return the deserialized object
*/
public static Object getDeserilizedObject(Object inputObject)
throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(inputObject);
oos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
Object outputObject = ois.readObject();
lastOutput = outputObject;
ois.close();
return outputObject;
}
/**
* Tests the serialization and deserialization of const objects.
*
* @param inputObject A const object
* @return true if the deserialized object is the same as the input object,
* otherwise false
* @throws Exception If any occurs.
*/
public static boolean assertSame(Object inputObject) throws Exception {
return inputObject == getDeserilizedObject(inputObject);
}
/**
* Tests the serialization and deserialization of instance objects.
*
* @param inputObject An object
* @return true if the deserialized object is equal to the input object,
* otherwise false
* @throws Exception If any occurs.
*/
public static boolean assertEquals(Object inputObject) throws Exception {
return inputObject.equals(getDeserilizedObject(inputObject));
}
/**
* Tests the serialization compatibility with reference const objects.
*
* @param obj the object to be checked
* @param fileName the serialization output file generated by reference
* @return true if compatible, otherwise false
* @throws Exception If any occurs.
*/
public static boolean assertCompabilitySame(Object obj, String fileName)
throws Exception {
return obj == readObject(obj, fileName);
}
/**
* Tests the serialization compatibility with reference for instance
* objects.
*
* @param obj the object to be checked
* @param fileName the serialization output file generated by reference
* @return true if compatible, otherwise false
* @throws Exception If any occurs.
*/
public static boolean assertCompabilityEquals(Object obj, String fileName)
throws Exception {
return obj.equals(readObject(obj, fileName));
}
/**
* Deserialize an object from a file.
*
* @param obj the object to be serialized if no serialization file is found
* @param fileName the serialization file
* @return the deserialized object
* @throws Exception If any occurs.
*/
public static Object readObject(Object obj, String fileName)
throws Exception {
InputStream input = null;
ObjectInputStream oinput = null;
URL url = SerializationTester.class.getClassLoader().getResource(
fileName);
if (null == url) {
// serialization file does not exist, create one in the current dir
writeObject(obj, new File(fileName).getName());
throw new Error(
"Serialization file does not exist, created in the current dir.");
}
input = url.openStream();
try {
oinput = new ObjectInputStream(input);
Object newObj = oinput.readObject();
return newObj;
} finally {
try {
if (null != oinput) {
oinput.close();
}
} catch (Exception e) {
// ignore
}
try {
if (null != input) {
input.close();
}
} catch (Exception e) {
// ignore
}
}
}
/*
* Creates a serialization output.
*
* @param obj the object to be serialized @param fileName the output file
* @throws Exception If any occurs.
*/
public static void writeObject(Object obj, String fileName)
throws Exception {
// String path = SerializationTester.class.getResource(".").getPath();
// if (path.endsWith(".")) {
// path = path.substring(0, path.length() - 1);
// }
// if (!path.endsWith("/")) {
// path += "/";
// }
// path += fileName;
// System.out.println(path);
OutputStream output = null;
ObjectOutputStream ooutput = null;
try {
output = new FileOutputStream(fileName);
ooutput = new ObjectOutputStream(output);
ooutput.writeObject(obj);
} finally {
try {
if (null != ooutput) {
ooutput.close();
}
} catch (Exception e) {
// ignore
}
try {
if (null != output) {
output.close();
}
} catch (Exception e) {
// ignore
}
}
}
/**
* Gets the last deserialized object.
*
* @return the last deserialized object
*/
public static Object getLastOutput() {
return lastOutput;
}
/*
* For test purpose.
*/
public static void main(String[] args) {
}
}