jdk/test/java/beans/XMLEncoder/AbstractTest.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/XMLEncoder/AbstractTest.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2006-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code 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 General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.beans.ExceptionListener;
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import java.nio.charset.Charset;
+
+abstract class AbstractTest<T> implements ExceptionListener {
+    private final BeanValidator validator = new BeanValidator();
+
+    public final void exceptionThrown(Exception exception) {
+        throw new Error("unexpected exception", exception);
+    }
+
+    /**
+     * Returns an object to test.
+     * This object will be encoded and decoded
+     * and the object creation will be tested.
+     *
+     * @return an object to test
+     */
+    protected abstract T getObject();
+
+    /**
+     * Returns a different object to test.
+     * If this object is not {@code null}
+     * it will be encoded and decoded
+     * and the object updating will be tested.
+     *
+     * @return a different object to test
+     */
+    protected T getAnotherObject() {
+        return null;
+    }
+
+    /**
+     * This method should be overriden
+     * if specified encoder should be initialized.
+     *
+     * @param encoder  the XML encoder to initialize
+     */
+    protected void initialize(XMLEncoder encoder) {
+    }
+
+    /**
+     * This method should be overriden
+     * if specified decoder should be initialized.
+     *
+     * @param decoder  the XML decoder to initialize
+     */
+    protected void initialize(XMLDecoder decoder) {
+    }
+
+    /**
+     * This method should be overriden
+     * for test-specific comparison.
+     *
+     * @param before  the object before encoding
+     * @param after   the object after decoding
+     */
+    protected void validate(T before, T after) {
+        this.validator.validate(before, after);
+    }
+
+    /**
+     * This is entry point to start testing.
+     *
+     * @param security  use {@code true} to start
+     *                  second pass in secure context
+     */
+    final void test(boolean security) {
+        Bean.DEFAULT = null;
+        T object = getObject();
+
+        System.out.println("Test object");
+        validate(object, testObject(object));
+
+        System.out.println("Test object creating");
+        validate(object, testBean(object));
+
+        Bean.DEFAULT = object;
+        object = getAnotherObject();
+        if (object != null) {
+            System.out.println("Test another object");
+            validate(object, testObject(object));
+
+            System.out.println("Test object updating");
+            validate(object, testBean(object));
+        }
+        if (security) {
+            System.setSecurityManager(new SecurityManager());
+            test(false);
+        }
+    }
+
+    private T testBean(T object) {
+        Bean bean = new Bean();
+        bean.setValue(object);
+        bean = testObject(bean);
+        return (T) bean.getValue();
+    }
+
+    private <Z> Z testObject(Z object) {
+        byte[] array = writeObject(object);
+        System.out.print(new String(array, Charset.forName("UTF-8")));
+        return (Z) readObject(array);
+    }
+
+    private byte[] writeObject(Object object) {
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        XMLEncoder encoder = new XMLEncoder(output);
+        initialize(encoder);
+        encoder.writeObject(object);
+        encoder.close();
+        return output.toByteArray();
+    }
+
+    private Object readObject(byte[] array) {
+        ByteArrayInputStream input = new ByteArrayInputStream(array);
+        XMLDecoder decoder = new XMLDecoder(input);
+        initialize(decoder);
+        Object object = decoder.readObject();
+        decoder.close();
+        return object;
+    }
+}