/* ############################################################################### # # # Copyright (C) 2011-2016 OpenMEAP, Inc. # # Credits to Jonathan Schang & Rob Thacher # # # # Released under the LGPLv3 # # # # OpenMEAP is free software: you can redistribute it and/or modify # # it under the terms of the GNU Lesser General Public License as published # # by the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # OpenMEAP 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 Lesser General Public License for more details. # # # # You should have received a copy of the GNU Lesser General Public License # # along with OpenMEAP. If not, see <http://www.gnu.org/licenses/>. # # # ############################################################################### */ package com.openmeap.json; import java.util.Hashtable; import java.util.Vector; import junit.framework.Assert; import junit.framework.TestCase; import com.openmeap.thirdparty.org.json.me.JSONObject; public class JSONObjectBuilderTest extends TestCase { static public class Types implements Enum { static final public Types ONE = new Types("ONE"); static final public Types TWO = new Types("TWO"); static final private Types[] constants = new Types[] { ONE, TWO }; private final String value; private Types(String v) { value = v; } public Enum[] getStaticConstants() { return constants; } public String value() { return value; } static public Types[] values() { return (Types[])ONE.getStaticConstants(); } static public Types fromValue(String v) { return (Types)EnumUtils.fromValue(ONE, v); } } static public class RootClass implements HasJSONProperties { private final static JSONProperty[] jsonProperties = new JSONProperty[] { new JSONProperty("child",BranchClass.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getChild(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setChild((BranchClass)value); } }), new JSONProperty("stringValue",String.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getStringValue(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setStringValue((String)value); } }), new JSONProperty("stringArrayValue",String[].class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getStringArrayValue(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setStringArrayValue((String[])value); } }), new JSONProperty("longValue",Long.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getLongValue(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setLongValue((Long)value); } }), new JSONProperty("integerValue",Integer.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getIntegerValue(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setIntegerValue((Integer)value); } }), new JSONProperty("doubleValue",Double.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getDoubleValue(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setDoubleValue((Double)value); } }), new JSONProperty("hashTable",Hashtable.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getHashTable(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setHashTable((Hashtable)value); } }), new JSONProperty("vector",Vector.class,Long.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((RootClass)src).getVector(); } public void setValue(Object dest, Object value) { ((RootClass)dest).setVector((Vector)value); } }) }; public JSONProperty[] getJSONProperties() { return jsonProperties; } private BranchClass child; private String stringValue; private String[] stringArrayValue; private Long longValue; private Integer integerValue; private Double doubleValue; private Hashtable hashTable; private Vector vector; public Hashtable getHashTable() { return hashTable; } public void setHashTable(Hashtable hashTable) { this.hashTable = hashTable; } public Vector getVector() { return vector; } public void setVector(Vector vector) { this.vector = vector; } public BranchClass getChild() { return child; } public void setChild(BranchClass child) { this.child = child; } public String getStringValue() { return stringValue; } public void setStringValue(String stringValue) { this.stringValue = stringValue; } public String[] getStringArrayValue() { return stringArrayValue; } public void setStringArrayValue(String[] stringArrayValue) { this.stringArrayValue = stringArrayValue; } public Long getLongValue() { return longValue; } public void setLongValue(Long longValue) { this.longValue = longValue; } public Integer getIntegerValue() { return integerValue; } public void setIntegerValue(Integer integerValue) { this.integerValue = integerValue; } public Double getDoubleValue() { return doubleValue; } public void setDoubleValue(Double doubleValue) { this.doubleValue = doubleValue; } } static public class BranchClass implements HasJSONProperties { private String string; private Types typeOne; private Types typeTwo; private final static JSONProperty[] jsonProperties = new JSONProperty[] { new JSONProperty("string",String.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((BranchClass)src).getString(); } public void setValue(Object dest, Object value) { ((BranchClass)dest).setString((String)value); } }), new JSONProperty("typeOne",Types.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((BranchClass)src).getTypeOne(); } public void setValue(Object dest, Object value) { ((BranchClass)dest).setTypeOne(Types.fromValue((String)value)); } }), new JSONProperty("typeTwo",Types.class, new JSONGetterSetter(){ public Object getValue(Object src) { return ((BranchClass)src).getTypeTwo(); } public void setValue(Object dest, Object value) { ((BranchClass)dest).setTypeTwo(Types.fromValue((String)value)); } }) }; public JSONProperty[] getJSONProperties() { return jsonProperties; } public String getString() { return string; } public void setString(String string) { this.string = string; } public Types getTypeOne() { return typeOne; } public void setTypeOne(Types typeOne) { this.typeOne = typeOne; } public Types getTypeTwo() { return typeTwo; } public void setTypeTwo(Types typeTwo) { this.typeTwo = typeTwo; } } public void testToJSON() throws Exception { RootClass root = new RootClass(); root.setDoubleValue(Double.valueOf("3.14")); root.setLongValue(new Long(Long.parseLong("1000"))); root.setIntegerValue(new Integer(Integer.parseInt("2000"))); root.setStringValue("value"); root.setStringArrayValue(new String[]{"value1","value2"}); root.setChild(new BranchClass()); root.getChild().setTypeOne(Types.TWO); root.getChild().setTypeTwo(Types.ONE); root.getChild().setString("child_string"); Hashtable table = new Hashtable(); table.put("key1","value1"); table.put("key2",new Long(1000)); table.put("key3",new Integer(1000)); root.setHashTable(table); Vector vector = new Vector(); vector.add(Long.valueOf(1)); vector.add(Long.valueOf(2)); vector.add(Long.valueOf(3)); root.setVector(vector); JSONObjectBuilder builder = new JSONObjectBuilder(); JSONObject jsonObj = builder.toJSON(root); System.out.println(jsonObj.toString()); Assert.assertEquals( "{\"stringValue\":\"value\",\"vector\":[1,2,3],\"integerValue\":2000," +"\"stringArrayValue\":[\"value1\",\"value2\"]," +"\"hashTable\":{\"key3\":1000,\"key2\":1000,\"key1\":\"value1\"}," +"\"doubleValue\":\"3.14\",\"longValue\":1000," +"\"child\":{\"string\":\"child_string\",\"typeTwo\":\"ONE\",\"typeOne\":\"TWO\"}}", jsonObj.toString() ); RootClass afterRoundTrip = (RootClass)builder.fromJSON(jsonObj,new RootClass()); Assert.assertEquals( builder.toJSON(afterRoundTrip).toString(), jsonObj.toString() ); } }