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
18package tests.util;
19
20import java.io.ByteArrayInputStream;
21import java.io.ByteArrayOutputStream;
22import java.io.File;
23import java.io.FileOutputStream;
24import java.io.IOException;
25import java.io.InputStream;
26import java.io.ObjectInputStream;
27import java.io.ObjectOutputStream;
28import java.io.OutputStream;
29import java.net.URL;
30
31/**
32 * This class simplifies the serialization test.
33 *
34 */
35public 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