/*******************************************************************************
 * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *      Oracle - initial impl
 ******************************************************************************/
package example;

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

//import oracle.toplink.exalogic.serializers.POFReflectionSerializer;

//import org.eclipse.persistence.expressions.ExpressionBuilder;
//import org.eclipse.persistence.queries.ReadAllQuery;

//import com.tangosol.io.pof.PortableObjectSerializer;
//import com.tangosol.io.pof.SimplePofContext;

import model.Order;
import model.OrderLine;

/**
 * Test the performance of various different serialization formats and objects.
 * @author James Sutherland
 */
public class Test extends PerformanceTest {
    public static interface Factory {
        Object create();
    }

    public static void main(String[] args) throws Exception {
        try {
            Test test = new Test();
            test.test();
        } catch (Exception error) {
            error.printStackTrace();
        }
    }
    
    public void test() {
        Factory factory = new Factory() {
            public Object create() {
                Order order = new Order();
                //for (int index = 0; index < 100; index++) {
                    order.addOrderLine(new OrderLine());
                    //order.getOrderLines().add(new OrderLine());
                //}
                return order;
                //ReadAllQuery query = new ReadAllQuery(Order.class);
                //query.setSelectionCriteria(new ExpressionBuilder().get("id").equal(100));
                //return query;
            }
        };

        //SimplePofContext simpleContext = new SimplePofContext();
        //simpleContext.registerUserType(1, Order.class, new POFReflectionSerializer(Order.class));
        //simpleContext.registerUserType(2, OrderLine.class, new POFReflectionSerializer(OrderLine.class));
        //simpleContext.setReferenceEnabled(true);
        //POFSerializer pofReflect = new POFSerializer(simpleContext);

        byte[] bytes = null;
        Object object = null;
        //POFSerializer pof = new POFSerializer();
        //bytes = pof.serialize(factory.create());
        //object = pof.deserialize(bytes);
        KryoSerializer kyro = new KryoSerializer();
        bytes = kyro.serialize(factory.create());
        object = kyro.deserialize(bytes);
        JSONSerializer json = new JSONSerializer();
        bytes = json.serialize(factory.create());
        object = json.deserialize(bytes);
        XMLSerializer xml = new XMLSerializer();
        bytes = xml.serialize(factory.create());
        object = xml.deserialize(bytes);
        JavaSerializer java = new JavaSerializer();
        bytes = java.serialize(factory.create());
        object = java.deserialize(bytes);
        //DatabaseSerializer db = new DatabaseSerializer();
        //bytes = db.serialize(factory.create());
        //object = db.deserialize(bytes);

        //JOptionPane.showMessageDialog(null, "Start");
        
        List<List> results = new ArrayList<List>();
        //results.add(testSerialization("order-POF-reflect", factory, pofReflect));
        //results.add(testSerialization("order-POF", factory, pof));
        results.add(testSerialization("order-JSON", factory, json));
        results.add(testSerialization("order-XML", factory, xml));
        //results.add(testSerialization("order-Database", factory, db));
        results.add(testSerialization("order-Kryo", factory, kyro));
        results.add(testSerialization("order-Java", factory, java));
        //testSerialization("empty-HashMap", new HashMap(), new JavaSerializer());
        //testSerialization("empty-ArrayList", new ArrayList(), new JavaSerializer());
        //testSerialization("Class", JFormattedTextField.class, new JavaSerializer());

        //JOptionPane.showMessageDialog(null, "Finish");
        
        for (List result : results) {
            for (int index = 0; index < result.size(); index = index + 3) {
                System.out.println("");
                System.out.println(((PerformanceResult)result.get(index)).testName + " : " + ((PerformanceResult)result.get(index)).average);
                System.out.println(((PerformanceResult)result.get(index+ 1)).testName + " : " + ((PerformanceResult)result.get(index + 1)).average);
                System.out.println("Size: " + result.get(index + 2));
            }
        }
    }
    
    public List testSerialization(String testName, final Factory factory, final Serializer serializer) {
        List result = new ArrayList();
        System.out.println("\n\nbegin test " + testName);
        result.add(this.executeRun(testName + "-serialize", new Runnable() {
            public void run() {
                serializer.serialize(factory.create());
            }
        }));
        final byte[] bytes = serializer.serialize(factory.create());
        result.add(this.executeRun(testName + "-deserialize", new Runnable() {
            public void run() {
                serializer.deserialize(bytes);
            }
        }));
        result.add(bytes.length);
        System.out.println("serialization size: " + bytes.length + " bytes");
        StringWriter writer = new StringWriter();
        for (int index = 0; index < bytes.length; index++) {
            char c = (char)bytes[index];
            if (c == '<') {
                writer.write("&lt;");                
            } else if (c == '>') {
                writer.write("&gt;");                
            } else if (c < 32 || c > 126) {
                writer.write('-');
            } else {
                writer.write(c);
            }
        }
        System.out.println("\nserialization bytes:\n" + writer.toString());
        System.out.println("\nfinish test " + testName);
        return result;
    }

}
