Fixing [JACKSON-62], NPE with JsonMappingException, getMessage().
diff --git a/src/perf/TestSerPerf.java b/src/perf/TestSerPerf.java
new file mode 100644
index 0000000..35b5d05
--- /dev/null
+++ b/src/perf/TestSerPerf.java
@@ -0,0 +1,135 @@
+import java.io.*;
+
+import org.codehaus.jackson.*;
+import org.codehaus.jackson.map.*;
+import org.codehaus.jackson.util.BufferRecycler;
+
+public final class TestSerPerf
+{
+ /*
+ /////////////////////////////////////////////////////
+ // Bean classes
+ /////////////////////////////////////////////////////
+ */
+
+ class NonFinalBean {
+ final NonFinalBean2 _bean = new NonFinalBean2();
+
+ public NonFinalBean2 getBean() { return _bean; }
+ public NonFinalBean2 getBean2() { return _bean; }
+ public NonFinalBean2 getBean3() { return _bean; }
+ public NonFinalBean2 getBean4() { return _bean; }
+ }
+
+ class NonFinalBean2 {
+ public int getX() { return 3; }
+ public String getName() { return "foobar"; }
+ }
+
+ final class FinalBean {
+ final FinalBean2 _bean = new FinalBean2();
+
+ public FinalBean2 getBean() { return _bean; }
+ public FinalBean2 getBean2() { return _bean; }
+ public FinalBean2 getBean3() { return _bean; }
+ public FinalBean2 getBean4() { return _bean; }
+ }
+
+ final class FinalBean2 extends NonFinalBean2 { }
+
+ private final int REPS;
+
+ private final static int TEST_PER_GC = 15;
+
+ final Object _finalBean = new FinalBean();
+ final Object _nonFinalBean = new NonFinalBean();
+
+ public TestSerPerf()
+ throws Exception
+ {
+ // Let's try to guestimate suitable size... to get to 50 megs processed
+ REPS = 40000;
+ }
+
+ public void test()
+ throws Exception
+ {
+ int i = 0;
+ int sum = 0;
+
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ // Let's create tree from objects
+ testObjectSer(_finalBean, 1, result);
+ final JsonNode _tree = new TreeMapper().readTree(result.toByteArray());
+
+ while (true) {
+ try { Thread.sleep(100L); } catch (InterruptedException ie) { }
+ int round = (i++ % 3);
+
+ long curr = System.currentTimeMillis();
+ String msg;
+ boolean lf = (round == 0);
+
+ switch (round) {
+
+ case 0:
+ msg = "Jackson, object, final";
+ sum += testObjectSer(_finalBean, REPS, result);
+ break;
+ case 1:
+ msg = "Jackson, object, nonfinal";
+ sum += testObjectSer(_nonFinalBean, REPS, result);
+ break;
+ case 2:
+ msg = "Jackson, tree";
+ sum += testTreeSer(_tree, REPS, result);
+ break;
+ default:
+ throw new Error("Internal error");
+ }
+
+ curr = System.currentTimeMillis() - curr;
+ if (lf) {
+ System.out.println();
+ }
+ System.out.println("Test '"+msg+"' -> "+curr+" msecs ("
+ +(sum & 0xFF)+").");
+
+
+ if ((i % TEST_PER_GC) == 0) {
+ System.out.println("[GC]");
+ try { Thread.sleep(100L); } catch (InterruptedException ie) { }
+ System.gc();
+ try { Thread.sleep(100L); } catch (InterruptedException ie) { }
+ }
+ }
+ }
+
+ protected int testObjectSer(Object value, int reps, ByteArrayOutputStream result)
+ throws Exception
+ {
+ ObjectMapper mapper = new ObjectMapper();
+ for (int i = 0; i < reps; ++i) {
+ result.reset();
+ mapper.writeValue(result, value);
+ }
+ return mapper.hashCode(); // just to get some non-optimizable number
+ }
+
+ protected int testTreeSer(JsonNode value, int reps, ByteArrayOutputStream result)
+ throws Exception
+ {
+ TreeMapper mapper = new TreeMapper();
+ for (int i = 0; i < reps; ++i) {
+ result.reset();
+ mapper.writeTree(value, result);
+ }
+ return mapper.hashCode(); // just to get some non-optimizable number
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ new TestSerPerf().test();
+ }
+}