From 58755a51a9da08d387f72af56228dce59f971a4a Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Thu, 6 Nov 2014 23:18:20 +1300 Subject: [PATCH] JSON Refactor - compound type support --- src/main/java/com/avaje/ebean/json/EJson.java | 22 +- .../com/avaje/ebean/json/EJsonReader.java | 36 +- .../com/avaje/ebean/json/EJsonWriter.java | 4 + .../avaje/ebean/text/json/JsonContext.java | 58 +-- .../avaje/ebean/text/json/JsonElement.java | 39 -- .../ebean/text/json/JsonElementArray.java | 112 ------ .../ebean/text/json/JsonElementBoolean.java | 63 --- .../ebean/text/json/JsonElementNull.java | 57 --- .../ebean/text/json/JsonElementNumber.java | 67 ---- .../ebean/text/json/JsonElementObject.java | 108 ----- .../ebean/text/json/JsonElementString.java | 71 ---- .../ebean/text/json/JsonReadBeanVisitor.java | 34 -- .../ebean/text/json/JsonReadOptions.java | 71 ---- .../ebean/text/json/JsonValueAdapter.java | 61 --- .../ebean/text/json/JsonWriteBeanVisitor.java | 33 -- .../ebean/text/json/JsonWriteOptions.java | 50 --- .../com/avaje/ebean/text/json/JsonWriter.java | 28 -- .../server/core/DefaultServer.java | 5 - .../server/core/InternalConfiguration.java | 16 +- .../server/deploy/BeanPropertyCompound.java | 34 +- .../server/text/json/DJsonContext.java | 108 ++--- .../text/json/DefaultJsonValueAdapter.java | 4 +- .../server/text/json/InternalJsonParser.java | 23 -- .../text/json/ReadBasicJsonContext.java | 273 ------------- .../server/text/json/ReadJsonContext.java | 177 --------- .../server/text/json/ReadJsonInterface.java | 22 - .../server/text/json/ReadJsonRawReader.java | 107 ----- .../server/text/json/ReadJsonSource.java | 15 - .../text/json/ReadJsonSourceReader.java | 83 ---- .../text/json/ReadJsonSourceString.java | 54 --- .../server/text/json/WriteJson.java | 4 +- .../server/text/json/WriteJsonBuffer.java | 8 - .../text/json/WriteJsonBufferString.java | 40 -- .../text/json/WriteJsonBufferWriter.java | 45 --- .../server/text/json/WriteJsonContext.java | 376 ------------------ .../server/type/CtCompoundType.java | 115 ++---- .../ebeaninternal/server/type/EscapeJson.java | 19 - .../ebeaninternal/server/type/ScalarType.java | 16 +- .../server/type/ScalarTypeBase.java | 27 +- .../server/type/ScalarTypeBaseDate.java | 23 +- .../server/type/ScalarTypeBaseDateTime.java | 21 - .../server/type/ScalarTypeBaseVarchar.java | 15 - .../server/type/ScalarTypeBytesEncrypted.java | 14 - .../server/type/ScalarTypeChar.java | 11 - .../server/type/ScalarTypeCharArray.java | 12 - .../server/type/ScalarTypeClob.java | 98 ++--- .../type/ScalarTypeEncryptedWrapper.java | 15 - .../server/type/ScalarTypeEnumStandard.java | 11 - .../server/type/ScalarTypeInteger.java | 26 +- .../server/type/ScalarTypeString.java | 19 - .../server/type/ScalarTypeTimestamp.java | 1 - .../server/type/ScalarTypeWrapper.java | 20 +- .../java/com/avaje/ebean/json/EJsonTests.java | 48 +++ .../avaje/tests/ddd/iud/TestDPersonEl.java | 71 ++-- .../TestJsonInheritanceDiscriminator.java | 2 +- .../avaje/tests/text/json/TestJsonMap.java | 4 +- .../avaje/tests/text/json/TestJsonSimple.java | 31 +- .../json/TestTextJsonBeanReadVisitor.java | 42 +- ...TextJsonBeanReadVisitorWithCustomJson.java | 105 ----- .../text/json/TestTextJsonInheritance.java | 2 +- .../text/json/TestTextJsonInvokeLazy.java | 2 +- .../json/TestTextJsonReadManyLazyLoad.java | 6 +- .../text/json/TestTextJsonReferenceBean.java | 2 +- .../tests/text/json/TestTextJsonSimple.java | 21 +- .../text/json/TestTextJsonSuperSimple.java | 2 +- .../text/json/TestTextJsonUpdateCascade.java | 5 +- .../text/json/TestTextJsonUtilDateFormat.java | 67 ---- .../tests/update/TestJsonStatelessUpdate.java | 2 +- 68 files changed, 334 insertions(+), 2849 deletions(-) delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonElement.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonElementArray.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonElementBoolean.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonElementNull.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonElementNumber.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonElementObject.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonElementString.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonReadBeanVisitor.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonReadOptions.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonValueAdapter.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonWriteBeanVisitor.java delete mode 100644 src/main/java/com/avaje/ebean/text/json/JsonWriter.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/InternalJsonParser.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/ReadBasicJsonContext.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonContext.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonInterface.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonRawReader.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSource.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceReader.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceString.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBuffer.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferString.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferWriter.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonContext.java delete mode 100644 src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitorWithCustomJson.java delete mode 100644 src/test/java/com/avaje/tests/text/json/TestTextJsonUtilDateFormat.java diff --git a/src/main/java/com/avaje/ebean/json/EJson.java b/src/main/java/com/avaje/ebean/json/EJson.java index 53cde48d6..0582dd546 100644 --- a/src/main/java/com/avaje/ebean/json/EJson.java +++ b/src/main/java/com/avaje/ebean/json/EJson.java @@ -88,13 +88,31 @@ public class EJson { * Parse the json and return as a List or Map. */ public static Object parse(Reader reader) { - return EJsonReader.parse(reader); + return EJsonReader.parse(reader, false); } /** * Parse the json and return as a List or Map. */ public static Object parse(JsonParser parser) { - return EJsonReader.parse(parser); + return EJsonReader.parse(parser, false); + } + + /** + * Parse the json and return the next json value, List or Map. + * This will not consume all the reader content and return once the + * next json object, list or value is read. + */ + public static Object parsePartial(Reader reader) { + return EJsonReader.parse(reader, true); + } + + /** + * Parse the json and return the next json value, List or Map. + * This will not consume all the reader content and return once the + * next json object, list or value is read. + */ + public static Object parsePartial(JsonParser parser) { + return EJsonReader.parse(parser, true); } } diff --git a/src/main/java/com/avaje/ebean/json/EJsonReader.java b/src/main/java/com/avaje/ebean/json/EJsonReader.java index 4d043205c..f2012afe7 100644 --- a/src/main/java/com/avaje/ebean/json/EJsonReader.java +++ b/src/main/java/com/avaje/ebean/json/EJsonReader.java @@ -21,12 +21,12 @@ class EJsonReader { @SuppressWarnings("unchecked") static Map parseObject(Reader reader) { - return (Map) parse(reader); + return (Map) parse(reader, false); } @SuppressWarnings("unchecked") static Map parseObject(JsonParser parser) { - return (Map) parse(parser); + return (Map) parse(parser, false); } @SuppressWarnings("unchecked") @@ -36,43 +36,50 @@ class EJsonReader { @SuppressWarnings("unchecked") static List parseList(Reader reader) { - return (List) parse(reader); + return (List) parse(reader, false); } @SuppressWarnings("unchecked") static List parseList(JsonParser parser) { - return (List) parse(parser); + return (List) parse(parser, false); } static Object parse(String json) { - return parse(new StringReader(json)); + return parse(new StringReader(json), false); } - static Object parse(Reader reader) { - return parse(Json.createParser(reader)); + static Object parse(Reader reader, boolean partial) { + return parse(Json.createParser(reader), partial); } - static Object parse(JsonParser parser) { - return new EJsonReader(parser).parseJson(); + static Object parse(JsonParser parser, boolean partial) { + return new EJsonReader(parser, partial).parseJson(); } private final JsonParser parser; + private final boolean partial; + + private int depth; + private Stack stack; private Context currentContext; - EJsonReader(JsonParser parser) { + EJsonReader(JsonParser parser, boolean partial) { this.parser = parser; + this.partial = partial; } private void startArray() { + depth++; stack.push(currentContext); currentContext = new ArrayContext(); } private void startObject() { + depth++; stack.push(currentContext); currentContext = new ObjectContext(); } @@ -86,6 +93,7 @@ class EJsonReader { } private void end() { + depth--; if (!stack.isEmpty()) { //if (currentContext != null) { @@ -127,6 +135,12 @@ class EJsonReader { // process the rest of the object or array while (parser.hasNext()) { processEvent(parser.next()); + + if (partial && depth == 0) { + // completed the object/array + return currentContext.getValue(); + } + } return currentContext.getValue(); @@ -219,7 +233,7 @@ class EJsonReader { private static final class Stack { private Context head; - + private void push(Context context) { if (context != null) { context.next = head; diff --git a/src/main/java/com/avaje/ebean/json/EJsonWriter.java b/src/main/java/com/avaje/ebean/json/EJsonWriter.java index d378326d5..16a58aed7 100644 --- a/src/main/java/com/avaje/ebean/json/EJsonWriter.java +++ b/src/main/java/com/avaje/ebean/json/EJsonWriter.java @@ -64,6 +64,10 @@ class EJsonWriter { } else if (object instanceof String) { writeString(name, (String) object); + } else if (object instanceof Map.Entry) { + Map.Entry entry = (Map.Entry)object; + writeJson(entry.getKey().toString(), entry.getValue()); + } else { writeString(name, object.toString()); } diff --git a/src/main/java/com/avaje/ebean/text/json/JsonContext.java b/src/main/java/com/avaje/ebean/text/json/JsonContext.java index 17dc030ec..a453c9231 100644 --- a/src/main/java/com/avaje/ebean/text/json/JsonContext.java +++ b/src/main/java/com/avaje/ebean/text/json/JsonContext.java @@ -22,49 +22,27 @@ public interface JsonContext { */ public T toBean(Class rootType, Reader json); - /** - * Convert json string input into a Bean of a specific type with options. - */ - public T toBean(Class rootType, String json, JsonReadOptions options); - - /** - * Convert json reader input into a Bean of a specific type with options. - */ - public T toBean(Class rootType, Reader json, JsonReadOptions options); - /** * Convert json string input into a list of beans of a specific type. */ public List toList(Class rootType, String json); - /** - * Convert json string input into a list of beans of a specific type with - * options. - */ - public List toList(Class rootType, String json, JsonReadOptions options); - /** * Convert json reader input into a list of beans of a specific type. */ public List toList(Class rootType, Reader json); /** - * Convert json reader input into a list of beans of a specific type with - * options. + * Use the genericType to determine if this should be converted into a List or + * bean. */ - public List toList(Class rootType, Reader json, JsonReadOptions options); + public Object toObject(Type genericType, Reader json); /** * Use the genericType to determine if this should be converted into a List or * bean. */ - public Object toObject(Type genericType, Reader json, JsonReadOptions options); - - /** - * Use the genericType to determine if this should be converted into a List or - * bean. - */ - public Object toObject(Type genericType, String json, JsonReadOptions options); + public Object toObject(Type genericType, String json); /** * Write the bean or collection in JSON format to the writer with default @@ -77,11 +55,6 @@ public interface JsonContext { */ public void toJsonWriter(Object o, Writer writer); - /** - * With additional pretty output option. - */ - public void toJsonWriter(Object o, Writer writer, boolean pretty); - /** * With additional options to specify JsonValueAdapter and * JsonWriteBeanVisitor's. @@ -93,13 +66,7 @@ public interface JsonContext { * @param options * additional options to control the JSON output */ - public void toJsonWriter(Object o, Writer writer, boolean pretty, JsonWriteOptions options); - - /** - * With additional JSONP callback function. - */ - public void toJsonWriter(Object o, Writer writer, boolean pretty, JsonWriteOptions options, - String callback); + public void toJsonWriter(Object o, Writer writer, JsonWriteOptions options); /** * Convert a bean or collection to json string using default options. @@ -107,20 +74,9 @@ public interface JsonContext { public String toJsonString(Object o); /** - * Convert a bean or collection to json string with pretty format using - * default options. + * Convert a bean or collection to json string. */ - public String toJsonString(Object o, boolean pretty); - - /** - * Convert a bean or collection to json string using options. - */ - public String toJsonString(Object o, boolean pretty, JsonWriteOptions options); - - /** - * Convert a bean or collection to json string using a JSONP callback. - */ - public String toJsonString(Object o, boolean pretty, JsonWriteOptions options, String callback); + public String toJsonString(Object o, JsonWriteOptions options); /** * Return true if the type is known as an Entity or Xml type or a List Set or diff --git a/src/main/java/com/avaje/ebean/text/json/JsonElement.java b/src/main/java/com/avaje/ebean/text/json/JsonElement.java deleted file mode 100644 index 98b76a224..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonElement.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.avaje.ebean.text.json; - -/** - * Marker interface for all the Raw JSON types. - *

- * You will only use the JsonElements when you register a JsonReadBeanVisitor. - * The JSON elements that are not mapped to a bean property are made available - * to the JsonReadBeanVisitor. - *

- * - * @see JsonReadBeanVisitor - * - * @author rbygrave - */ -public interface JsonElement { - - /** - * Return true if this is a JSON primitive type (null, boolean, number or - * string). - */ - public boolean isPrimitive(); - - /** - * Return the string value of this primitive JSON element. - *

- * This can not be used for JsonElementObject or JsonElementArray. - *

- */ - public String toPrimitiveString(); - - public Object eval(String exp); - - public int evalInt(String exp); - - public String evalString(String exp); - - public boolean evalBoolean(String exp); - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonElementArray.java b/src/main/java/com/avaje/ebean/text/json/JsonElementArray.java deleted file mode 100644 index 5a59e28bc..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonElementArray.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.avaje.ebean.text.json; - -import java.util.ArrayList; -import java.util.List; - -/** - * JSON Array element. - *

- * You will only use the JsonElements when you register a JsonReadBeanVisitor. - * The JSON elements that are not mapped to a bean property are made available - * to the JsonReadBeanVisitor. - *

- * - * @see JsonReadBeanVisitor - * - * @author rbygrave - */ -public class JsonElementArray implements JsonElement { - - private final List values = new ArrayList(); - - public List getValues() { - return values; - } - - public void add(JsonElement value) { - values.add(value); - } - - public String toString() { - return values.toString(); - } - - public boolean isPrimitive() { - return false; - } - - public String toPrimitiveString() { - return null; - } - - private String[] split(String exp) { - int pos = exp.indexOf('.'); - if (pos == -1) { - return new String[] { exp, null }; - } - String exp0 = exp.substring(0, pos); - String exp1 = exp.substring(pos + 1); - return new String[] { exp0, exp1 }; - } - - public Object eval(String exp) { - String[] e = split(exp); - return eval(e[0], e[1]); - } - - public int evalInt(String exp) { - String[] e = split(exp); - return evalInt(e[0], e[1]); - } - - public String evalString(String exp) { - String[] e = split(exp); - return evalString(e[0], e[1]); - } - - public boolean evalBoolean(String exp) { - // TODO Auto-generated method stub - return false; - } - - private Object eval(String exp0, String exp1) { - if ("size".equals(exp0)) { - return values.size(); - } - if ("isEmpty".equals(exp0)) { - return values.isEmpty(); - } - int idx = Integer.parseInt(exp0); - JsonElement element = values.get(idx); - return element.eval(exp1); - } - - private int evalInt(String exp0, String exp1) { - if ("size".equals(exp0)) { - return values.size(); - } - if ("isEmpty".equals(exp0)) { - return values.isEmpty() ? 1 : 0; - } - int idx = Integer.parseInt(exp0); - JsonElement element = values.get(idx); - return element.evalInt(exp1); - } - - private String evalString(String exp0, String exp1) { - if ("size".equals(exp0)) { - return String.valueOf(values.size()); - } - if ("isEmpty".equals(exp0)) { - return String.valueOf(values.isEmpty()); - } - int idx = Integer.parseInt(exp0); - JsonElement element = values.get(idx); - return element.evalString(exp1); - } - - public String getString() { - return toString(); - } - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonElementBoolean.java b/src/main/java/com/avaje/ebean/text/json/JsonElementBoolean.java deleted file mode 100644 index 69132b8a2..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonElementBoolean.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.avaje.ebean.text.json; - -/** - * JSON boolean element. - *

- * You will only use the JsonElements when you register a JsonReadBeanVisitor. - * The JSON elements that are not mapped to a bean property are made available - * to the JsonReadBeanVisitor. - *

- * - * @see JsonReadBeanVisitor - * - * @author rbygrave - */ - -public class JsonElementBoolean implements JsonElement { - - public static final JsonElementBoolean TRUE = new JsonElementBoolean(true); - - public static final JsonElementBoolean FALSE = new JsonElementBoolean(false); - - private final Boolean value; - - private JsonElementBoolean(Boolean value) { - this.value = value; - } - - public Boolean getValue() { - return value; - } - - public String toString() { - return Boolean.toString(value); - } - - public boolean isPrimitive() { - return true; - } - - public String toPrimitiveString() { - return value.toString(); - } - - public Object eval(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on boolean"); - } - return value; - } - - public int evalInt(String exp) { - return value ? 1 : 0; - } - - public String evalString(String exp) { - return toString(); - } - - public boolean evalBoolean(String exp) { - return value; - } - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonElementNull.java b/src/main/java/com/avaje/ebean/text/json/JsonElementNull.java deleted file mode 100644 index b38406a57..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonElementNull.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.avaje.ebean.text.json; - -/** - * JSON null element. - *

- * You will only use the JsonElements when you register a JsonReadBeanVisitor. - * The JSON elements that are not mapped to a bean property are made available - * to the JsonReadBeanVisitor. - *

- * - * @see JsonReadBeanVisitor - * - * @author rbygrave - */ -public class JsonElementNull implements JsonElement { - - public static final JsonElementNull NULL = new JsonElementNull(); - - private JsonElementNull() { - } - - public String getValue() { - return "null"; - } - - public String toString() { - return "json null"; - } - - public boolean isPrimitive() { - return true; - } - - public String toPrimitiveString() { - return null; - } - - public Object eval(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on null"); - } - return null; - } - - public int evalInt(String exp) { - return 0; - } - - public String evalString(String exp) { - return null; - } - - public boolean evalBoolean(String exp) { - return false; - } - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonElementNumber.java b/src/main/java/com/avaje/ebean/text/json/JsonElementNumber.java deleted file mode 100644 index a778315ac..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonElementNumber.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.avaje.ebean.text.json; - -/** - * JSON number element. - *

- * You will only use the JsonElements when you register a JsonReadBeanVisitor. - * The JSON elements that are not mapped to a bean property are made available - * to the JsonReadBeanVisitor. - *

- * - * @see JsonReadBeanVisitor - * - * @author rbygrave - */ -public class JsonElementNumber implements JsonElement { - - private final String value; - - public JsonElementNumber(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - - public String toString() { - return value; - } - - public boolean isPrimitive() { - return true; - } - - public String toPrimitiveString() { - return value; - } - - public Object eval(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - return Double.parseDouble(value); - } - - public int evalInt(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - return Integer.parseInt(value); - } - - public String evalString(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - return value; - } - - public boolean evalBoolean(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - return Boolean.parseBoolean(value); - } - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonElementObject.java b/src/main/java/com/avaje/ebean/text/json/JsonElementObject.java deleted file mode 100644 index 028158e16..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonElementObject.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.avaje.ebean.text.json; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -/** - * JSON Object element. - *

- * You will only use the JsonElements when you register a JsonReadBeanVisitor. - * The JSON elements that are not mapped to a bean property are made available - * to the JsonReadBeanVisitor. - *

- * - * @see JsonReadBeanVisitor - * - * @author rbygrave - */ -public class JsonElementObject implements JsonElement { - - private final Map map = new LinkedHashMap(); - - public void put(String key, JsonElement value) { - map.put(key, value); - } - - private String[] split(String exp) { - int pos = exp.indexOf('.'); - if (pos == -1) { - return new String[] { exp, null }; - } - String exp0 = exp.substring(0, pos); - String exp1 = exp.substring(pos + 1); - return new String[] { exp0, exp1 }; - } - - public Object eval(String exp) { - String[] e = split(exp); - return eval(e[0], e[1]); - } - - public int evalInt(String exp) { - String[] e = split(exp); - return evalInt(e[0], e[1]); - } - - public String evalString(String exp) { - if (exp == null) { - return map.toString(); - } - String[] e = split(exp); - return evalString(e[0], e[1]); - } - - public boolean evalBoolean(String exp) { - String[] e = split(exp); - return evalBoolean(e[0], e[1]); - } - - private Object eval(String exp0, String exp1) { - JsonElement e = map.get(exp0); - return e == null ? null : e.eval(exp1); - } - - private int evalInt(String exp0, String exp1) { - JsonElement e = map.get(exp0); - return e == null ? 0 : e.evalInt(exp1); - } - - private String evalString(String exp0, String exp1) { - JsonElement e = map.get(exp0); - return e == null ? "" : e.evalString(exp1); - } - - private boolean evalBoolean(String exp0, String exp1) { - JsonElement e = map.get(exp0); - return e == null ? false : e.evalBoolean(exp1); - } - - public JsonElement get(String key) { - return map.get(key); - } - - public JsonElement getValue(String key) { - return map.get(key); - } - - public Set keySet() { - return map.keySet(); - } - - public Set> entrySet() { - return map.entrySet(); - } - - public String toString() { - return map.toString(); - } - - public boolean isPrimitive() { - return false; - } - - public String toPrimitiveString() { - return null; - } - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonElementString.java b/src/main/java/com/avaje/ebean/text/json/JsonElementString.java deleted file mode 100644 index 0b76feafc..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonElementString.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.avaje.ebean.text.json; - -/** - * JSON string element. - *

- * You will only use the JsonElements when you register a JsonReadBeanVisitor. - * The JSON elements that are not mapped to a bean property are made available - * to the JsonReadBeanVisitor. - *

- * - * @see JsonReadBeanVisitor - * - * @author rbygrave - */ -public class JsonElementString implements JsonElement { - - private final String value; - - public JsonElementString(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - - public String toString() { - return value; - } - - public boolean isPrimitive() { - return true; - } - - public String toPrimitiveString() { - return value; - } - - public Object eval(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - return value; - } - - public int evalInt(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - try { - return Integer.parseInt(value); - } catch (NumberFormatException e) { - return 0; - } - } - - public String evalString(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - return value; - } - - public boolean evalBoolean(String exp) { - if (exp != null) { - throw new IllegalArgumentException("expression [" + exp + "] not allowed on number"); - } - return Boolean.parseBoolean(exp); - } - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonReadBeanVisitor.java b/src/main/java/com/avaje/ebean/text/json/JsonReadBeanVisitor.java deleted file mode 100644 index 6de15360c..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonReadBeanVisitor.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.avaje.ebean.text.json; - -import java.util.Map; - -/** - * Provides for some custom handling of json content as it is read. - *

- * This visit method is called after all the known properties of the bean have - * been processed. Any JSON elements that could not be mapped to known bean - * properties are available in the unmapped Map. - *

- * - * @author rbygrave - * - * @param - * The type of entity bean - */ -public interface JsonReadBeanVisitor { - - /** - * Visit the bean that has just been processed. - *

- * This provides a method of customising the bean and processing any custom - * JSON content. - *

- * - * @param bean - * the bean being processed - * @param unmapped - * Map of any JSON elements that didn't map to known bean properties - */ - public void visit(T bean, Map unmapped); - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonReadOptions.java b/src/main/java/com/avaje/ebean/text/json/JsonReadOptions.java deleted file mode 100644 index a6832fd21..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonReadOptions.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.avaje.ebean.text.json; - -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * Provides the ability to customise the reading of JSON content. - *

- * You can optionally provide a custom JsonValueAdapter to handle specific - * formatting for Date and DateTime types. - *

- *

- * You can optionally register JsonReadBeanVisitors to customise the processing - * of the beans as they are processed and handle any custom JSON elements that - * could not be mapped to bean properties. - *

- * - * @author rbygrave - * - */ -public class JsonReadOptions { - - protected JsonValueAdapter valueAdapter; - - protected Map> visitorMap; - - /** - * Default constructor. - */ - public JsonReadOptions() { - this.visitorMap = new LinkedHashMap>(); - } - - /** - * Return the JsonValueAdapter. - */ - public JsonValueAdapter getValueAdapter() { - return valueAdapter; - } - - /** - * Return the map of JsonReadBeanVisitor's. - */ - public Map> getVisitorMap() { - return visitorMap; - } - - /** - * Set a JsonValueAdapter for custom DateTime and Date formatting. - */ - public JsonReadOptions setValueAdapter(JsonValueAdapter valueAdapter) { - this.valueAdapter = valueAdapter; - return this; - } - - /** - * Register a JsonReadBeanVisitor for the root level. - */ - public JsonReadOptions addRootVisitor(JsonReadBeanVisitor visitor) { - return addVisitor(null, visitor); - } - - /** - * Register a JsonReadBeanVisitor for a given path. - */ - public JsonReadOptions addVisitor(String path, JsonReadBeanVisitor visitor) { - visitorMap.put(path, visitor); - return this; - } - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonValueAdapter.java b/src/main/java/com/avaje/ebean/text/json/JsonValueAdapter.java deleted file mode 100644 index a30dcf38c..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonValueAdapter.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (C) 2009 Authors - * - * This file is part of Ebean. - * - * Ebean 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 2.1 of the License, or - * (at your option) any later version. - * - * Ebean 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 Ebean; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -package com.avaje.ebean.text.json; - -import java.sql.Timestamp; - -/** - * Allows you to customise the Date and Timestamp formats. - *

- * There is not a standard JSON format for Date or Timestamp types. By default - * Ebean uses ISO8601 "yyyy-MM-dd'T'HH:mm:ss.SSSZ" and "yyyy-MM-dd". - *

- *

- * Note that Ebean will convert Joda types to either of the Date or Timestamp - * types and back for you. - *

- * - * @see JsonReadOptions - * - * @author rbygrave - */ -public interface JsonValueAdapter { - - /** - * Convert the Date to json string. - */ - public String jsonFromDate(java.sql.Date date); - - /** - * Convert the DateTime to json string. - */ - public String jsonFromTimestamp(java.sql.Timestamp date); - - /** - * Parse the JSON string into a Date. - */ - public java.sql.Date jsonToDate(String jsonDate); - - /** - * Parse the JSON DateTime into a Timestamp. - */ - public Timestamp jsonToTimestamp(String jsonDateTime); - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonWriteBeanVisitor.java b/src/main/java/com/avaje/ebean/text/json/JsonWriteBeanVisitor.java deleted file mode 100644 index eb44cf788..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonWriteBeanVisitor.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.avaje.ebean.text.json; - -/** - * Allows for customising the JSON write processing. - *

- * You can use this to add raw JSON content via {@link JsonWriter}. - *

- *

- * You register a JsonWriteBeanVisitor with {@link JsonWriteOptions}. - *

- * - * @author rbygrave - * - * @param - * the type of entity bean - * - * @see JsonWriteOptions - */ -public interface JsonWriteBeanVisitor { - - /** - * Visit the bean that has just been writing it's content to JSON. You can - * write your own additional JSON content to the JsonWriter if you wish. - * - * @param bean - * the bean that has been writing it's content - * @param jsonWriter - * the JsonWriter which you can append custom json content to if you - * wish. - */ - public void visit(T bean, JsonWriter jsonWriter); - -} diff --git a/src/main/java/com/avaje/ebean/text/json/JsonWriteOptions.java b/src/main/java/com/avaje/ebean/text/json/JsonWriteOptions.java index 8775f5001..d245725e0 100644 --- a/src/main/java/com/avaje/ebean/text/json/JsonWriteOptions.java +++ b/src/main/java/com/avaje/ebean/text/json/JsonWriteOptions.java @@ -1,8 +1,6 @@ package com.avaje.ebean.text.json; -import java.util.HashMap; import java.util.LinkedHashSet; -import java.util.Map; import java.util.Set; import com.avaje.ebean.text.PathProperties; @@ -69,10 +67,6 @@ public class JsonWriteOptions { protected String callback; - protected JsonValueAdapter valueAdapter; - - protected Map> visitorMap; - protected PathProperties pathProperties; /** @@ -99,11 +93,7 @@ public class JsonWriteOptions { public JsonWriteOptions copy() { JsonWriteOptions copy = new JsonWriteOptions(); copy.callback = callback; - copy.valueAdapter = valueAdapter; copy.pathProperties = pathProperties; - if (visitorMap != null) { - copy.visitorMap = new HashMap>(visitorMap); - } return copy; } @@ -122,39 +112,6 @@ public class JsonWriteOptions { return this; } - /** - * Return the JsonValueAdapter. - */ - public JsonValueAdapter getValueAdapter() { - return valueAdapter; - } - - /** - * Set a JsonValueAdapter for custom DateTime and Date formatting. - */ - public JsonWriteOptions setValueAdapter(JsonValueAdapter valueAdapter) { - this.valueAdapter = valueAdapter; - return this; - } - - /** - * Register a JsonWriteBeanVisitor for the root level. - */ - public JsonWriteOptions setRootPathVisitor(JsonWriteBeanVisitor visitor) { - return setPathVisitor(null, visitor); - } - - /** - * Register a JsonWriteBeanVisitor for the given path. - */ - public JsonWriteOptions setPathVisitor(String path, JsonWriteBeanVisitor visitor) { - if (visitorMap == null) { - visitorMap = new HashMap>(); - } - visitorMap.put(path, visitor); - return this; - } - /** * Set the properties to include in the JSON output for the given path. * @@ -213,13 +170,6 @@ public class JsonWriteOptions { return props; } - /** - * Return the Map of registered JsonWriteBeanVisitor's by path. - */ - public Map> getVisitorMap() { - return visitorMap; - } - /** * Set the Map of properties to include by path. */ diff --git a/src/main/java/com/avaje/ebean/text/json/JsonWriter.java b/src/main/java/com/avaje/ebean/text/json/JsonWriter.java deleted file mode 100644 index 58d8dd754..000000000 --- a/src/main/java/com/avaje/ebean/text/json/JsonWriter.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.avaje.ebean.text.json; - -/** - * The JSON Writer made available to JsonWriteBeanVisitor's so that you can - * append your own JSON content into the output. - * - * @see JsonWriteBeanVisitor - * @see JsonWriteOptions#setRootPathVisitor(JsonWriteBeanVisitor) - * @see JsonWriteOptions#setPathVisitor(String, JsonWriteBeanVisitor) - * - * @author rbygrave - */ -public interface JsonWriter { - - /** - * Use this to append some custom content into the JSON output. - * - * @param key - * the json key - * - * @param rawJsonValue - * raw json value - */ - public void appendRawValue(String key, String rawJsonValue); - - public void appendQuoteEscapeValue(String key, String rawJsonValue); - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index 5e2af4eb4..ae8685e09 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -65,7 +65,6 @@ import com.avaje.ebean.meta.MetaBeanInfo; import com.avaje.ebean.meta.MetaInfoManager; import com.avaje.ebean.text.csv.CsvReader; import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonElement; import com.avaje.ebeaninternal.api.LoadBeanRequest; import com.avaje.ebeaninternal.api.LoadManyRequest; import com.avaje.ebeaninternal.api.ScopeTrans; @@ -1989,10 +1988,6 @@ public final class DefaultServer implements SpiEbeanServer { if (typeInfo == null) { return false; } - Class beanType = typeInfo.getBeanType(); - if (JsonElement.class.isAssignableFrom(beanType)) { - return true; - } return getBeanDescriptor(typeInfo.getBeanType()) != null; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java index 8924def4c..c6a213368 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java @@ -9,8 +9,6 @@ import com.avaje.ebean.config.ExternalTransactionManager; import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.DatabasePlatform; import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.api.ClassUtil; import com.avaje.ebeaninternal.api.SpiBackgroundExecutor; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.server.autofetch.AutoFetchManager; @@ -30,7 +28,6 @@ import com.avaje.ebeaninternal.server.query.DefaultRelationalQueryEngine; import com.avaje.ebeaninternal.server.resource.ResourceManager; import com.avaje.ebeaninternal.server.resource.ResourceManagerFactory; import com.avaje.ebeaninternal.server.text.json.DJsonContext; -import com.avaje.ebeaninternal.server.text.json.DefaultJsonValueAdapter; import com.avaje.ebeaninternal.server.transaction.DefaultTransactionScopeManager; import com.avaje.ebeaninternal.server.transaction.ExternalTransactionScopeManager; import com.avaje.ebeaninternal.server.transaction.JtaTransactionManager; @@ -133,17 +130,8 @@ public class InternalConfiguration { } public JsonContext createJsonContext(SpiEbeanServer server) { - - String s = serverConfig.getProperty("json.pretty", "false"); - boolean dfltPretty = "true".equalsIgnoreCase(s); - - s = serverConfig.getProperty("json.jsonValueAdapter", null); - - JsonValueAdapter va = new DefaultJsonValueAdapter(); - if (s != null) { - va = (JsonValueAdapter) ClassUtil.newInstance(s, this.getClass()); - } - return new DJsonContext(server, va, dfltPretty); + + return new DJsonContext(server); } public XmlConfig getXmlConfig() { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyCompound.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyCompound.java index 17b3f9ff1..ea8c31606 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyCompound.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyCompound.java @@ -3,14 +3,17 @@ package com.avaje.ebeaninternal.server.deploy; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; + +import javax.json.stream.JsonParser; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.config.ScalarTypeConverter; +import com.avaje.ebean.json.EJson; import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanPropertyCompound; import com.avaje.ebeaninternal.server.el.ElPropertyChainBuilder; import com.avaje.ebeaninternal.server.el.ElPropertyValue; import com.avaje.ebeaninternal.server.query.SqlBeanLoad; -import com.avaje.ebeaninternal.server.text.json.ReadJsonContext; import com.avaje.ebeaninternal.server.text.json.WriteJson; import com.avaje.ebeaninternal.server.type.CtCompoundProperty; import com.avaje.ebeaninternal.server.type.CtCompoundPropertyElAdapter; @@ -178,14 +181,31 @@ public class BeanPropertyCompound extends BeanProperty { } public void jsonWrite(WriteJson ctx, EntityBean bean) { - - Object valueObject = getValueIntercept(bean); - //FIXME: compoundType.jsonWrite(ctx, valueObject, name); + if (!jsonSerialize) { + return; + } + Object value = getValueIntercept(bean); + if (value == null) { + ctx.gen().writeNull(name); + } else { + compoundType.jsonWrite(ctx, value, name); + } } - public void jsonRead(ReadJsonContext ctx, EntityBean bean){ - - Object objValue = compoundType.jsonRead(ctx); + public void jsonRead(JsonParser ctx, EntityBean bean) { + + if (!jsonDeserialize) { + return; + } + + Object value = EJson.parsePartial(ctx); + if (value == null) { + setValue(bean, null); + } else { + @SuppressWarnings("unchecked") + Map map = (Map)value; + Object objValue = compoundType.jsonConvert(map); setValue(bean, objValue); + } } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/DJsonContext.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/DJsonContext.java index 8b9ef652b..8a43ccbef 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/DJsonContext.java +++ b/src/main/java/com/avaje/ebeaninternal/server/text/json/DJsonContext.java @@ -19,12 +19,10 @@ import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; import com.avaje.ebean.bean.EntityBean; +import com.avaje.ebean.json.EJson; import com.avaje.ebean.text.PathProperties; import com.avaje.ebean.text.TextException; import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonElement; -import com.avaje.ebean.text.json.JsonReadOptions; -import com.avaje.ebean.text.json.JsonValueAdapter; import com.avaje.ebean.text.json.JsonWriteOptions; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; @@ -41,14 +39,8 @@ public class DJsonContext implements JsonContext { private final SpiEbeanServer server; - //private final JsonValueAdapter dfltValueAdapter; - - private final boolean dfltPretty; - - public DJsonContext(SpiEbeanServer server, JsonValueAdapter dfltValueAdapter, boolean dfltPretty) { + public DJsonContext(SpiEbeanServer server) { this.server = server; - //this.dfltValueAdapter = dfltValueAdapter; - this.dfltPretty = dfltPretty; } public boolean isSupportedType(Type genericType) { @@ -60,44 +52,29 @@ public class DJsonContext implements JsonContext { } public T toBean(Class cls, String json) { - return toBean(cls, new StringReader(json), null); + return toBean(cls, new StringReader(json)); } public T toBean(Class cls, Reader jsonReader) { - return toBean(cls, createReader(jsonReader), null); + return toBean(cls, createReader(jsonReader)); } - public T toBean(Class cls, String json, JsonReadOptions options) { - return toBean(cls, new StringReader(json), options); - } - - public T toBean(Class cls, Reader jsonReader, JsonReadOptions options) { - return toBean(cls, createReader(jsonReader), options); - } - - private T toBean(Class cls, JsonParser parser, JsonReadOptions options) { + private T toBean(Class cls, JsonParser parser) { BeanDescriptor d = getDecriptor(cls); return d.jsonRead(parser, null); } public List toList(Class cls, String json) { - return toList(cls, new StringReader(json), null); + return toList(cls, new StringReader(json)); } - public List toList(Class cls, String json, JsonReadOptions options) { - return toList(cls, new StringReader(json), options); - } public List toList(Class cls, Reader jsonReader) { - return toList(cls, createReader(jsonReader), null); + return toList(cls, createReader(jsonReader)); } - public List toList(Class cls, Reader jsonReader, JsonReadOptions options) { - return toList(cls, createReader(jsonReader), options); - } - - private List toList(Class cls, JsonParser src, JsonReadOptions options) { + private List toList(Class cls, JsonParser src) { try { BeanDescriptor d = getDecriptor(cls); @@ -128,89 +105,63 @@ public class DJsonContext implements JsonContext { } } - public Object toObject(Type genericType, String json, JsonReadOptions options) { + public Object toObject(Type genericType, String json) { TypeInfo info = ParamTypeHelper.getTypeInfo(genericType); - Class beanType = info.getBeanType(); - if (JsonElement.class.isAssignableFrom(beanType)) { - return InternalJsonParser.parse(json); - } - ManyType manyType = info.getManyType(); switch (manyType) { case NONE: - return toBean(info.getBeanType(), json, options); + return toBean(info.getBeanType(), json); case LIST: - return toList(info.getBeanType(), json, options); + return toList(info.getBeanType(), json); default: - String msg = "ManyType " + manyType + " not supported yet"; - throw new TextException(msg); + throw new TextException("Type " + manyType + " not supported"); } } - public Object toObject(Type genericType, Reader json, JsonReadOptions options) { + public Object toObject(Type genericType, Reader json) { TypeInfo info = ParamTypeHelper.getTypeInfo(genericType); - Class beanType = info.getBeanType(); - if (JsonElement.class.isAssignableFrom(beanType)) { - return InternalJsonParser.parse(json); - } - ManyType manyType = info.getManyType(); switch (manyType) { case NONE: - return toBean(info.getBeanType(), json, options); + return toBean(info.getBeanType(), json); case LIST: - return toList(info.getBeanType(), json, options); + return toList(info.getBeanType(), json); default: - throw new TextException("ManyType " + manyType + " not supported"); + throw new TextException("Type " + manyType + " not supported"); } } public void toJsonWriter(Object o, Writer writer) { - toJsonWriter(o, writer, dfltPretty, null, null); + toJsonWriter(o, writer, null); } - public void toJsonWriter(Object o, Writer writer, boolean pretty) { - toJsonWriter(o, writer, pretty, null, null); - } - public void toJsonWriter(Object o, Writer writer, boolean pretty, JsonWriteOptions options) { - toJsonWriter(o, writer, pretty, null, null); - } - - public void toJsonWriter(Object o, Writer writer, boolean pretty, JsonWriteOptions options, String callback) { + public void toJsonWriter(Object o, Writer writer, JsonWriteOptions options) { JsonGenerator generator = Json.createGenerator(writer); - toJsonInternal(o, generator, pretty, options, callback); + toJsonInternal(o, generator, options); generator.close(); } public String toJsonString(Object o) { - return toJsonString(o, dfltPretty, null); + return toJsonString(o, null); } - public String toJsonString(Object o, boolean pretty) { - return toJsonString(o, pretty, null); - } - - public String toJsonString(Object o, boolean pretty, JsonWriteOptions options) { - return toJsonString(o, pretty, options, null); - } - - public String toJsonString(Object o, boolean pretty, JsonWriteOptions options, String callback) { + public String toJsonString(Object o, JsonWriteOptions options) { StringWriter writer = new StringWriter(500); JsonGenerator gen = Json.createGenerator(writer); - toJsonInternal(o, gen, pretty, options, callback); + toJsonInternal(o, gen, options); gen.close(); return writer.toString(); } @SuppressWarnings("unchecked") - private void toJsonInternal(Object o, JsonGenerator gen, boolean pretty, JsonWriteOptions options, String requestCallback) { + private void toJsonInternal(Object o, JsonGenerator gen, JsonWriteOptions options) { if (o == null) { gen.writeNull(); @@ -224,10 +175,10 @@ public class DJsonContext implements JsonContext { // } else if (o instanceof JsonElement) { } else if (o instanceof Map) { - toJsonFromMap((Map) o, gen, pretty, options, requestCallback); + toJsonFromMap((Map) o, gen, options); } else if (o instanceof Collection) { - toJsonFromCollection((Collection) o, null, gen, pretty, options, requestCallback); + toJsonFromCollection((Collection) o, null, gen, options); } else if (o instanceof EntityBean) { BeanDescriptor d = getDecriptor(o.getClass()); @@ -241,7 +192,7 @@ public class DJsonContext implements JsonContext { return new WriteJson(server, gen, pathProps); } - private void toJsonFromCollection(Collection c, String key, JsonGenerator gen, boolean pretty, JsonWriteOptions options, String requestCallback) { + private void toJsonFromCollection(Collection c, String key, JsonGenerator gen, JsonWriteOptions options) { if (key == null) { gen.writeStartArray(); @@ -255,13 +206,12 @@ public class DJsonContext implements JsonContext { while (it.hasNext()) { T t = it.next(); BeanDescriptor d = getDecriptor(t.getClass()); - //writeJson.setBean(); d.jsonWrite(writeJson, (EntityBean)t, null); } gen.writeEnd(); } - private void toJsonFromMap(Map map, JsonGenerator gen, boolean pretty, JsonWriteOptions options, String requestCallback) { + private void toJsonFromMap(Map map, JsonGenerator gen, JsonWriteOptions options) { Set> entrySet = map.entrySet(); Iterator> it = entrySet.iterator(); @@ -277,14 +227,14 @@ public class DJsonContext implements JsonContext { gen.writeNull(key); } else { if (value instanceof Collection) { - toJsonFromCollection((Collection) value, key, gen, pretty, options, requestCallback); + toJsonFromCollection((Collection) value, key, gen, options); } else if (value instanceof EntityBean) { BeanDescriptor d = getDecriptor(value.getClass()); d.jsonWrite(writeJson,(EntityBean) value, key); } else { - throw new RuntimeException("TODO process primitive"); + EJson.write(entry, gen); } } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/DefaultJsonValueAdapter.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/DefaultJsonValueAdapter.java index e2b3dd35f..85fc55c78 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/DefaultJsonValueAdapter.java +++ b/src/main/java/com/avaje/ebeaninternal/server/text/json/DefaultJsonValueAdapter.java @@ -5,9 +5,7 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.TimeZone; -import com.avaje.ebean.text.json.JsonValueAdapter; - -public class DefaultJsonValueAdapter implements JsonValueAdapter { +public class DefaultJsonValueAdapter {//implements JsonValueAdapter { private final SimpleDateFormat dateTimeProto; diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/InternalJsonParser.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/InternalJsonParser.java deleted file mode 100644 index f767fac17..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/InternalJsonParser.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import java.io.Reader; - -import com.avaje.ebean.text.json.JsonElement; - -public class InternalJsonParser { - - public static JsonElement parse(String s) { - - ReadJsonSourceString src = new ReadJsonSourceString(s); - ReadBasicJsonContext b = new ReadBasicJsonContext(src); - return ReadJsonRawReader.readJsonElement(b); - } - - public static JsonElement parse(Reader s) { - - ReadJsonSourceReader src = new ReadJsonSourceReader(s, 512, 256); - ReadBasicJsonContext b = new ReadBasicJsonContext(src); - return ReadJsonRawReader.readJsonElement(b); - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadBasicJsonContext.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadBasicJsonContext.java deleted file mode 100644 index bcc9c3bfd..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadBasicJsonContext.java +++ /dev/null @@ -1,273 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import com.avaje.ebean.text.TextException; - -public class ReadBasicJsonContext implements ReadJsonInterface { - - private final ReadJsonSource src; - - private char tokenStart; - private String tokenKey; - private boolean pushedTokenKey; - - public ReadBasicJsonContext(ReadJsonSource src) { - this.src = src; - } - - /** - * Push the current token key back onto the 'stack'. - */ - public void pushTokenKey() { - pushedTokenKey = true; - } - - public char getToken() { - return tokenStart; - } - - public String getTokenKey() { - return tokenKey; - } - - public boolean isTokenKey() { - return '\"' == tokenStart; - } - - public boolean isTokenObjectEnd() { - return '}' == tokenStart; - } - - public boolean readObjectBegin() { - readNextToken(); - if ('{' == tokenStart){ - return true; - } else if ('n' == tokenStart) { - return false; - } else if (']' == tokenStart) { - // an empty array - return false; - } - throw new RuntimeException("Expected object begin at "+src.getErrorHelp()); - } - - public boolean readKeyNext() { - readNextToken(); - if ('\"' == tokenStart){ - return true; - } else if ('}' == tokenStart) { - return false; - } - throw new RuntimeException("Expected '\"' or '}' at "+src.getErrorHelp()); - } - - public boolean readValueNext() { - readNextToken(); - if (',' == tokenStart){ - return true; - } else if ('}' == tokenStart) { - return false; - } - throw new RuntimeException("Expected ',' or '}' at "+src.getErrorHelp()+" but got "+tokenStart); - } - - public boolean readArrayBegin() { - readNextToken(); - if ('[' == tokenStart){ - return true; - } else if ('n' == tokenStart) { - return false; - } - throw new RuntimeException("Expected array begin at "+src.getErrorHelp()); - } - - public boolean readArrayNext() { - readNextToken(); - if (',' == tokenStart){ - return true; - } - if (']' == tokenStart){ - return false; - } - throw new RuntimeException("Expected ',' or ']' at "+src.getErrorHelp()); - } - - public void readNextToken() { - - if (pushedTokenKey) { - // Do nothing - pushedTokenKey = false; - return; - } - - ignoreWhiteSpace(); - - tokenStart = src.nextChar("EOF finding next token"); - switch (tokenStart) { - case '"': - internalReadKey(); - break; - case '{': break; - case '}': break; - case '[': break; // not expected - case ']': break; // not expected - case ',': break; // not expected - case ':': break; // not expected - case 'n': - internalReadNull(); - break; // not expected - - default: - throw new RuntimeException("Unexpected tokenStart["+tokenStart+"] "+src.getErrorHelp()); - } - - } - - public String readQuotedValue() { - - boolean escape = false; - StringBuilder sb = new StringBuilder(); - - do { - char ch = src.nextChar("EOF reading quoted value"); - if (escape) { - // in escape mode so just append the character - escape = false; - switch (ch) { - case 'n': - sb.append('\n'); - break; - case 'r': - sb.append('\r'); - break; - case 't': - sb.append('\t'); - break; - case 'f': - sb.append('\f'); - break; - case 'b': - sb.append('\b'); - break; - case '"': - sb.append('"'); - break; - case 'u': - String msg = "EOF reading unicode value"; - char c1 = src.nextChar(msg); - char c2 = src.nextChar(msg); - char c3 = src.nextChar(msg); - char c4 = src.nextChar(msg); - char u = (char) Integer.parseInt(""+c1+c2+c3+c4, 16); - sb.append(u); - break; - - default: - sb.append('\\'); - sb.append(ch); - break; - } - - } else { - switch (ch) { - case '\\': - // put into 'escape' mode for next character - escape = true; - break; - case '"': - return sb.toString(); - - default: - sb.append(ch); - } - } - } while (true); - } - - public String readUnquotedValue(char c) { - String v = readUnquotedValueRaw(c); - if ("null".equals(v)){ - return null; - } else { - return v; - } - } - - private String readUnquotedValueRaw(char c) { - - StringBuilder sb = new StringBuilder(); - sb.append(c); - - do { - tokenStart = src.nextChar("EOF reading unquoted value"); - switch (tokenStart) { - case ',': - src.back(); - return sb.toString(); - - case '}': - src.back(); - return sb.toString(); - - case ' ': - return sb.toString(); - - case '\t': - return sb.toString(); - - case '\r': - return sb.toString(); - - case '\n': - return sb.toString(); - - default: - sb.append(tokenStart); - } - - } while (true); - - } - - private void internalReadNull() { - - StringBuilder sb = new StringBuilder(4); - sb.append(tokenStart); - for (int i = 0; i < 3; i++) { - char c = src.nextChar("EOF reading null "); - sb.append(c); - } - if (!"null".equals(sb.toString())){ - throw new TextException("Expected 'null' but got "+sb.toString()+" "+src.getErrorHelp()); - } - } - - private void internalReadKey() { - StringBuilder sb = new StringBuilder(); - do { - char c = src.nextChar("EOF reading key"); - if ('\"' == c){ - tokenKey = sb.toString(); - break; - } else { - sb.append(c); - } - } while (true); - - ignoreWhiteSpace(); - - char c = src.nextChar("EOF reading ':'"); - if (':' != c){ - throw new TextException("Expected to find colon after key at "+(src.pos()-1)+" but found ["+c+"]"+src.getErrorHelp()); - } - } - - public void ignoreWhiteSpace() { - src.ignoreWhiteSpace(); - } - - public char nextChar() { - tokenStart = src.nextChar("EOF getting nextChar for raw json"); - return tokenStart; - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonContext.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonContext.java deleted file mode 100644 index 6b7f2d29c..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonContext.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -import com.avaje.ebean.bean.EntityBean; -import com.avaje.ebean.bean.EntityBeanIntercept; -import com.avaje.ebean.text.json.JsonElement; -import com.avaje.ebean.text.json.JsonReadBeanVisitor; -import com.avaje.ebean.text.json.JsonReadOptions; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -import com.avaje.ebeaninternal.server.util.ArrayStack; - -public class ReadJsonContext extends ReadBasicJsonContext { - - private final Map> visitorMap; - - private final JsonValueAdapter valueAdapter; - - private final PathStack pathStack; - - private final ArrayStack beanState; - private ReadBeanState currentState; - - public ReadJsonContext(ReadJsonSource src, JsonValueAdapter dfltValueAdapter, JsonReadOptions options) { - super(src); - this.beanState = new ArrayStack(); - if (options == null){ - this.valueAdapter = dfltValueAdapter; - this.visitorMap = null; - this.pathStack = null; - } else { - this.valueAdapter = getValueAdapter(dfltValueAdapter, options.getValueAdapter()); - this.visitorMap = options.getVisitorMap(); - this.pathStack = (visitorMap == null || visitorMap.isEmpty()) ? null : new PathStack(); - } - } - - private JsonValueAdapter getValueAdapter(JsonValueAdapter dfltValueAdapter, JsonValueAdapter valueAdapter) { - return valueAdapter == null ? dfltValueAdapter : valueAdapter; - } - - public JsonValueAdapter getValueAdapter() { - return valueAdapter; - } - - public String readScalarValue() { - - ignoreWhiteSpace(); - - char prevChar = nextChar();//"EOF reading scalarValue?"); - if ('"' == prevChar){ - return readQuotedValue(); - } else { - return readUnquotedValue(prevChar); - } - } - - public void pushBean(Object bean, String path, BeanDescriptor beanDescriptor){ - currentState = new ReadBeanState(bean, beanDescriptor); - beanState.push(currentState); - if (pathStack != null){ - pathStack.pushPathKey(path); - } - } - - public ReadBeanState popBeanState() { - if (pathStack != null){ - String path = pathStack.peekWithNull(); - JsonReadBeanVisitor beanVisitor = visitorMap.get(path); - if (beanVisitor != null){ - currentState.visit(beanVisitor); - } - pathStack.pop(); - } - - // return the current ReadBeanState as we can't call setLoadedState() - // yet. We might bind master/detail beans together via mappedBy property - // so wait until after that before calling ReadBeanStatesetLoadedState(); - ReadBeanState s = currentState; - - beanState.pop(); - currentState = beanState.peekWithNull(); - return s; - } - - public void setProperty(String propertyName){ - currentState.setLoaded(propertyName); - } - - /** - * Got a key that doesn't map to a known property so read the json value - * which could be json primitive, object or array. - *

- * Provide these values to a JsonReadBeanVisitor if registered. - *

- */ - public JsonElement readUnmappedJson(String key) { - - JsonElement rawJsonValue = ReadJsonRawReader.readJsonElement(this); - if (visitorMap != null){ - currentState.addUnmappedJson(key, rawJsonValue); - } - return rawJsonValue; - } - - public static class ReadBeanState implements PropertyChangeListener { - - private final Object bean; - private final BeanDescriptor beanDescriptor; - private final EntityBeanIntercept ebi; - private final Set loadedProps; - private Map unmapped; - - private ReadBeanState(Object bean, BeanDescriptor beanDescriptor) { - this.bean = bean; - this.beanDescriptor = beanDescriptor; - if (bean instanceof EntityBean){ - this.ebi = ((EntityBean)bean)._ebean_getIntercept(); - this.loadedProps = new HashSet(); - } else { - this.ebi = null; - this.loadedProps = null; - } - } - public String toString(){ - return bean.getClass().getSimpleName()+" loaded:"+loadedProps; - } - - /** - * Add a loaded/set property to the set of loadedProps. - */ - public void setLoaded(String propertyName){ - if (ebi != null){ - loadedProps.add(propertyName); - } - } - - private void addUnmappedJson(String key, JsonElement value){ - if (unmapped == null){ - unmapped = new LinkedHashMap(); - } - unmapped.put(key, value); - } - - @SuppressWarnings("unchecked") - private void visit(JsonReadBeanVisitor beanVisitor) { - // listen for property change events so that - // we can update the loadedProps if necessary - if (ebi != null){ - ebi.addPropertyChangeListener(this); - } - beanVisitor.visit((T)bean, unmapped); - if (ebi != null){ - ebi.removePropertyChangeListener(this); - } - } - - public void propertyChange(PropertyChangeEvent evt) { - String propName = evt.getPropertyName(); - loadedProps.add(propName); - } - - public Object getBean() { - return bean; - } - - } - - - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonInterface.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonInterface.java deleted file mode 100644 index 150ca475d..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonInterface.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -public interface ReadJsonInterface { - - public void ignoreWhiteSpace(); - - public char nextChar(); - - public String getTokenKey(); - - public boolean readKeyNext(); - - public boolean readValueNext(); - - public boolean readArrayNext(); - - public String readQuotedValue(); - - public String readUnquotedValue(char c); - - -} \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonRawReader.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonRawReader.java deleted file mode 100644 index 1a91f9463..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonRawReader.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import com.avaje.ebean.text.json.JsonElement; -import com.avaje.ebean.text.json.JsonElementArray; -import com.avaje.ebean.text.json.JsonElementBoolean; -import com.avaje.ebean.text.json.JsonElementNull; -import com.avaje.ebean.text.json.JsonElementNumber; -import com.avaje.ebean.text.json.JsonElementObject; -import com.avaje.ebean.text.json.JsonElementString; - - - -public class ReadJsonRawReader { - - public static JsonElement readJsonElement(ReadJsonInterface ctx) { - return new ReadJsonRawReader(ctx).readJsonElement(); - } - - private final ReadJsonInterface ctx; - - private ReadJsonRawReader(ReadJsonInterface ctx){ - this.ctx = ctx; - } - - private JsonElement readJsonElement() { - return readValue(); - } - - private JsonElement readValue() { - - ctx.ignoreWhiteSpace(); - - char c = ctx.nextChar(); - - switch (c) { - case '{': - return readObject(); - - case '[': - return readArray(); - - case '"': - return readString(); - - default: - return readUnquoted(c); - } - } - - private JsonElement readArray() { - - JsonElementArray a = new JsonElementArray(); - - do { - JsonElement value = readValue(); - a.add(value); - if (!ctx.readArrayNext()){ - break; - } - } while(true); - - return a; - } - - private JsonElement readObject() { - - JsonElementObject o = new JsonElementObject(); - - do { - if (!ctx.readKeyNext()){ - break; - } else { - // we read a property key ... - String key = ctx.getTokenKey(); - JsonElement value = readValue(); - - o.put(key, value); - - if (!ctx.readValueNext()){ - break; - } - } - } while(true); - - return o; - } - - private JsonElement readString() { - String s = ctx.readQuotedValue(); - return new JsonElementString(s); - } - - private JsonElement readUnquoted(char c) { - String s = ctx.readUnquotedValue(c); - if ("null".equals(s)){ - return JsonElementNull.NULL; - - } else if ("true".equals(s)){ - return JsonElementBoolean.TRUE; - - } else if ("false".equals(s)) { - return JsonElementBoolean.FALSE; - - } - return new JsonElementNumber(s); - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSource.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSource.java deleted file mode 100644 index 0d1e12486..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSource.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -public interface ReadJsonSource { - - public char nextChar(String eofMsg); - - public void ignoreWhiteSpace(); - - public void back(); - - public int pos(); - - public String getErrorHelp(); - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceReader.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceReader.java deleted file mode 100644 index fe8b259a4..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceReader.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Reader; - -import com.avaje.ebean.text.TextException; - -public class ReadJsonSourceReader implements ReadJsonSource { - - private final Reader reader; - - private char[] localBuffer; - - private int totalPos; - private int localPos; - private int localPosEnd; - - public ReadJsonSourceReader(Reader reader, int localBufferSize, int bufferSize) { - this.reader = new BufferedReader(reader,bufferSize); - this.localBuffer = new char[localBufferSize]; - } - - public String toString() { - return String.valueOf(localBuffer); - } - - - - public String getErrorHelp() { - int prev = localPos - 30; - if (prev < 0){ - prev = 0; - } - String c = new String(localBuffer, prev, (localPos-prev)); - return "pos:"+pos()+" preceding:"+c; - } - - public int pos() { - return totalPos+localPos; - } - - - public void ignoreWhiteSpace() { - do { - char c = nextChar("EOF ignoring whitespace"); - if (!Character.isWhitespace(c)){ - --localPos; - break; - } - } while(true); - } - - public void back() { - localPos--; - } - - public char nextChar(String eofMsg) { - if (localPos >= localPosEnd){ - if (!loadLocalBuffer()) { - throw new TextException(eofMsg+" at pos:"+(totalPos+localPos)); - } - } - return localBuffer[localPos++]; - } - - private boolean loadLocalBuffer() { - try { - localPosEnd = reader.read(localBuffer); - if (localPosEnd > 0){ - totalPos += localPos; - localPos = 0; - return true; - } else { - this.localBuffer = null; - return false; - } - - } catch (IOException e){ - throw new TextException(e); - } - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceString.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceString.java deleted file mode 100644 index bcbda0961..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/ReadJsonSourceString.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import com.avaje.ebean.text.TextException; - -public class ReadJsonSourceString implements ReadJsonSource { - - private final String source; - private final int sourceLength; - private int pos; - - public ReadJsonSourceString(String source){ - this.source = source; - this.sourceLength = source.length(); - } - - public String getErrorHelp() { - int prev = pos - 50; - if (prev < 0){ - prev = 0; - } - String c = source.substring(prev, pos); - return "pos:"+pos+" precedingcontent:"+c; - } - - public String toString() { - return source; - } - - public int pos() { - return pos; - } - - public void back() { - pos--; - } - - public char nextChar(String eofMsg) { - if (pos >= sourceLength){ - throw new TextException(eofMsg+" at pos:"+pos); - } - return source.charAt(pos++); - } - - public void ignoreWhiteSpace() { - do { - char c = source.charAt(pos); - if (Character.isWhitespace(c)){ - ++pos; - } else { - break; - } - } while(true); - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJson.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJson.java index d6c8ccf03..7fb263f09 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJson.java +++ b/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJson.java @@ -16,7 +16,9 @@ import com.avaje.ebeaninternal.server.util.ArrayStack; public class WriteJson { private final SpiEbeanServer server; + private final JsonGenerator generator; + private final PathProperties pathProperties; private final PathStack pathStack = new PathStack(); @@ -49,7 +51,7 @@ public class WriteJson { parentBeans.pop(); } - public void beginAssocOne(String key, EntityBean bean) { + public void beginAssocOne(String key, Object bean) { parentBeans.push(bean); pathStack.pushPathKey(key); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBuffer.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBuffer.java deleted file mode 100644 index a16eb47f2..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBuffer.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - - -public interface WriteJsonBuffer extends Appendable { - - public WriteJsonBuffer append(String content); - -} \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferString.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferString.java deleted file mode 100644 index 213f8d70f..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferString.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import java.io.IOException; - -public class WriteJsonBufferString implements WriteJsonBuffer { - - private final StringBuilder buffer; - - public WriteJsonBufferString(){ - this.buffer = new StringBuilder(256); - } - - public WriteJsonBufferString append(CharSequence csq) throws IOException { - buffer.append(csq); - return this; - } - - public WriteJsonBufferString append(CharSequence csq, int start, int end) throws IOException { - buffer.append(csq, start, end); - return this; - } - - public WriteJsonBufferString append(char c) throws IOException { - buffer.append(c); - return this; - } - - public WriteJsonBufferString append(String content){ - buffer.append(content); - return this; - } - - public String getBufferOutput() { - return buffer.toString(); - } - - public String toString() { - return buffer.toString(); - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferWriter.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferWriter.java deleted file mode 100644 index 422364529..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonBufferWriter.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -import java.io.IOException; -import java.io.Writer; - -import com.avaje.ebean.text.TextException; - -public class WriteJsonBufferWriter implements WriteJsonBuffer { - - private final Writer buffer; - - public WriteJsonBufferWriter(Writer buffer){ - this.buffer = buffer; - } - - public WriteJsonBufferWriter append(String content){ - try { - buffer.write(content); - return this; - } catch (IOException e) { - throw new TextException(e); - } - } - - public WriteJsonBufferWriter append(CharSequence csq) throws IOException { - return append(csq, 0, csq.length()); - } - - public WriteJsonBufferWriter append(CharSequence csq, int start, int end) throws IOException { - for (int i = start; i < end; i++) { - buffer.append(csq.charAt(i)); - } - return this; - } - - public WriteJsonBufferWriter append(char c) throws IOException { - try { - buffer.write(c); - return this; - } catch (IOException e) { - throw new TextException(e); - } - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonContext.java b/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonContext.java deleted file mode 100644 index f7ae2f144..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/text/json/WriteJsonContext.java +++ /dev/null @@ -1,376 +0,0 @@ -package com.avaje.ebeaninternal.server.text.json; - -//import java.util.Collection; -//import java.util.Iterator; -//import java.util.Map; -//import java.util.Set; -// -//import com.avaje.ebean.bean.EntityBean; -//import com.avaje.ebean.bean.EntityBeanIntercept; -//import com.avaje.ebean.text.PathProperties; -//import com.avaje.ebean.text.json.JsonValueAdapter; -//import com.avaje.ebean.text.json.JsonWriteBeanVisitor; -//import com.avaje.ebean.text.json.JsonWriteOptions; -//import com.avaje.ebean.text.json.JsonWriter; -//import com.avaje.ebeaninternal.api.SpiEbeanServer; -//import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -//import com.avaje.ebeaninternal.server.type.EscapeJson; -//import com.avaje.ebeaninternal.server.type.ScalarType; -//import com.avaje.ebeaninternal.server.util.ArrayStack; - - -public class WriteJsonContext {//implements JsonWriter { - -// private final SpiEbeanServer server; -// -// private final WriteJsonBuffer buffer; -// -// private final boolean pretty; -// -// private final JsonValueAdapter valueAdapter; -// -// private final ArrayStack parentBeans = new ArrayStack(); -// -// private final PathProperties pathProperties; -// -// private final Map> visitorMap; -// -// private final String callback; -// -// private final PathStack pathStack; -// -// private WriteBeanState beanState; -// -// private int depthOffset; -// -// boolean assocOne; -// -// public WriteJsonContext(WriteJsonBuffer buffer, boolean pretty, JsonValueAdapter dfltValueAdapter, -// JsonWriteOptions options, String requestCallback, SpiEbeanServer server){ -// -// this.server = server; -// this.buffer = buffer; -// this.pretty = pretty; -// this.pathStack = new PathStack(); -// this.callback = getCallback(requestCallback, options); -// if (options == null){ -// this.valueAdapter = dfltValueAdapter; -// this.visitorMap = null; -// this.pathProperties = null; -// -// } else { -// this.valueAdapter = getValueAdapter(dfltValueAdapter, options.getValueAdapter()); -// this.visitorMap = emptyToNull(options.getVisitorMap()); -// this.pathProperties = emptyToNull(options.getPathProperties()); -// } -// -// if (callback != null){ -// buffer.append(requestCallback).append("("); -// } -// } -// -// public void toJson(String name, Collection c) { -// -// beginAssocMany(name); -// -// Iterator it = c.iterator(); -// if (!it.hasNext()){ -// endAssocMany(); -// return; -// } -// -// EntityBean o = (EntityBean)it.next(); -// BeanDescriptor d = getDecriptor(o.getClass()); -// -// d.jsonWrite(this, o); -// while (it.hasNext()) { -// appendComma(); -// EntityBean t = (EntityBean)it.next(); -// d.jsonWrite(this, t); -// } -// endAssocMany(); -// } -// -// private BeanDescriptor getDecriptor(Class cls) { -// BeanDescriptor d = server.getBeanDescriptor(cls); -// if (d == null){ -// String msg = "No BeanDescriptor found for "+cls; -// throw new RuntimeException(msg); -// } -// return d; -// } -// -// public void appendRawValue(String key, String rawJsonValue) { -// appendKeyWithComma(key, true); -// buffer.append(rawJsonValue); -// } -// -// public void appendQuoteEscapeValue(String key, String valueToEscape) { -// appendKeyWithComma(key, true); -// EscapeJson.escapeQuote(valueToEscape, buffer); -// } -// -// public void end() { -// if (callback != null){ -// buffer.append(")"); -// } -// } -// -// private Map emptyToNull(Map m){ -// if ( m == null || m.isEmpty()) { -// return null; -// } else { -// return m; -// } -// } -// -// private PathProperties emptyToNull(PathProperties m){ -// if ( m == null || m.isEmpty()) { -// return null; -// } else { -// return m; -// } -// } -// -// private String getCallback(String requestCallback, JsonWriteOptions options) { -// if (requestCallback != null){ -// return requestCallback; -// } -// if (options != null){ -// return options.getCallback(); -// } -// return null; -// } -// -// private JsonValueAdapter getValueAdapter(JsonValueAdapter dfltValueAdapter, JsonValueAdapter valueAdapter) { -// return valueAdapter == null ? dfltValueAdapter : valueAdapter; -// } -// -// /** -// * Return the set of properties to write to JSON. If null is returned then -// * the default will output the properties loaded for this bean. -// */ -// public Set getIncludeProperties() { -// if (pathProperties != null){ -// String path = pathStack.peekWithNull(); -// return pathProperties.get(path); -// } -// return null; -// } -// -// public JsonWriteBeanVisitor getBeanVisitor() { -// if (visitorMap != null){ -// String path = pathStack.peekWithNull(); -// return visitorMap.get(path); -// } -// return null; -// } -// -// public String getJson() { -// return buffer.toString(); -// } -// -// private void appendIndent(){ -// -// buffer.append("\n"); -// int depth = depthOffset + parentBeans.size(); -// for (int i = 0; i < depth; i++) { -// buffer.append(" "); -// } -// } -// -// public void appendObjectBegin(){ -// if (pretty && !assocOne){ -// appendIndent(); -// } -// buffer.append("{"); -// } -// public void appendObjectEnd(){ -// buffer.append("}"); -// } -// -// public void appendArrayBegin(){ -// if (pretty){ -// appendIndent(); -// } -// buffer.append("["); -// depthOffset++; -// } -// -// public void appendArrayEnd(){ -// depthOffset--; -// if (pretty){ -// appendIndent(); -// } -// buffer.append("]"); -// } -// -// public void appendComma(){ -// buffer.append(","); -// } -// -// public void addDepthOffset(int offset){ -// depthOffset += offset; -// } -// -// public void beginAssocOneIsNull(String key) { -// depthOffset++; -// internalAppendKeyBegin(key); -// appendNull(); -// depthOffset--; -// } -// -// public void beginAssocOne(String key) { -// pathStack.pushPathKey(key); -// -// internalAppendKeyBegin(key); -// assocOne = true; -// } -// -// public void endAssocOne() { -// -// pathStack.pop(); -// assocOne = false; -// } -// -// public Boolean includeMany(String key) { -// if (pathProperties != null){ -// String fullPath = pathStack.peekFullPath(key); -// return pathProperties.hasPath(fullPath); -// } -// return null; -// } -// -// public void beginAssocMany(String key) { -// -// pathStack.pushPathKey(key); -// -// depthOffset--; -// internalAppendKeyBegin(key); -// depthOffset++; -// buffer.append("["); -// } -// -// public void endAssocMany(){ -// -// pathStack.pop(); -// -// if (pretty){ -// depthOffset--; -// appendIndent(); -// depthOffset++; -// } -// buffer.append("]"); -// } -// -// private void internalAppendKeyBegin(String key) { -// if (!beanState.isFirstKey()){ -// buffer.append(","); -// } -// if (pretty){ -// appendIndent(); -// } -// appendKeyWithComma(key, false); -// } -// -// public void appendNameValue(String key, ScalarType scalarType, T value) { -// appendKeyWithComma(key, true); -// scalarType.jsonWrite(buffer, value, getValueAdapter()); -// } -// -// public void appendDiscriminator(String key, String discValue) { -// appendKeyWithComma(key, true); -// buffer.append("\""); -// buffer.append(discValue); -// buffer.append("\""); -// } -// -// private void appendKeyWithComma(String key, boolean withComma) { -// if (withComma){ -// if (!beanState.isFirstKey()){ -// buffer.append(","); -// } -// } -// buffer.append("\""); -// if(key == null) { -// buffer.append("null"); -// } else { -// buffer.append(key); -// } -// buffer.append("\":"); -// } -// -// public void appendNull(String key) { -// appendKeyWithComma(key, true); -// buffer.append("null"); -// } -// -// public void appendNull() { -// buffer.append("null"); -// } -// -// public JsonValueAdapter getValueAdapter() { -// return valueAdapter; -// } -// -// public String toString() { -// return buffer.toString(); -// } -// -// public void popParentBean(){ -// parentBeans.pop(); -// } -// -// public void pushParentBean(Object parentBean){ -// parentBeans.push(parentBean); -// } -// -// public void popParentBeanMany(){ -// parentBeans.pop(); -// depthOffset--; -// } -// -// public void pushParentBeanMany(Object parentBean){ -// parentBeans.push(parentBean); -// depthOffset++; -// } -// -// public boolean isParentBean(Object bean){ -// if (parentBeans.isEmpty()){ -// return false; -// } else { -// return parentBeans.contains(bean); -// } -// } -// -// public WriteBeanState pushBeanState(Object bean) { -// WriteBeanState newState = new WriteBeanState();//bean); -// WriteBeanState prevState = beanState; -// beanState = newState; -// return prevState; -// } -// -// public void pushPreviousState(WriteBeanState previousState) { -// this.beanState = previousState; -// } -// -// -// public static class WriteBeanState { -// -// private boolean firstKeyOut; -// -// public WriteBeanState() { -// -// } -// -// public boolean isFirstKey() { -// if (!firstKeyOut){ -// firstKeyOut = true; -// return true; -// } else { -// return false; -// } -// } -// -// } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/CtCompoundType.java b/src/main/java/com/avaje/ebeaninternal/server/type/CtCompoundType.java index 633044edd..da6ab5d71 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/CtCompoundType.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/CtCompoundType.java @@ -6,17 +6,10 @@ import java.util.Map; import com.avaje.ebean.config.CompoundType; import com.avaje.ebean.config.CompoundTypeProperty; -import com.avaje.ebean.text.json.JsonElement; -import com.avaje.ebean.text.json.JsonElementObject; -import com.avaje.ebeaninternal.server.text.json.ReadJsonContext; -//import com.avaje.ebeaninternal.server.text.json.WriteJsonContext; -//import com.avaje.ebeaninternal.server.text.json.WriteJsonContext.WriteBeanState; +import com.avaje.ebeaninternal.server.text.json.WriteJson; /** - * The internal representation of a Compound Type (Immutable Compound Value - * Object). - * - * @author rbygrave + * The internal representation of a Compound Type (Immutable Compound Value Object). * * @param * The Type of the "Immutable Compound Value Object". @@ -168,47 +161,26 @@ public final class CtCompoundType implements ScalarDataReader { return parent + "." + propName; } } - - public Object jsonRead(ReadJsonContext ctx) { - - if (!ctx.readObjectBegin()) { - // the object is null - return null; - } - - JsonElementObject jsonObject = new JsonElementObject(); - do { - if (!ctx.readKeyNext()){ - break; - } else { - // we read a property key ... - String propName = ctx.getTokenKey(); - JsonElement unmappedJson = ctx.readUnmappedJson(propName); - jsonObject.put(propName, unmappedJson); - - if (!ctx.readValueNext()){ - break; - } - } - } while(true); - - return readJsonElementObject(ctx, jsonObject); + + public Object jsonConvert(Map map) { + return readJsonElementObject(map); } - private Object readJsonElementObject(ReadJsonContext ctx, JsonElementObject jsonObject){ + @SuppressWarnings("unchecked") + private Object readJsonElementObject(Map jsonObject){ boolean nullValue = false; Object[] values = new Object[propReaders.length]; for (int i = 0; i < propReaders.length; i++) { String propName = properties[i].getName(); - JsonElement jsonElement = jsonObject.get(propName); + Object jsonElement = jsonObject.get(propName); if (propReaders[i] instanceof CtCompoundType) { - values[i] = ((CtCompoundType)propReaders[i]).readJsonElementObject(ctx, (JsonElementObject)jsonElement); - + values[i] = ((CtCompoundType)propReaders[i]).readJsonElementObject((Map)jsonElement); } else { - values[i] = ((ScalarType)propReaders[i]).jsonFromString(jsonElement.toPrimitiveString(), ctx.getValueAdapter()); + //((ScalarType)propReaders[i]).jsonFromString(jsonElement.toPrimitiveString(), ctx.getValueAdapter()); + values[i] = ((ScalarType)propReaders[i]).parse(jsonElement.toString());; } if (values[i] == null){ nullValue = true; @@ -223,40 +195,35 @@ public final class CtCompoundType implements ScalarDataReader { } -// public void jsonWrite(WriteJsonContext ctx, Object valueObject, String propertyName) { -// -// if (valueObject == null){ -// ctx.beginAssocOneIsNull(propertyName); -// -// } else { -// ctx.pushParentBean(valueObject); -// ctx.beginAssocOne(propertyName); -// jsonWriteProps(ctx, valueObject, propertyName); -// ctx.endAssocOne(); -// ctx.popParentBean(); -// } -// } -// -// -// @SuppressWarnings({ "unchecked", "rawtypes" }) -// private void jsonWriteProps(WriteJsonContext ctx, Object valueObject, String propertyName) { -// -// ctx.appendObjectBegin(); -// WriteBeanState prevState = ctx.pushBeanState(valueObject); -// -// for (int i = 0; i < properties.length; i++) { -// String propName = properties[i].getName(); -// Object value = properties[i].getValue((V)valueObject); -// if (propReaders[i] instanceof CtCompoundType) { -// ((CtCompoundType)propReaders[i]).jsonWrite(ctx, value, propName); -// -// } else { -// ctx.appendNameValue(propName, (ScalarType)propReaders[i], value); -// } -// } -// -// ctx.pushPreviousState(prevState); -// ctx.appendObjectEnd(); -// } + public void jsonWrite(WriteJson ctx, Object valueObject, String propertyName) { + + ctx.beginAssocOne(propertyName, valueObject); + jsonWriteProps(ctx, valueObject, propertyName); + ctx.endAssocOne(); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private void jsonWriteProps(WriteJson ctx, Object valueObject, String propertyName) { + + if (propertyName != null) { + ctx.gen().writeStartObject(propertyName); + } else { + ctx.gen().writeStartObject(); + } + + for (int i = 0; i < properties.length; i++) { + String propName = properties[i].getName(); + Object value = properties[i].getValue((V) valueObject); + if (propReaders[i] instanceof CtCompoundType) { + ((CtCompoundType) propReaders[i]).jsonWrite(ctx, value, propName); + + } else { + ((ScalarType) propReaders[i]).jsonWrite(ctx.gen(), propName, value); + //ctx.appendNameValue(propName, (ScalarType) propReaders[i], value); + } + } + + ctx.gen().writeEnd(); + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/EscapeJson.java b/src/main/java/com/avaje/ebeaninternal/server/type/EscapeJson.java index 1267aa31a..c173e606a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/EscapeJson.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/EscapeJson.java @@ -4,7 +4,6 @@ import java.io.IOException; import com.avaje.ebean.text.TextException; import com.avaje.ebean.util.StringHelper; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; public class EscapeJson { @@ -45,24 +44,6 @@ public class EscapeJson { } - public static void escape(String value, WriteJsonBuffer sb) { - if (value == null) { - sb.append("null"); - } else { - escapeAppend(value, sb); - } - } - - public static void escapeQuote(String value, WriteJsonBuffer sb) { - if (value == null) { - sb.append("null"); - } else { - sb.append("\""); - escapeAppend(value, sb); - sb.append("\""); - } - } - /** * Escape quotes, \, /, \r, \n, \b, \f, \t and characters (U+0000 through * U+001F). diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarType.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarType.java index 9f7db04de..8495fc3f8 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarType.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarType.java @@ -11,8 +11,6 @@ import javax.json.stream.JsonParser.Event; import com.avaje.ebean.text.StringFormatter; import com.avaje.ebean.text.StringParser; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; /** * Describes a scalar type. @@ -187,18 +185,12 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData */ public boolean isDateTimeCapable(); - public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx); - - public String jsonToString(T value, JsonValueAdapter ctx); + public Object readData(DataInput dataInput) throws IOException; - public T jsonFromString(String value, JsonValueAdapter ctx); + public void writeData(DataOutput dataOutput, Object v) throws IOException; - public Object readData(DataInput dataInput) throws IOException; + public Object jsonRead(JsonParser ctx, Event event); - public void writeData(DataOutput dataOutput, Object v) throws IOException; - - public Object jsonRead(JsonParser ctx, Event event); - - public void jsonWrite(JsonGenerator ctx, String name, Object value); + public void jsonWrite(JsonGenerator ctx, String name, Object value); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java index 842433c1b..c553dcad0 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBase.java @@ -1,7 +1,5 @@ package com.avaje.ebeaninternal.server.type; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; @@ -74,25 +72,12 @@ public abstract class ScalarTypeBase implements ScalarType { return value; } - public void loadIgnore(DataReader dataReader) { - dataReader.incrementPos(1); - } - - public void accumulateScalarTypes(String propName, CtCompoundTypeScalarList list) { - list.addScalarType(propName, this); - } + public void loadIgnore(DataReader dataReader) { + dataReader.incrementPos(1); + } - public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx) { - String v = jsonToString(value, ctx); - buffer.append(v); - } - - public String jsonToString(T value, JsonValueAdapter ctx) { - return formatValue(value); - } - - public T jsonFromString(String value, JsonValueAdapter ctx) { - return parse(value); - } + public void accumulateScalarTypes(String propName, CtCompoundTypeScalarList list) { + list.addScalarType(propName, this); + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java index b0d4e4c79..d48b040c2 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java @@ -11,9 +11,6 @@ import javax.json.stream.JsonGenerator; import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; - /** * Base class for Date types. */ @@ -68,8 +65,7 @@ public abstract class ScalarTypeBaseDate extends ScalarTypeBase { @Override public Object jsonRead(JsonParser ctx, Event event) { if (ctx.isIntegralNumber()) { - long millis = ctx.getLong(); - return parseDateTime(millis); + return parseDateTime(ctx.getLong()); } else { String string = ctx.getString(); throw new RuntimeException("convert "+string); @@ -83,23 +79,6 @@ public abstract class ScalarTypeBaseDate extends ScalarTypeBase { public abstract long convertToMillis(Object value); - @Override - public String jsonToString(T value, JsonValueAdapter ctx) { - Date date = convertToDate(value); - return ctx.jsonFromDate(date); - } - - @Override - public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx) { - String s = jsonToString(value, ctx); - buffer.append(s); - } - - @Override - public T jsonFromString(String value, JsonValueAdapter ctx) { - Date ts = ctx.jsonToDate(value); - return convertFromDate(ts); - } public Object readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java index 216b2e9f8..287de52b9 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java @@ -11,9 +11,6 @@ import javax.json.stream.JsonGenerator; import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; - /** * Base type for DateTime types. */ @@ -83,24 +80,6 @@ public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { public boolean isDateTimeCapable() { return true; } - - @Override - public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx) { - String v = jsonToString(value, ctx); - buffer.append(v); - } - - @Override - public String jsonToString(T value, JsonValueAdapter ctx) { - Timestamp ts = convertToTimestamp(value); - return ctx.jsonFromTimestamp(ts); - } - - @Override - public T jsonFromString(String value, JsonValueAdapter ctx) { - Timestamp ts = ctx.jsonToTimestamp(value); - return convertFromTimestamp(ts); - } public Object readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java index 41c81456b..38950f0d9 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java @@ -11,8 +11,6 @@ import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; import com.avaje.ebean.text.TextException; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; /** * Base ScalarType for types which converts to and from a VARCHAR database @@ -85,19 +83,6 @@ public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { return formatValue((T) v); } - public T jsonFromString(String value, JsonValueAdapter ctx) { - return parse(EscapeJson.unescapeSlash(value)); - } - - public String toJsonString(Object value, JsonValueAdapter ctx) { - return EscapeJson.escapeQuote(format(value)); - } - - @Override - public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx) { - EscapeJson.escapeQuote(format(value), buffer); - } - public Object readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { return null; diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java index 85795a5f0..032002882 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java @@ -10,8 +10,6 @@ import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; import com.avaje.ebean.text.TextException; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; /** * Encrypted ScalarType that wraps a byte[] types. @@ -115,18 +113,6 @@ public class ScalarTypeBytesEncrypted implements ScalarType { baseType.accumulateScalarTypes(propName, list); } - public void jsonWrite(WriteJsonBuffer buffer, byte[] value, JsonValueAdapter ctx) { - baseType.jsonWrite(buffer, value, ctx); - } - - public String jsonToString(byte[] value, JsonValueAdapter ctx) { - return baseType.jsonToString(value, ctx); - } - - public byte[] jsonFromString(String value, JsonValueAdapter ctx) { - return baseType.jsonFromString(value, ctx); - } - public Object readData(DataInput dataInput) throws IOException { int len = dataInput.readInt(); byte[] value = new byte[len]; diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeChar.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeChar.java index 88d6bc063..8dc695e7a 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeChar.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeChar.java @@ -6,7 +6,6 @@ import java.sql.Types; import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; -import com.avaje.ebean.text.json.JsonValueAdapter; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; /** @@ -62,16 +61,6 @@ public class ScalarTypeChar extends ScalarTypeBaseVarchar { public Character parse(String value) { return value.charAt(0); } - - @Override - public Character jsonFromString(String value, JsonValueAdapter ctx) { - return value.charAt(0); - } - - @Override - public String jsonToString(Character value, JsonValueAdapter ctx) { - return EscapeJson.escapeQuote(value.toString()); - } @Override public Object jsonRead(JsonParser ctx, Event event) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java index 52e3ca1c4..72adf5552 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java @@ -1,6 +1,5 @@ package com.avaje.ebeaninternal.server.type; -import java.math.BigDecimal; import java.sql.SQLException; import java.sql.Types; @@ -8,7 +7,6 @@ import javax.json.stream.JsonGenerator; import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; -import com.avaje.ebean.text.json.JsonValueAdapter; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; /** @@ -64,16 +62,6 @@ public class ScalarTypeCharArray extends ScalarTypeBaseVarchar{ public char[] parse(String value) { return value.toCharArray(); } - - @Override - public char[] jsonFromString(String value, JsonValueAdapter ctx) { - return value.toCharArray(); - } - - @Override - public String jsonToString(char[] value, JsonValueAdapter ctx) { - return EscapeJson.escapeQuote(String.valueOf(value)); - } @Override public Object jsonRead(JsonParser ctx, Event event) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClob.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClob.java index c545c1a43..bf4edbeb7 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClob.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClob.java @@ -3,7 +3,6 @@ package com.avaje.ebeaninternal.server.type; import java.sql.SQLException; import java.sql.Types; -import com.avaje.ebean.text.json.JsonValueAdapter; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; /** @@ -11,66 +10,55 @@ import com.avaje.ebeaninternal.server.core.BasicTypeConverter; */ public class ScalarTypeClob extends ScalarTypeBaseVarchar { - static final int clobBufferSize = 512; - - static final int stringInitialSize = 512; - - protected ScalarTypeClob(boolean jdbcNative, int jdbcType) { - super(String.class, jdbcNative, jdbcType); - } - - public ScalarTypeClob() { - super(String.class, true, Types.CLOB); - } - - @Override - public String convertFromDbString(String dbValue) { - return dbValue; + static final int clobBufferSize = 512; + + static final int stringInitialSize = 512; + + protected ScalarTypeClob(boolean jdbcNative, int jdbcType) { + super(String.class, jdbcNative, jdbcType); + } + + public ScalarTypeClob() { + super(String.class, true, Types.CLOB); + } + + @Override + public String convertFromDbString(String dbValue) { + return dbValue; + } + + @Override + public String convertToDbString(String beanValue) { + return beanValue; + } + + public void bind(DataBind b, String value) throws SQLException { + if (value == null) { + b.setNull(Types.VARCHAR); + } else { + b.setString(value); } + } - @Override - public String convertToDbString(String beanValue) { - return beanValue; - } + public String read(DataReader dataReader) throws SQLException { - public void bind(DataBind b, String value) throws SQLException { - if (value == null) { - b.setNull(Types.VARCHAR); - } else { - b.setString(value); - } - } + return dataReader.getStringClob(); + } - public String read(DataReader dataReader) throws SQLException { + public Object toJdbcType(Object value) { + return BasicTypeConverter.toString(value); + } - return dataReader.getStringClob(); - } + public String toBeanType(Object value) { + return BasicTypeConverter.toString(value); + } - public Object toJdbcType(Object value) { - return BasicTypeConverter.toString(value); - } + public String formatValue(String t) { + return t; + } - public String toBeanType(Object value) { - return BasicTypeConverter.toString(value); - } + public String parse(String value) { + return value; + } - - public String formatValue(String t) { - return t; - } - - public String parse(String value) { - return value; - } - - @Override - public String jsonFromString(String value, JsonValueAdapter ctx) { - return value; - } - - @Override - public String jsonToString(String value, JsonValueAdapter ctx) { - return EscapeJson.escapeQuote(value); - } - } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java index e8dc2c874..7aa817b22 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java @@ -9,9 +9,6 @@ import javax.json.stream.JsonGenerator; import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; - public class ScalarTypeEncryptedWrapper implements ScalarType { private final ScalarType wrapped; @@ -122,18 +119,6 @@ public class ScalarTypeEncryptedWrapper implements ScalarType { public void accumulateScalarTypes(String propName, CtCompoundTypeScalarList list) { wrapped.accumulateScalarTypes(propName, list); } - - public String jsonToString(T value, JsonValueAdapter ctx) { - return wrapped.jsonToString(value, ctx); - } - - public void jsonWrite(WriteJsonBuffer buffer, T value, JsonValueAdapter ctx) { - wrapped.jsonWrite(buffer, value, ctx); - } - - public T jsonFromString(String value, JsonValueAdapter ctx) { - return wrapped.jsonFromString(value, ctx); - } public void jsonWrite(JsonGenerator ctx, String name, Object value) { wrapped.jsonWrite(ctx, name, value); diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java index 3dc1e6a22..4a2220902 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java @@ -12,7 +12,6 @@ import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; import com.avaje.ebean.text.TextException; -import com.avaje.ebean.text.json.JsonValueAdapter; /** @@ -240,16 +239,6 @@ public class ScalarTypeEnumStandard { public void jsonWrite(JsonGenerator ctx, String name, Object value) { ctx.write(name, formatValue(value)); } - - @Override - public Object jsonFromString(String value, JsonValueAdapter ctx) { - return parse(value); - } - - @Override - public String jsonToString(Object value, JsonValueAdapter ctx) { - return EscapeJson.escapeQuote(format(value)); - } public Object readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java index c18d27fcd..dd1b29c35 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java @@ -11,7 +11,6 @@ import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; import com.avaje.ebean.text.TextException; -import com.avaje.ebean.text.json.JsonValueAdapter; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; /** @@ -67,22 +66,13 @@ public class ScalarTypeInteger extends ScalarTypeBase { public boolean isDateTimeCapable() { return false; } + + @Override + public Object jsonRead(JsonParser ctx, Event event) { + return Integer.valueOf(ctx.getInt()); + } - public String jsonToString(Integer value, JsonValueAdapter ctx) { - return value.toString(); - } - - public Integer jsonFromString(String value, JsonValueAdapter ctx) { - return Integer.valueOf(value); - } - - @Override - public Object jsonRead(JsonParser ctx, Event event) { - return Integer.valueOf(ctx.getInt()); - } - - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (Integer)value); - } - + public void jsonWrite(JsonGenerator ctx, String name, Object value) { + ctx.write(name, (Integer) value); + } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeString.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeString.java index 2e81b917b..60477accd 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeString.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeString.java @@ -10,9 +10,7 @@ import javax.json.stream.JsonGenerator; import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; -import com.avaje.ebean.text.json.JsonValueAdapter; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; /** * ScalarType for String. @@ -60,23 +58,6 @@ public class ScalarTypeString extends ScalarTypeBase { return true; } - - @Override - public void jsonWrite(WriteJsonBuffer buffer, String value, JsonValueAdapter ctx) { - String s = format(value); - EscapeJson.escapeQuote(s, buffer); - } - - @Override - public String jsonFromString(String value, JsonValueAdapter ctx) { - return value; - } - - @Override - public String jsonToString(String value, JsonValueAdapter ctx) { - return EscapeJson.escapeQuote(value); - } - public Object readData(DataInput dataInput) throws IOException { if (!dataInput.readBoolean()) { return null; diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTimestamp.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTimestamp.java index 48a1d0fbc..573737509 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTimestamp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTimestamp.java @@ -1,6 +1,5 @@ package com.avaje.ebeaninternal.server.type; -import java.sql.Date; import java.sql.SQLException; import java.sql.Timestamp; import java.sql.Types; diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java index 09160b1ec..737f5ce68 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeWrapper.java @@ -10,8 +10,6 @@ import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; import com.avaje.ebean.config.ScalarTypeConverter; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebeaninternal.server.text.json.WriteJsonBuffer; /** * A ScalarType that uses a ScalarTypeConverter to convert to and from another @@ -169,22 +167,6 @@ public class ScalarTypeWrapper implements ScalarType { return this; } - public String jsonToString(B value, JsonValueAdapter ctx) { - - S sv = converter.unwrapValue(value); - return scalarType.jsonToString(sv, ctx); - } - - public void jsonWrite(WriteJsonBuffer buffer, B value, JsonValueAdapter ctx) { - S sv = converter.unwrapValue(value); - scalarType.jsonWrite(buffer, sv, ctx); - } - - public B jsonFromString(String value, JsonValueAdapter ctx) { - S s = scalarType.jsonFromString(value, ctx); - return converter.wrapValue(s); - } - @SuppressWarnings("unchecked") @Override public Object jsonRead(JsonParser ctx, Event event) { @@ -194,9 +176,9 @@ public class ScalarTypeWrapper implements ScalarType { @Override public void jsonWrite(JsonGenerator ctx, String name, Object beanValue) { + @SuppressWarnings("unchecked") S unwrapValue = converter.unwrapValue((B)beanValue); scalarType.jsonWrite(ctx, name, unwrapValue); - } diff --git a/src/test/java/com/avaje/ebean/json/EJsonTests.java b/src/test/java/com/avaje/ebean/json/EJsonTests.java index cd455a375..e46c55fd0 100644 --- a/src/test/java/com/avaje/ebean/json/EJsonTests.java +++ b/src/test/java/com/avaje/ebean/json/EJsonTests.java @@ -1,8 +1,12 @@ package com.avaje.ebean.json; +import java.io.StringReader; import java.util.List; import java.util.Map; +import javax.json.Json; +import javax.json.stream.JsonParser; + import org.junit.Assert; import org.junit.Test; @@ -101,4 +105,48 @@ public class EJsonTests { String jsonOutput = EJson.write(result); Assert.assertEquals(jsonInput, jsonOutput); } + + @Test + public void test_partial_read() { + + String jsonInput = "{\"name\":\"rob\",\"age\":null,\"friend\":{\"name\":\"mike\",\"age\":13}},some more json would follow..."; + StringReader reader = new StringReader(jsonInput); + JsonParser parser = Json.createParser(reader); + + Object result = EJson.parsePartial(parser); + + Assert.assertTrue(result instanceof Map); + Map map = (Map)result; + Assert.assertEquals("rob", map.get("name")); + Assert.assertNull(map.get("age")); + + Map friend = (Map)map.get("friend"); + Assert.assertEquals("mike", friend.get("name")); + Assert.assertEquals(13L, friend.get("age")); + + } + +// @Test +// public void test_partial_read_primitives() { +// +// Object result = null; +// JsonParser parser = Json.createParser(new StringReader(",")); +// +//// Object result = EJson.parsePartial(parser); +//// Assert.assertNull(result); +// +// parser = Json.createParser(new StringReader("12L")); +// result = EJson.parsePartial(parser); +// Assert.assertEquals(12L, result); +// +// parser = Json.createParser(new StringReader("true")); +// result = EJson.parsePartial(parser); +// Assert.assertEquals(Boolean.TRUE, result); +// +// parser = Json.createParser(new StringReader("\"foo\"")); +// result = EJson.parsePartial(parser); +// Assert.assertEquals("foo", result); +// +// } + } diff --git a/src/test/java/com/avaje/tests/ddd/iud/TestDPersonEl.java b/src/test/java/com/avaje/tests/ddd/iud/TestDPersonEl.java index b42e5773c..8cfcf558b 100644 --- a/src/test/java/com/avaje/tests/ddd/iud/TestDPersonEl.java +++ b/src/test/java/com/avaje/tests/ddd/iud/TestDPersonEl.java @@ -2,12 +2,14 @@ package com.avaje.tests.ddd.iud; import java.util.Currency; -import junit.framework.Assert; import junit.framework.TestCase; +import org.junit.Assert; + import com.avaje.ebean.Ebean; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.config.GlobalProperties; +import com.avaje.ebean.text.json.JsonContext; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.el.ElPropertyValue; @@ -21,47 +23,44 @@ public class TestDPersonEl extends TestCase { GlobalProperties.put("classes", DPerson.class.toString()); -// Currency NZD = Currency.getInstance("NZD"); -// -// DPerson p = new DPerson(); -// p.setFirstName("first"); -// p.setLastName("last"); -// p.setSalary(new Money("12200")); -// p.setCmoney(new CMoney(new Money("12"), NZD)); -// -// SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null); -// -// BeanDescriptor descriptor = server.getBeanDescriptor(DPerson.class); -// -// ElPropertyValue elCmoney = descriptor.getElGetValue("cmoney"); + Currency NZD = Currency.getInstance("NZD"); + + DPerson p = new DPerson(); + p.setFirstName("first"); + p.setLastName("last"); + p.setSalary(new Money("12200")); + p.setCmoney(new CMoney(new Money("12"), NZD)); + + SpiEbeanServer server = (SpiEbeanServer)Ebean.getServer(null); + + BeanDescriptor descriptor = server.getBeanDescriptor(DPerson.class); + + ElPropertyValue elCmoney = descriptor.getElGetValue("cmoney"); // ElPropertyValue elCmoneyAmt = descriptor.getElGetValue("cmoney.amount"); // ElPropertyValue elCmoneyCur = descriptor.getElGetValue("cmoney.currency"); -// -// EntityBean entityBean = (EntityBean)p; -// -// Object cmoney = elCmoney.elGetValue(entityBean); + + JsonContext jsonContext = server.createJsonContext(); + String json = jsonContext.toJsonString(p); + + DPerson bean = jsonContext.toBean(DPerson.class, json); + Assert.assertEquals("first", bean.getFirstName()); + Assert.assertEquals(new Money("12200"), bean.getSalary()); + Assert.assertEquals(new Money("12"), bean.getCmoney().getAmount()); + Assert.assertEquals(NZD, bean.getCmoney().getCurrency()); + + + EntityBean entityBean = (EntityBean)p; + + Object cmoney = elCmoney.elGetValue(entityBean); // Object amt = elCmoneyAmt.elGetValue(entityBean); // Object cur = elCmoneyCur.elGetValue(entityBean); -// -// Assert.assertNotNull(cmoney); + + Assert.assertNotNull(cmoney); // Assert.assertEquals(new Money("12"), amt); // Assert.assertEquals(NZD, cur); -// -// p.setCmoney(null); -// Assert.assertNull(p.getCmoney()); -// -// // won't trigger CMoney build as not all properties -// // have been set yet... -// elCmoneyAmt.elSetValue(entityBean, new Money("13"), true, false); -// Assert.assertNull(p.getCmoney()); -// -// // will trigger the build and setting of CMoney -// elCmoneyCur.elSetValue(entityBean, NZD, true, false); -// -// // this time not null as all required properties for -// // the compound object have been collected -// Assert.assertNotNull(p.getCmoney()); - + + p.setCmoney(null); + Assert.assertNull(p.getCmoney()); } } diff --git a/src/test/java/com/avaje/tests/text/json/TestJsonInheritanceDiscriminator.java b/src/test/java/com/avaje/tests/text/json/TestJsonInheritanceDiscriminator.java index 2ccad73d2..299d2f18b 100644 --- a/src/test/java/com/avaje/tests/text/json/TestJsonInheritanceDiscriminator.java +++ b/src/test/java/com/avaje/tests/text/json/TestJsonInheritanceDiscriminator.java @@ -48,7 +48,7 @@ public class TestJsonInheritanceDiscriminator extends BaseTestCase { List animals = Ebean.find(Animal.class).findList(); - String listJson = json.toJsonString(animals, false); + String listJson = json.toJsonString(animals); List animals2 = json.toList(Animal.class, listJson); Assert.assertEquals(animals.size(), animals2.size()); diff --git a/src/test/java/com/avaje/tests/text/json/TestJsonMap.java b/src/test/java/com/avaje/tests/text/json/TestJsonMap.java index 2f47a675c..92015dc2b 100644 --- a/src/test/java/com/avaje/tests/text/json/TestJsonMap.java +++ b/src/test/java/com/avaje/tests/text/json/TestJsonMap.java @@ -24,7 +24,7 @@ public class TestJsonMap extends BaseTestCase { JsonContext jsonContext = Ebean.createJsonContext(); JsonWriteOptions jsonWriteOptions = JsonWriteOptions.parsePath("(id,status,name)"); - String jsonString = jsonContext.toJsonString(map, true, jsonWriteOptions); + String jsonString = jsonContext.toJsonString(map, jsonWriteOptions); System.out.println(jsonString); jsonContext = Ebean.createJsonContext(); @@ -33,7 +33,7 @@ public class TestJsonMap extends BaseTestCase { // jsonWriteOptions = // JsonWriteOptions.parsePath("(id,status,billingAddress(*))"); - jsonString = jsonContext.toJsonString(map, true, jsonWriteOptions); + jsonString = jsonContext.toJsonString(map, jsonWriteOptions); System.out.println(jsonString); // Assert.assertTrue(jsonString.indexOf("{\"1\":") > -1); diff --git a/src/test/java/com/avaje/tests/text/json/TestJsonSimple.java b/src/test/java/com/avaje/tests/text/json/TestJsonSimple.java index d6c884750..d2e991661 100644 --- a/src/test/java/com/avaje/tests/text/json/TestJsonSimple.java +++ b/src/test/java/com/avaje/tests/text/json/TestJsonSimple.java @@ -14,19 +14,15 @@ import org.junit.Test; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; +import com.avaje.ebean.json.EJson; import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonElement; -import com.avaje.ebean.text.json.JsonElementObject; -import com.avaje.ebeaninternal.server.text.json.InternalJsonParser; public class TestJsonSimple extends BaseTestCase { + @SuppressWarnings("unchecked") @Test public void test() throws IOException { - boolean b = JsonElement.class.isAssignableFrom(JsonElementObject.class); - Assert.assertTrue(b); - InputStream is = this.getClass().getResourceAsStream("/example1.json"); final Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); @@ -41,35 +37,30 @@ public class TestJsonSimple extends BaseTestCase { String jsonText = sb.toString(); - JsonElement el = InternalJsonParser.parse(jsonText); - + Object el = EJson.parse(jsonText); System.out.println("Got " + el); - JsonElement e2 = InternalJsonParser - .parse("{\"a\":12, \"name\":{\"first\":\"rob\", \"last\":\"byg\"}}"); + Map e2 = EJson.parseObject("{\"a\":12, \"name\":{\"first\":\"rob\", \"last\":\"byg\"}}"); - Assert.assertEquals(Double.valueOf(12), e2.eval("a")); - Assert.assertEquals(12, e2.evalInt("a")); - Assert.assertEquals("rob", e2.evalString("name.first")); - - Assert.assertEquals("byg", e2.evalString("name.last")); + Assert.assertEquals(12L, e2.get("a")); + Assert.assertEquals("rob", ((Map)e2.get("name")).get("first")); Map m = new LinkedHashMap(); m.put("hello", "rob"); m.put("test", "me"); JsonContext jsonContext = Ebean.createJsonContext(); - String jsonString = jsonContext.toJsonString(m, true); + String jsonString = jsonContext.toJsonString(m); System.out.println(jsonString); - String s = "{\"parishId\":\"18\",\"contentId\":null,\"contentStatus\":null,\"contentType\":\"pg-hello\",\"content\":\"

\n\tSomeThing

\n\"}"; + String s = "{\"parishId\":\"18\",\"contentId\":null,\"contentStatus\":null,\"contentType\":\"pg-hello\",\"content\":\"asd\"}"; - JsonElement jsonElement = InternalJsonParser.parse(s); + Object jsonElement = EJson.parse(s); Assert.assertNotNull(jsonElement); - JsonElement e3 = InternalJsonParser.parse("{\"name\":\"\\u60a8\\u597d\"}"); + Map e3 = EJson.parseObject("{\"name\":\"\\u60a8\\u597d\"}"); - Assert.assertTrue(e3.evalString("name").length()==2); + Assert.assertTrue(((String)e3.get("name")).length()==2); } diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitor.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitor.java index 8f5e4f5d4..fcae4c2e9 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitor.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitor.java @@ -2,7 +2,6 @@ package com.avaje.tests.text.json; import java.io.StringReader; import java.util.List; -import java.util.Map; import org.junit.Assert; import org.junit.Test; @@ -10,11 +9,6 @@ import org.junit.Test; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonElement; -import com.avaje.ebean.text.json.JsonReadBeanVisitor; -import com.avaje.ebean.text.json.JsonReadOptions; -import com.avaje.tests.model.basic.Address; -import com.avaje.tests.model.basic.Contact; import com.avaje.tests.model.basic.Customer; import com.avaje.tests.model.basic.ResetBasicData; @@ -34,16 +28,11 @@ public class TestTextJsonBeanReadVisitor extends BaseTestCase { JsonContext json = Ebean.createJsonContext(); - JsonReadOptions options = new JsonReadOptions(); - options.addRootVisitor(new CVisitor()); - options.addVisitor("contacts", new ContactVisitor()); - options.addVisitor("billingAddress", new AVisitor()); - options.addVisitor("shippingAddress", new ASVisitor()); - String s = json.toJsonString(list, true); + String s = json.toJsonString(list); System.out.println(s); - List mList = json.toList(Customer.class, s, options); + List mList = json.toList(Customer.class, s); System.out.println("VIA STRING: " + mList); StringReader reader = new StringReader(s); @@ -53,32 +42,5 @@ public class TestTextJsonBeanReadVisitor extends BaseTestCase { Assert.assertEquals(mList.size(), mList2.size()); } - private static class CVisitor implements JsonReadBeanVisitor { - - public void visit(Customer bean, Map unmapped) { - System.out.println("visit customer: " + bean); - } - } - - private static class AVisitor implements JsonReadBeanVisitor
{ - - public void visit(Address bean, Map unmapped) { - System.out.println("visit billing address: " + bean); - } - } - - private static class ASVisitor implements JsonReadBeanVisitor
{ - - public void visit(Address bean, Map unmapped) { - System.out.println("visit shipping address: " + bean); - } - } - - private static class ContactVisitor implements JsonReadBeanVisitor { - - public void visit(Contact bean, Map unmapped) { - System.out.println("visit contact: " + bean); - } - } } diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitorWithCustomJson.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitorWithCustomJson.java deleted file mode 100644 index 3f8bfa305..000000000 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonBeanReadVisitorWithCustomJson.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.avaje.tests.text.json; - -import java.io.StringReader; -import java.util.List; -import java.util.Map; - -import junit.framework.Assert; - -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.BeanState; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonElement; -import com.avaje.ebean.text.json.JsonElementNumber; -import com.avaje.ebean.text.json.JsonReadBeanVisitor; -import com.avaje.ebean.text.json.JsonReadOptions; -import com.avaje.ebean.text.json.JsonWriteBeanVisitor; -import com.avaje.ebean.text.json.JsonWriteOptions; -import com.avaje.ebean.text.json.JsonWriter; -import com.avaje.tests.model.basic.Contact; -import com.avaje.tests.model.basic.Customer; -import com.avaje.tests.model.basic.ResetBasicData; - -public class TestTextJsonBeanReadVisitorWithCustomJson extends BaseTestCase { - - @Test - public void test() { - - ResetBasicData.reset(); - - List list = Ebean.find(Customer.class).select("id, name, status, shippingAddress") - .fetch("billingAddress", "line1, city").fetch("billingAddress.country", "*") - .fetch("contacts", "firstName,email").order().desc("id").findList(); - - JsonContext json = Ebean.createJsonContext(); - - JsonWriteOptions writeOptions = new JsonWriteOptions(); - writeOptions.setRootPathVisitor(new JsonWriteBeanVisitor() { - - public void visit(Customer bean, JsonWriter ctx) { - System.out.println("write visit customer: " + bean); - ctx.appendRawValue("dummyCust", "34"); - ctx.appendRawValue("smallCustObject", "{\"a\":34,\"b\":\"asdasdasd\"}"); - } - }); - - writeOptions.setPathProperties("contacts", "firstName,id"); - writeOptions.setPathVisitor("contacts", new JsonWriteBeanVisitor() { - - public void visit(Contact bean, JsonWriter ctx) { - System.out.println("write additional custom json on customer: " + bean); - ctx.appendRawValue("dummy", " 3400" + bean.getId() + ""); - ctx.appendRawValue("smallObject", "{\"contactA\":34,\"contactB\":\"banana\"}"); - } - - }); - - String s = json.toJsonString(list, true, writeOptions); - System.out.println(s); - - JsonReadOptions readOptions = new JsonReadOptions(); - readOptions.addRootVisitor(new CVisitor()); - readOptions.addVisitor("contacts", new ContactVisitor()); - - StringReader reader = new StringReader(s); - List mList2 = json.toList(Customer.class, reader, readOptions); - System.out.println("VIA READER: " + mList2); - - for (Customer customer : mList2) { - BeanState beanState = Ebean.getBeanState(customer); - Assert.assertNotNull(beanState.getLoadedProps()); - Assert.assertTrue(beanState.getLoadedProps().contains("status")); - Assert.assertTrue(beanState.getLoadedProps().contains("smallnote")); - Assert.assertFalse(beanState.getLoadedProps().contains("anniversary")); - - String note = customer.getSmallnote(); - Assert.assertEquals("Set in Json Visitor", note); - } - - } - - private static class CVisitor implements JsonReadBeanVisitor { - - public void visit(Customer bean, Map unmapped) { - System.out.println("visit customer: " + bean); - bean.setSmallnote("Set in Json Visitor"); - } - } - - private static class ContactVisitor implements JsonReadBeanVisitor { - - public void visit(Contact bean, Map unmapped) { - System.out.println("visit contact: " + bean); - Assert.assertNotNull(unmapped); - JsonElement dummyEl = unmapped.get("dummy"); - JsonElement smallObjEl = unmapped.get("smallObject"); - JsonElementNumber dummyNum = (JsonElementNumber) dummyEl; - Assert.assertTrue(dummyNum.getValue().startsWith("3400")); - Assert.assertNotNull(smallObjEl); - } - } - -} diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonInheritance.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonInheritance.java index 1e4b36b0b..8ab1f422d 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonInheritance.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonInheritance.java @@ -26,7 +26,7 @@ public class TestTextJsonInheritance extends BaseTestCase { Assert.assertEquals(2, list.size()); JsonContext jsonContext = Ebean.createJsonContext(); - String jsonString = jsonContext.toJsonString(list, true); + String jsonString = jsonContext.toJsonString(list); System.out.println(jsonString); List rebuiltList = jsonContext.toList(Vehicle.class, jsonString); diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonInvokeLazy.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonInvokeLazy.java index 9cbce47b0..55deb4742 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonInvokeLazy.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonInvokeLazy.java @@ -24,7 +24,7 @@ public class TestTextJsonInvokeLazy extends BaseTestCase { opt.setRootPathProperties("name, status"); JsonContext jsonContext = Ebean.createJsonContext(); - String jsonString = jsonContext.toJsonString(list, true, opt); + String jsonString = jsonContext.toJsonString(list, opt); System.out.println(jsonString); diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonReadManyLazyLoad.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonReadManyLazyLoad.java index 507b2beb9..fdf308375 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonReadManyLazyLoad.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonReadManyLazyLoad.java @@ -31,7 +31,7 @@ public class TestTextJsonReadManyLazyLoad extends BaseTestCase { o.setPathProperties(pp); System.out.println("Expect lazy loading of Customer beans and customer contacts"); - String s = json.toJsonString(list, true, o); + String s = json.toJsonString(list, o); System.out.println(s); Assert.assertTrue(s.contains("\"contacts\"")); Assert.assertTrue(s.contains("\"name\"")); @@ -54,7 +54,7 @@ public class TestTextJsonReadManyLazyLoad extends BaseTestCase { o.setPathProperties(pp); System.out.println("expecting lazy load of Customer beans to fetch customer name"); - String s = json.toJsonString(list, true, o); + String s = json.toJsonString(list, o); System.out.println(s); Assert.assertTrue(s.contains("\"contacts\"")); Assert.assertTrue(s.contains("\"name\"")); @@ -78,7 +78,7 @@ public class TestTextJsonReadManyLazyLoad extends BaseTestCase { o.setPathProperties(pp); System.out.println("expecting lazy load of Customer contacts "); - String s = json.toJsonString(list, true, o); + String s = json.toJsonString(list, o); System.out.println(s); Assert.assertTrue(s.contains("\"contacts\"")); Assert.assertTrue(s.contains("\"name\"")); diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonReferenceBean.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonReferenceBean.java index 6b3f3b60d..5f36a3b73 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonReferenceBean.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonReferenceBean.java @@ -70,7 +70,7 @@ public class TestTextJsonReferenceBean extends BaseTestCase { JsonWriteOptions options = new JsonWriteOptions(); options.setPathProperties("details.product", "id"); - String jsonOrder = jsonContext.toJsonString(order, true, options); + String jsonOrder = jsonContext.toJsonString(order, options); System.out.println(jsonOrder); Order o2 = jsonContext.toBean(Order.class, jsonOrder); diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonSimple.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonSimple.java index e4f33c776..8e24c2198 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonSimple.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonSimple.java @@ -8,9 +8,7 @@ import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.EbeanServer; import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonWriteBeanVisitor; import com.avaje.ebean.text.json.JsonWriteOptions; -import com.avaje.ebean.text.json.JsonWriter; import com.avaje.tests.model.basic.Customer; import com.avaje.tests.model.basic.ResetBasicData; @@ -23,10 +21,7 @@ public class TestTextJsonSimple extends BaseTestCase { List list = Ebean.find(Customer.class).select("id, name, status, shippingAddress") .fetch("billingAddress", "line1, city").fetch("billingAddress.country", "*") - .fetch("contacts", "firstName,email")// , new - // FetchConfig().queryFirst(2)) - // .filterMany("contacts").ilike("firstName", "J%").query() - // .where().lt("id", 3) + .fetch("contacts", "firstName,email") .order().desc("id").findList(); EbeanServer server = Ebean.getServer(null); @@ -35,18 +30,8 @@ public class TestTextJsonSimple extends BaseTestCase { JsonWriteOptions options = new JsonWriteOptions(); options.setRootPathProperties("name, id"); - options.setRootPathVisitor(new JsonWriteBeanVisitor() { - - public void visit(Customer bean, JsonWriter ctx) { - System.out.println("visiting " + bean); - ctx.appendRawValue("dummy", "34"); - } - - }); - - String s = json.toJsonString(list, true); -// String s = json.toJsonString(list, true, options); - + + String s = json.toJsonString(list); System.out.println(s); List mList = json.toList(Customer.class, s); diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonSuperSimple.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonSuperSimple.java index 121dd7596..1272c4775 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonSuperSimple.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonSuperSimple.java @@ -29,7 +29,7 @@ public class TestTextJsonSuperSimple extends BaseTestCase { if (list.size() > 1) { Customer customer = list.get(0); - String s = json.toJsonString(customer, true); + String s = json.toJsonString(customer); System.out.println(s); int statusPos = s.indexOf("status"); Assert.assertEquals(-1, statusPos); diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonUpdateCascade.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonUpdateCascade.java index 8fb6ca79f..0c5d1bfe9 100644 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonUpdateCascade.java +++ b/src/test/java/com/avaje/tests/text/json/TestTextJsonUpdateCascade.java @@ -57,8 +57,7 @@ public class TestTextJsonUpdateCascade extends BaseTestCase { EbeanServer server = Ebean.getServer(null); JsonContext jsonContext = server.createJsonContext(); - String jsonString = jsonContext.toJsonString(order, true); - + String jsonString = jsonContext.toJsonString(order); System.out.println(jsonString); Order updOrder = jsonContext.toBean(Order.class, jsonString); @@ -85,7 +84,7 @@ public class TestTextJsonUpdateCascade extends BaseTestCase { Ebean.save(u0); - String jsonUser = jsonContext.toJsonString(u0, true); + String jsonUser = jsonContext.toJsonString(u0); System.out.println(jsonUser); diff --git a/src/test/java/com/avaje/tests/text/json/TestTextJsonUtilDateFormat.java b/src/test/java/com/avaje/tests/text/json/TestTextJsonUtilDateFormat.java deleted file mode 100644 index c15419b95..000000000 --- a/src/test/java/com/avaje/tests/text/json/TestTextJsonUtilDateFormat.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.avaje.tests.text.json; - -import java.sql.Date; -import java.sql.Timestamp; - -import org.junit.Assert; -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.config.GlobalProperties; -import com.avaje.ebean.text.json.JsonContext; -import com.avaje.ebean.text.json.JsonValueAdapter; -import com.avaje.ebean.text.json.JsonWriteOptions; -import com.avaje.ebeaninternal.server.text.json.DefaultJsonValueAdapter; -import com.avaje.tests.model.basic.Car; -import com.avaje.tests.model.basic.Vehicle; - -public class TestTextJsonUtilDateFormat extends BaseTestCase { - - @Test - public void test() { - - GlobalProperties.put("ebean.ddl.generate", "false"); - GlobalProperties.put("ebean.ddl.run", "false"); - - Vehicle v = new Car(); - v.setId(100); - v.setRegistrationDate(new java.util.Date()); - v.setUpdtime(new Timestamp(System.currentTimeMillis())); - - JsonContext context = Ebean.createJsonContext(); - JsonWriteOptions o = new JsonWriteOptions(); - o.setValueAdapter(new CustomDateFormatAdapter()); - - String jsonString = context.toJsonString(v, true, o); - System.out.println(jsonString); - - Assert.assertTrue(jsonString.contains("\"registrationDate\":'")); - } - - class CustomDateFormatAdapter implements JsonValueAdapter { - - DefaultJsonValueAdapter defaultImplementation = new DefaultJsonValueAdapter(); - - public String jsonFromDate(Date date) { - // TODO - return null; - } - - public String jsonFromTimestamp(Timestamp date) { - // add some single quotes around the timestamp value - return "'" + defaultImplementation.jsonFromTimestamp(date) + "'"; - } - - public Date jsonToDate(String jsonDate) { - // TODO - return null; - } - - public Timestamp jsonToTimestamp(String jsonDateTime) { - // TODO - return null; - } - - } -} diff --git a/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java b/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java index 89af3f75b..f5d433b4f 100644 --- a/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java +++ b/src/test/java/com/avaje/tests/update/TestJsonStatelessUpdate.java @@ -31,7 +31,7 @@ public class TestJsonStatelessUpdate extends BaseTestCase { JsonContext jsonContext = Ebean.createJsonContext(); JsonWriteOptions writeOptions = JsonWriteOptions.parsePath("(id,name,master(*))"); - String jsonString = jsonContext.toJsonString(twoX, true, writeOptions); + String jsonString = jsonContext.toJsonString(twoX, writeOptions); System.out.println(jsonString); jsonString = jsonString.replace("twoName", "twoNameModified");