import java.io.*;

import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.annotate.JsonView;

public final class TestViewPerf
{
    /*
    /////////////////////////////////////////////////////
    // Bean classes
    /////////////////////////////////////////////////////
     */

    static class ViewA { }
    static class ViewB { }

    static class ViewBean
    {
        final Bean2 _bean = new Bean2();

        @JsonView({ViewA.class, ViewB.class})
        public Bean2 getBean() { return _bean; }

        @JsonView({ViewB.class, ViewA.class})
        public String getBean2() { return "abc-def"; }

        @JsonView({ViewB.class, ViewA.class})
        public int getBean3() { return 218985; }

        @JsonView({ViewA.class, ViewB.class})
        public Bean2 getBean4() { return _bean; }

        @JsonView({ViewA.class})
        public String getText2() { return "foobar"; }

        @JsonView({ViewA.class})
        public String getText3() { return ".......\n"; }
    }

    static class NonViewBean
    {
        final Bean2 _bean = new Bean2();

        public Bean2 getBean() { return _bean; }
        public String getBean2() { return "abc-def"; }
        public int getBean3() { return 218985; }
        public Bean2 getBean4() { return _bean; }
        public String getText2() { return "foobar"; }
        public String getText3() { return ".......\n"; }
    }

    static class Bean2 {
        public int getX() { return 3; }
        public String getName() { return "foobar"; }
    }

    private final int REPS;
    private final ObjectMapper _mapper;

    private TestViewPerf()
        throws Exception
    {
        _mapper = new ObjectMapper();
        REPS = 2400;
    }

    public void test()
        throws Exception
    {
        int i = 0;

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        final ViewBean viewBean = new ViewBean();
        final NonViewBean nonViewBean = new NonViewBean();

        while (true) {
            try {  Thread.sleep(100L); } catch (InterruptedException ie) { }
            int round = (i++ % 3);

            long curr = System.currentTimeMillis();
            String msg;
            boolean lf = (round == 0);
            int result;

            switch (round) {

            case 0:
                msg = "With view";
                result = testViewSer(viewBean, REPS, out, ViewA.class);
                break;
            case 1:
                msg = "WithOUT view";
                result = testViewSer(viewBean, REPS, out, null);
                break;
            case 2:
                msg = "NO view";
                result = testSer(nonViewBean, REPS, out, null);
                break;

            default:
                throw new Error("Internal error");
            }

            curr = System.currentTimeMillis() - curr;
            if (lf) {
                System.out.println();
            }
            System.out.println("Test '"+msg+"' -> "+curr+" msecs ("
                               +result+").");
        }
    }

    protected int testViewSer(Object value, int reps, ByteArrayOutputStream result, Class<?> view)
        throws Exception
    {
    	ObjectWriter w = _mapper.viewWriter(view);
        for (int i = 0; i < reps; ++i) {
            result.reset();
            w.writeValue(result, value);
            w.writeValue(result, value);
            w.writeValue(result, value);
        }
        return result.size();
    }

    protected int testSer(Object value, int reps, ByteArrayOutputStream result, Class<?> dummyView)
        throws Exception
    {
        for (int i = 0; i < reps; ++i) {
            result.reset();
            _mapper.writeValue(result, value);
            _mapper.writeValue(result, value);
            _mapper.writeValue(result, value);
        }
        return result.size();
    }

    public static void main(String[] args) throws Exception
    {
        new TestViewPerf().test();
    }
}
