Home | History | Annotate | Download | only in util
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package tests.util;
     19 
     20 import java.io.ByteArrayInputStream;
     21 import java.io.ByteArrayOutputStream;
     22 import java.io.File;
     23 import java.io.FileOutputStream;
     24 import java.io.IOException;
     25 import java.io.InputStream;
     26 import java.io.ObjectInputStream;
     27 import java.io.ObjectOutputStream;
     28 import java.io.OutputStream;
     29 import java.net.URL;
     30 
     31 /**
     32  * This class simplifies the serialization test.
     33  *
     34  */
     35 public class SerializationTester {
     36 
     37 	/*
     38 	 * --------------------------------------------------------------------
     39 	 * Class variables
     40 	 * --------------------------------------------------------------------
     41 	 */
     42 
     43 	// the last deserialized object
     44 	private static Object lastOutput = null;
     45 
     46 	/*
     47 	 * -------------------------------------------------------------------
     48 	 * Constructors
     49 	 * -------------------------------------------------------------------
     50 	 */
     51 
     52 	private SerializationTester() {
     53 
     54 	}
     55 
     56 	/*
     57 	 * -------------------------------------------------------------------
     58 	 * Methods
     59 	 * -------------------------------------------------------------------
     60 	 */
     61 
     62 	/**
     63 	 * Serialize an object and then deserialize it.
     64 	 *
     65 	 * @param inputObject
     66 	 *            the input object
     67 	 * @return the deserialized object
     68 	 */
     69 	public static Object getDeserilizedObject(Object inputObject)
     70 			throws IOException, ClassNotFoundException {
     71 		ByteArrayOutputStream bos = new ByteArrayOutputStream();
     72 		ObjectOutputStream oos = new ObjectOutputStream(bos);
     73 		oos.writeObject(inputObject);
     74 		oos.close();
     75 
     76 		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
     77 		ObjectInputStream ois = new ObjectInputStream(bis);
     78 		Object outputObject = ois.readObject();
     79 		lastOutput = outputObject;
     80 		ois.close();
     81 		return outputObject;
     82 	}
     83 
     84 	/**
     85 	 * Tests the serialization and deserialization of const objects.
     86 	 *
     87 	 * @param inputObject
     88 	 *            A const object
     89 	 * @return true if the deserialized object is the same as the input object,
     90 	 *         otherwise false
     91 	 * @throws Exception
     92 	 *             If any occurs.
     93 	 */
     94 	public static boolean assertSame(Object inputObject) throws Exception {
     95 		return inputObject == getDeserilizedObject(inputObject);
     96 	}
     97 
     98 	/**
     99 	 * Tests the serialization and deserialization of instance objects.
    100 	 *
    101 	 * @param inputObject
    102 	 *            An object
    103 	 * @return true if the deserialized object is equal to the input object,
    104 	 *         otherwise false
    105 	 * @throws Exception
    106 	 *             If any occurs.
    107 	 */
    108 	public static boolean assertEquals(Object inputObject) throws Exception {
    109 		return inputObject.equals(getDeserilizedObject(inputObject));
    110 	}
    111 
    112 	/**
    113 	 * Tests the serialization compatibility with reference const objects.
    114 	 *
    115 	 * @param obj
    116 	 *            the object to be checked
    117 	 * @param fileName
    118 	 *            the serialization output file generated by reference
    119 	 * @return true if compatible, otherwise false
    120 	 * @throws Exception
    121 	 *             If any occurs.
    122 	 */
    123 	public static boolean assertCompabilitySame(Object obj, String fileName)
    124 			throws Exception {
    125 		return obj == readObject(obj, fileName);
    126 	}
    127 
    128 	/**
    129 	 * Tests the serialization compatibility with reference for instance
    130 	 * objects.
    131 	 *
    132 	 * @param obj
    133 	 *            the object to be checked
    134 	 * @param fileName
    135 	 *            the serialization output file generated by reference
    136 	 * @return true if compatible, otherwise false
    137 	 * @throws Exception
    138 	 *             If any occurs.
    139 	 */
    140 	public static boolean assertCompabilityEquals(Object obj, String fileName)
    141 			throws Exception {
    142 		return obj.equals(readObject(obj, fileName));
    143 	}
    144 
    145 	/**
    146 	 * Deserialize an object from a file.
    147 	 *
    148 	 * @param obj
    149 	 *            the object to be serialized if no serialization file is found
    150 	 * @param fileName
    151 	 *            the serialization file
    152 	 * @return the deserialized object
    153 	 * @throws Exception
    154 	 *             If any occurs.
    155 	 */
    156 	public static Object readObject(Object obj, String fileName)
    157 			throws Exception {
    158 		InputStream input = null;
    159 		ObjectInputStream oinput = null;
    160 		URL url = SerializationTester.class.getClassLoader().getResource(
    161 				fileName);
    162 		if (null == url) {
    163 			// serialization file does not exist, create one in the current dir
    164 			writeObject(obj, new File(fileName).getName());
    165 			throw new Error(
    166 					"Serialization file does not exist, created in the current dir.");
    167 		}
    168 		input = url.openStream();
    169 		try {
    170 			oinput = new ObjectInputStream(input);
    171 			Object newObj = oinput.readObject();
    172 			return newObj;
    173 		} finally {
    174 			try {
    175 				if (null != oinput) {
    176 					oinput.close();
    177 				}
    178 			} catch (Exception e) {
    179 				// ignore
    180 			}
    181 			try {
    182 				if (null != input) {
    183 					input.close();
    184 				}
    185 			} catch (Exception e) {
    186 				// ignore
    187 			}
    188 		}
    189 	}
    190 
    191 	/*
    192 	 * Creates a serialization output.
    193 	 *
    194 	 * @param obj the object to be serialized @param fileName the output file
    195 	 * @throws Exception If any occurs.
    196 	 */
    197 	public static void writeObject(Object obj, String fileName)
    198 			throws Exception {
    199 		// String path = SerializationTester.class.getResource(".").getPath();
    200 		// if (path.endsWith(".")) {
    201 		// path = path.substring(0, path.length() - 1);
    202 		// }
    203 		// if (!path.endsWith("/")) {
    204 		// path += "/";
    205 		// }
    206 		// path += fileName;
    207 		// System.out.println(path);
    208 		OutputStream output = null;
    209 		ObjectOutputStream ooutput = null;
    210 		try {
    211 			output = new FileOutputStream(fileName);
    212 			ooutput = new ObjectOutputStream(output);
    213 			ooutput.writeObject(obj);
    214 		} finally {
    215 			try {
    216 				if (null != ooutput) {
    217 					ooutput.close();
    218 				}
    219 			} catch (Exception e) {
    220 				// ignore
    221 			}
    222 			try {
    223 				if (null != output) {
    224 					output.close();
    225 				}
    226 			} catch (Exception e) {
    227 				// ignore
    228 			}
    229 		}
    230 	}
    231 
    232 	/**
    233 	 * Gets the last deserialized object.
    234 	 *
    235 	 * @return the last deserialized object
    236 	 */
    237 	public static Object getLastOutput() {
    238 		return lastOutput;
    239 	}
    240 
    241 	/*
    242 	 * For test purpose.
    243 	 */
    244 	public static void main(String[] args) {
    245 	}
    246 }
    247