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.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