From 16779174650106f119842f1dd026eb36776c3619 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 10 Nov 2014 20:31:11 +1300 Subject: [PATCH] Move from javax.json to jackson-core for parser/generator --- pom.xml | 6 +- src/main/java/com/avaje/ebean/Ebean.java | 11 +- .../java/com/avaje/ebean/EbeanServer.java | 6 +- .../com/avaje/ebean/config/ServerConfig.java | 21 ++ src/main/java/com/avaje/ebean/json/EJson.java | 72 +++--- .../com/avaje/ebean/json/EJsonReader.java | 181 +++++++------- .../com/avaje/ebean/json/EJsonWriter.java | 165 +++++++------ .../avaje/ebean/text/json/JsonContext.java | 34 ++- .../server/core/DefaultServer.java | 9 +- .../server/core/InternalConfiguration.java | 7 +- .../server/deploy/BeanCollectionHelp.java | 9 +- .../server/deploy/BeanDescriptor.java | 13 +- .../server/deploy/BeanDescriptorJsonHelp.java | 104 ++++---- .../server/deploy/BeanListHelp.java | 7 +- .../server/deploy/BeanMapHelp.java | 7 +- .../server/deploy/BeanProperty.java | 20 +- .../server/deploy/BeanPropertyAssocMany.java | 7 +- .../deploy/BeanPropertyAssocManyJsonHelp.java | 24 +- .../server/deploy/BeanPropertyAssocOne.java | 59 ++--- .../server/deploy/BeanPropertyCompound.java | 10 +- .../server/deploy/BeanSetHelp.java | 7 +- .../server/deploy/EJsonReader.java | 215 ----------------- .../ebeaninternal/server/deploy/ReadJson.java | 9 - .../server/text/json/DJsonContext.java | 90 +++---- .../server/text/json/WriteJson.java | 46 ++-- .../server/type/CtCompoundType.java | 14 +- .../ebeaninternal/server/type/ScalarType.java | 11 +- .../server/type/ScalarTypeBaseDate.java | 20 +- .../server/type/ScalarTypeBaseDateTime.java | 30 +-- .../server/type/ScalarTypeBaseVarchar.java | 15 +- .../server/type/ScalarTypeBigDecimal.java | 16 +- .../server/type/ScalarTypeBoolean.java | 16 +- .../server/type/ScalarTypeByte.java | 9 +- .../server/type/ScalarTypeBytesBase.java | 9 +- .../server/type/ScalarTypeBytesEncrypted.java | 9 +- .../server/type/ScalarTypeChar.java | 15 +- .../server/type/ScalarTypeCharArray.java | 16 +- .../server/type/ScalarTypeClass.java | 9 +- .../server/type/ScalarTypeCurrency.java | 15 +- .../server/type/ScalarTypeDouble.java | 16 +- .../type/ScalarTypeEncryptedWrapper.java | 10 +- .../server/type/ScalarTypeEnumStandard.java | 15 +- .../server/type/ScalarTypeFloat.java | 15 +- .../server/type/ScalarTypeInteger.java | 15 +- .../type/ScalarTypeJodaDateMidnight.java | 1 - .../server/type/ScalarTypeJodaDateTime.java | 1 - .../server/type/ScalarTypeJodaLocalTime.java | 19 +- .../server/type/ScalarTypeLong.java | 15 +- .../server/type/ScalarTypeMathBigInteger.java | 15 +- .../server/type/ScalarTypePostgresHstore.java | 9 +- .../server/type/ScalarTypeShort.java | 15 +- .../server/type/ScalarTypeString.java | 15 +- .../server/type/ScalarTypeTime.java | 15 +- .../server/type/ScalarTypeURL.java | 10 +- .../server/type/ScalarTypeUUIDBinary.java | 14 +- .../server/type/ScalarTypeUUIDVarchar.java | 10 +- .../server/type/ScalarTypeWrapper.java | 11 +- .../java/com/avaje/ebean/json/EJsonTests.java | 227 ++++++++---------- .../avaje/tests/ddd/iud/TestDPersonEl.java | 5 +- .../json/TestJsonBeanDescriptorParse.java | 10 +- .../text/json/TestJsonBeanWithTimeZone.java | 3 +- .../TestJsonInheritanceDiscriminator.java | 3 +- .../json/TestJsonSomeEnumWithToString.java | 4 +- .../json/TestTextJsonBeanReadVisitor.java | 3 +- .../text/json/TestTextJsonInheritance.java | 3 +- .../text/json/TestTextJsonInsertUpdate.java | 4 +- .../text/json/TestTextJsonInvokeLazy.java | 3 +- .../json/TestTextJsonReadManyLazyLoad.java | 7 +- .../text/json/TestTextJsonReferenceBean.java | 3 +- .../tests/text/json/TestTextJsonSimple.java | 3 +- .../text/json/TestTextJsonSuperSimple.java | 3 +- .../text/json/TestTextJsonUpdateCascade.java | 3 +- .../tests/update/TestJsonStatelessUpdate.java | 4 +- 73 files changed, 849 insertions(+), 1003 deletions(-) delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/EJsonReader.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/ReadJson.java diff --git a/pom.xml b/pom.xml index 5be0102ae..9048ffc2e 100644 --- a/pom.xml +++ b/pom.xml @@ -70,9 +70,9 @@ - org.glassfish - javax.json - 1.0.4 + com.fasterxml.jackson.core + jackson-core + 2.4.3 diff --git a/src/main/java/com/avaje/ebean/Ebean.java b/src/main/java/com/avaje/ebean/Ebean.java index 76ca8670b..2d124557b 100644 --- a/src/main/java/com/avaje/ebean/Ebean.java +++ b/src/main/java/com/avaje/ebean/Ebean.java @@ -1383,10 +1383,17 @@ public final class Ebean { } /** - * Create a JsonContext that will use the default configuration options. + * Return the JsonContext for reading/writing JSON. + */ + public static JsonContext json() { + return serverMgr.getPrimaryServer().json(); + } + + /** + * Return the JsonContext for reading/writing JSON. */ public static JsonContext createJsonContext() { - return serverMgr.getPrimaryServer().createJsonContext(); + return json(); } } diff --git a/src/main/java/com/avaje/ebean/EbeanServer.java b/src/main/java/com/avaje/ebean/EbeanServer.java index e320b1e2a..3d7e38002 100644 --- a/src/main/java/com/avaje/ebean/EbeanServer.java +++ b/src/main/java/com/avaje/ebean/EbeanServer.java @@ -1119,9 +1119,13 @@ public interface EbeanServer { public void runCacheWarming(Class beanType); /** - * Create a JsonContext that will use the default configuration options. + * Return the JsonContext for reading/writing JSON. */ public JsonContext createJsonContext(); + /** + * Return the JsonContext for reading/writing JSON. + */ + public JsonContext json(); } diff --git a/src/main/java/com/avaje/ebean/config/ServerConfig.java b/src/main/java/com/avaje/ebean/config/ServerConfig.java index b49052417..5618389c3 100644 --- a/src/main/java/com/avaje/ebean/config/ServerConfig.java +++ b/src/main/java/com/avaje/ebean/config/ServerConfig.java @@ -20,6 +20,7 @@ import com.avaje.ebean.event.ServerConfigStartup; import com.avaje.ebean.event.TransactionEventListener; import com.avaje.ebean.meta.MetaInfoManager; import com.avaje.ebean.util.ClassUtil; +import com.fasterxml.jackson.core.JsonFactory; /** * The configuration used for creating a EbeanServer. @@ -241,6 +242,8 @@ public class ServerConfig { private boolean collectQueryOrigins; + private JsonFactory jsonFactory; + /** * Construct a Server Configuration for programmatically creating an * EbeanServer. @@ -248,6 +251,24 @@ public class ServerConfig { public ServerConfig() { } + + /** + * Return the Jackson JsonFactory to use. + *

+ * If not set a default implmentation will be used. + */ + public JsonFactory getJsonFactory() { + return jsonFactory; + } + + /** + * Set the Jackson JsonFactory to use. + *

+ * If not set a default implmentation will be used. + */ + public void setJsonFactory(JsonFactory jsonFactory) { + this.jsonFactory = jsonFactory; + } /** * Return the name of the EbeanServer. diff --git a/src/main/java/com/avaje/ebean/json/EJson.java b/src/main/java/com/avaje/ebean/json/EJson.java index 0582dd546..ca1dabc4a 100644 --- a/src/main/java/com/avaje/ebean/json/EJson.java +++ b/src/main/java/com/avaje/ebean/json/EJson.java @@ -1,78 +1,80 @@ package com.avaje.ebean.json; +import java.io.IOException; import java.io.Reader; -import java.io.Writer; import java.util.List; import java.util.Map; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; /** * Utility that converts between JSON content and java Maps/Lists. */ public class EJson { - /** - * Write the nested Map/List as json. - */ - public static String write(Object object) { - return EJsonWriter.write(object); - } - - /** - * Write the nested Map/List as json to the writer. - */ - public static void write(Object object, Writer writer) { - EJsonWriter.write(object, writer); - } +// /** +// * Write the nested Map/List as json. +// */ +// public static String write(Object object) { +// return EJsonWriter.write(object); +// } +// +// /** +// * Write the nested Map/List as json to the writer. +// */ +// public static void write(Object object, Writer writer) { +// EJsonWriter.write(object, writer); +// } /** * Write the nested Map/List as json to the jsonGenerator. */ - public static void write(Object object, JsonGenerator jsonGenerator) { + public static void write(Object object, JsonGenerator jsonGenerator) throws IOException { EJsonWriter.write(object, jsonGenerator); } /** * Parse the json and return as a Map. */ - public static Map parseObject(String json) { + public static Map parseObject(String json) throws IOException { return EJsonReader.parseObject(json); } /** * Parse the json and return as a Map taking a reader. */ - public static Map parseObject(Reader reader) { + public static Map parseObject(Reader reader) throws IOException { return EJsonReader.parseObject(reader); } /** * Parse the json and return as a Map taking a JsonParser. */ - public static Map parseObject(JsonParser parser) { + public static Map parseObject(JsonParser parser) throws IOException { return EJsonReader.parseObject(parser); } /** * Parse the json and return as a List. + * @throws IOException */ - public static List parseList(String json) { + public static List parseList(String json) throws IOException { return EJsonReader.parseList(json); } /** * Parse the json and return as a List taking a Reader. + * @throws IOException */ - public static List parseList(Reader reader) { + public static List parseList(Reader reader) throws IOException { return EJsonReader.parseList(reader); } /** * Parse the json and return as a List taking a JsonParser. */ - public static List parseList(JsonParser parser) { + public static List parseList(JsonParser parser) throws IOException { return EJsonReader.parseList(parser); } @@ -80,39 +82,39 @@ public class EJson { /** * Parse the json and return as a List or Map. */ - public static Object parse(String json) { + public static Object parse(String json) throws IOException { return EJsonReader.parse(json); } /** * Parse the json and return as a List or Map. */ - public static Object parse(Reader reader) { + public static Object parse(Reader reader) throws IOException { return EJsonReader.parse(reader, false); } /** * Parse the json and return as a List or Map. */ - public static Object parse(JsonParser parser) { + public static Object parse(JsonParser parser) throws IOException { 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(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) { + public static Object parsePartial(JsonParser parser) throws IOException { 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 f2012afe7..4e715e97b 100644 --- a/src/main/java/com/avaje/ebean/json/EJsonReader.java +++ b/src/main/java/com/avaje/ebean/json/EJsonReader.java @@ -1,5 +1,6 @@ package com.avaje.ebean.json; +import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; @@ -8,57 +9,59 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import javax.json.Json; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; class EJsonReader { + static JsonFactory json = new JsonFactory(); + @SuppressWarnings("unchecked") - static Map parseObject(String json) { + static Map parseObject(String json) throws IOException { return (Map) parse(json); } @SuppressWarnings("unchecked") - static Map parseObject(Reader reader) { + static Map parseObject(Reader reader) throws IOException { return (Map) parse(reader, false); } @SuppressWarnings("unchecked") - static Map parseObject(JsonParser parser) { + static Map parseObject(JsonParser parser) throws IOException { return (Map) parse(parser, false); } @SuppressWarnings("unchecked") - static List parseList(String json) { + static List parseList(String json) throws IOException { return (List) parse(json); } @SuppressWarnings("unchecked") - static List parseList(Reader reader) { + static List parseList(Reader reader) throws IOException { return (List) parse(reader, false); } @SuppressWarnings("unchecked") - static List parseList(JsonParser parser) { + static List parseList(JsonParser parser) throws IOException { return (List) parse(parser, false); } - static Object parse(String json) { + static Object parse(String json) throws IOException { return parse(new StringReader(json), false); } - static Object parse(Reader reader, boolean partial) { - return parse(Json.createParser(reader), partial); + static Object parse(Reader reader, boolean partial) throws IOException { + return parse(json.createParser(reader), partial); } - static Object parse(JsonParser parser, boolean partial) { + static Object parse(JsonParser parser, boolean partial) throws IOException { return new EJsonReader(parser, partial).parseJson(); } private final JsonParser parser; - private final boolean partial; + //private final boolean partial; private int depth; @@ -69,7 +72,7 @@ class EJsonReader { EJsonReader(JsonParser parser, boolean partial) { this.parser = parser; - this.partial = partial; + //this.partial = partial; } private void startArray() { @@ -113,73 +116,83 @@ class EJsonReader { private Object parseJson() { - if (!parser.hasNext()) { - return null; - } - - Event event = parser.next(); - if (Event.VALUE_NULL == event) { - // it is just a null value - return null; - } - Object simpleValue = getSimpleValue(event); - if (simpleValue != null) { - // it is a simple string, number or boolean - return simpleValue; - } - - stack = new Stack(); - // it is a object or array, process the first event - processEvent(event); - - // 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(); + try { + JsonToken token = parser.nextToken(); + if (JsonToken.VALUE_NULL == token) { + return null; } - - } + +//// if (jp.nextToken() != JsonToken.START_OBJECT) { +//// throw new IOException("Expected data to start with an Object"); +//// } +//// TwitterEntry result = new TwitterEntry(); +//// // Iterate over object fields: +//// while (jp.nextToken() != JsonToken.END_OBJECT) { +//// String fieldName = jp.getCurrentName(); +//// // Let's move to value +//// jp.nextToken(); +//// +// if (!parser.hasNext()) { +// return null; +// } +// +// +// Object simpleValue = getSimpleValue(JsonToken); +// if (simpleValue != null) { +// // it is a simple string, number or boolean +// return simpleValue; +// } - return currentContext.getValue(); + stack = new Stack(); + // it is a object or array, process the first JsonToken + processJsonToken(token); + + // process the rest of the object or array + while (depth > 0) { + token = parser.nextToken(); + processJsonToken(token); + } + + return currentContext.getValue(); + } catch (IOException e) { + throw new RuntimeException(e); + } } - /** - * See if the event is a value rather than object or array. - *

- * If just a value then return that value else return null. - */ - private Object getSimpleValue(Event event) { - - switch (event) { - case VALUE_STRING: - return parser.getString(); - - case VALUE_NUMBER: - if (parser.isIntegralNumber()) { - return parser.getLong(); - } else { - return parser.getBigDecimal(); - } - - case VALUE_TRUE: - return Boolean.TRUE; - - case VALUE_FALSE: - return Boolean.FALSE; - - default: - return null; - } - } +// /** +// * See if the JsonToken is a value rather than object or array. +// *

+// * If just a value then return that value else return null. +// * @throws IOException +// */ +// private Object getSimpleValue(JsonToken JsonToken) throws IOException { +// +// switch (JsonToken) { +// case VALUE_STRING: +// return parser.getValueAsString(); +// +// case VALUE_NUMBER_INT: +// return parser.getLongValue(); +// +// case VALUE_NUMBER_FLOAT: +// return parser.getDecimalValue(); +// +// case VALUE_TRUE: +// return Boolean.TRUE; +// +// case VALUE_FALSE: +// return Boolean.FALSE; +// +// default: +// return null; +// } +// } /** - * Process the event for objects and arrays. + * Process the JsonToken for objects and arrays. */ - private void processEvent(Event event) { - switch (event) { + private void processJsonToken(JsonToken token) throws IOException { + switch (token) { case START_ARRAY: startArray(); @@ -189,20 +202,20 @@ class EJsonReader { startObject(); break; - case KEY_NAME: - currentContext.setKey(parser.getString()); + case FIELD_NAME: + currentContext.setKey(parser.getCurrentName()); break; case VALUE_STRING: - setValue(parser.getString()); + setValue(parser.getValueAsString()); break; - case VALUE_NUMBER: - if (parser.isIntegralNumber()) { - setValue(parser.getLong()); - } else { - setValue(parser.getBigDecimal()); - } + case VALUE_NUMBER_INT: + setValue(parser.getLongValue()); + break; + + case VALUE_NUMBER_FLOAT: + setValue(parser.getDecimalValue()); break; case VALUE_TRUE: diff --git a/src/main/java/com/avaje/ebean/json/EJsonWriter.java b/src/main/java/com/avaje/ebean/json/EJsonWriter.java index 16a58aed7..64e0c63bd 100644 --- a/src/main/java/com/avaje/ebean/json/EJsonWriter.java +++ b/src/main/java/com/avaje/ebean/json/EJsonWriter.java @@ -1,7 +1,6 @@ package com.avaje.ebean.json; -import java.io.StringWriter; -import java.io.Writer; +import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; @@ -10,22 +9,21 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import javax.json.Json; -import javax.json.stream.JsonGenerator; +import com.fasterxml.jackson.core.JsonGenerator; class EJsonWriter { - static String write(Object object) { - StringWriter writer = new StringWriter(200); - write(object, writer); - return writer.toString(); - } - - static void write(Object object, Writer writer) { - JsonGenerator generator = Json.createGenerator(writer); - write(object, generator); - generator.close(); - } +// static String write(Object object) { +// StringWriter writer = new StringWriter(200); +// write(object, writer); +// return writer.toString(); +// } +// +// static void write(Object object, Writer writer) { +// JsonGenerator generator = Json.createGenerator(writer); +// write(object, generator); +// generator.close(); +// } static void write(Object object, JsonGenerator jsonGenerator) { new EJsonWriter(jsonGenerator).writeJson(object); @@ -43,55 +41,60 @@ class EJsonWriter { @SuppressWarnings("unchecked") private void writeJson(String name, Object object) { - if (object == null) { - writeNull(name); + try { + if (object == null) { + writeNull(name); - } else if (object instanceof Map) { - writeMap(name, (Map) object); + } else if (object instanceof Map) { + writeMap(name, (Map) object); - } else if (object instanceof Collection) { - writeCollection(name, (Collection) object); + } else if (object instanceof Collection) { + writeCollection(name, (Collection) object); - } else if (object instanceof Boolean) { - writeBoolean(name, (Boolean) object); + } else if (object instanceof Boolean) { + writeBoolean(name, (Boolean) object); - } else if (object instanceof Number) { - writeNumber(name, (Number) object); + } else if (object instanceof Number) { + writeNumber(name, (Number) object); - } else if (object instanceof Date) { - writeDate(name, (Date) object); + } else if (object instanceof Date) { + writeDate(name, (Date) object); - } else if (object instanceof String) { - writeString(name, (String) object); + } 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()); + } else if (object instanceof Map.Entry) { + Map.Entry entry = (Map.Entry) object; + writeJson(entry.getKey().toString(), entry.getValue()); + + } else { + writeString(name, object.toString()); + } + + } catch (IOException e) { + throw new RuntimeException(e); } - } - private void writeBoolean(String name, Boolean object) { + private void writeBoolean(String name, Boolean object) throws IOException { if (name == null) { - jsonGenerator.write(object); + jsonGenerator.writeBoolean(object); } else { - jsonGenerator.write(name, object); + jsonGenerator.writeBooleanField(name, object); } } - private void writeDate(String name, Date object) { + private void writeDate(String name, Date object) throws IOException { if (name == null) { - jsonGenerator.write(object.getTime()); + jsonGenerator.writeNumber(object.getTime()); } else { - jsonGenerator.write(name, object.getTime()); + jsonGenerator.writeNumberField(name, object.getTime()); } } - private void writeNumber(String name, Number object) { + private void writeNumber(String name, Number object) throws IOException { + if (object instanceof Long) { writeLong(name, object); @@ -112,94 +115,88 @@ class EJsonWriter { } } - private void writeGeneralNumber(String name, Number object) { + private void writeGeneralNumber(String name, Number object) throws IOException { + writeBigDecimal(name, new BigDecimal(object.toString())); + } + + private void writeBigDecimal(String name, Number object) throws IOException { if (name == null) { - jsonGenerator.write(new BigDecimal(object.toString())); + jsonGenerator.writeNumber((BigDecimal) object); } else { - jsonGenerator.write(name, new BigDecimal(object.toString())); + jsonGenerator.writeNumberField(name, (BigDecimal) object); } } - private void writeBigDecimal(String name, Number object) { + private void writeBigInteger(String name, Number object) throws IOException { if (name == null) { - jsonGenerator.write((BigDecimal) object); + jsonGenerator.writeNumber((BigInteger) object); } else { - jsonGenerator.write(name, (BigDecimal) object); + jsonGenerator.writeNumberField(name, ((BigInteger) object).longValue()); } } - private void writeBigInteger(String name, Number object) { + private void writeDouble(String name, Number object) throws IOException { if (name == null) { - jsonGenerator.write((BigInteger) object); + jsonGenerator.writeNumber((Double) object); } else { - jsonGenerator.write(name, (BigInteger) object); + jsonGenerator.writeNumberField(name, (Double) object); } } - private void writeDouble(String name, Number object) { + private void writeLong(String name, Number object) throws IOException { if (name == null) { - jsonGenerator.write((Double) object); + jsonGenerator.writeNumber((Long) object); } else { - jsonGenerator.write(name, (Double) object); + jsonGenerator.writeNumberField(name, (Long) object); } } - private void writeLong(String name, Number object) { + private void writeInteger(String name, Number object) throws IOException { if (name == null) { - jsonGenerator.write((Long) object); + jsonGenerator.writeNumber((Integer) object); } else { - jsonGenerator.write(name, (Long) object); + jsonGenerator.writeNumberField(name, (Integer) object); } } - private void writeInteger(String name, Number object) { - if (name == null) { - jsonGenerator.write((Integer) object); - } else { - jsonGenerator.write(name, (Integer) object); - } - } - - private void writeNull(String name) { + private void writeNull(String name) throws IOException { if (name == null) { jsonGenerator.writeNull(); } else { - jsonGenerator.writeNull(name); + jsonGenerator.writeNullField(name); } } - private void writeString(String name, String object) { + private void writeString(String name, String object) throws IOException { if (name == null) { - jsonGenerator.write(object); + jsonGenerator.writeString(object); } else { - jsonGenerator.write(name, object); + jsonGenerator.writeStringField(name, object); } } - private void writeCollection(String name, Collection collection) { - if (name == null) { - jsonGenerator.writeStartArray(); - } else { - jsonGenerator.writeStartArray(name); - } + private void writeCollection(String name, Collection collection) throws IOException { + if (name != null) { + jsonGenerator.writeFieldName(name); + } + jsonGenerator.writeStartArray(); for (Object object : collection) { writeJson(null, object); } - jsonGenerator.writeEnd(); + jsonGenerator.writeEndArray(); } - private void writeMap(String name, Map map) { + private void writeMap(String name, Map map) throws IOException { - if (name == null) { - jsonGenerator.writeStartObject(); - } else { - jsonGenerator.writeStartObject(name); + if (name != null) { + jsonGenerator.writeFieldName(name); } + jsonGenerator.writeStartObject(); Set> entrySet = map.entrySet(); for (Entry entry : entrySet) { writeJson(entry.getKey().toString(), entry.getValue()); } - jsonGenerator.writeEnd(); + jsonGenerator.writeEndObject(); } } 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 a453c9231..ab5b182f0 100644 --- a/src/main/java/com/avaje/ebean/text/json/JsonContext.java +++ b/src/main/java/com/avaje/ebean/text/json/JsonContext.java @@ -1,10 +1,14 @@ package com.avaje.ebean.text.json; +import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.lang.reflect.Type; import java.util.List; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; + /** * Converts objects to and from JSON format. * @@ -15,34 +19,35 @@ public interface JsonContext { /** * Convert json string input into a Bean of a specific type. */ - public T toBean(Class rootType, String json); + public T toBean(Class rootType, String json) throws IOException; /** * Convert json reader input into a Bean of a specific type. */ - public T toBean(Class rootType, Reader json); + public T toBean(Class rootType, Reader json) throws IOException; /** * Convert json string input into a list of beans of a specific type. */ - public List toList(Class rootType, String json); + public List toList(Class rootType, String json) throws IOException; /** * Convert json reader input into a list of beans of a specific type. + * @throws IOException */ - public List toList(Class rootType, Reader json); + public List toList(Class rootType, Reader json) throws IOException; /** * Use the genericType to determine if this should be converted into a List or * bean. */ - public Object toObject(Type genericType, Reader json); + public Object toObject(Type genericType, Reader json) throws IOException; /** * Use the genericType to determine if this should be converted into a List or * bean. */ - public Object toObject(Type genericType, String json); + public Object toObject(Type genericType, String json) throws IOException; /** * Write the bean or collection in JSON format to the writer with default @@ -53,7 +58,7 @@ public interface JsonContext { * @param writer * used to write the json output to */ - public void toJsonWriter(Object o, Writer writer); + public void toJsonWriter(Object o, Writer writer) throws IOException; /** * With additional options to specify JsonValueAdapter and @@ -66,17 +71,17 @@ public interface JsonContext { * @param options * additional options to control the JSON output */ - public void toJsonWriter(Object o, Writer writer, JsonWriteOptions options); + public void toJsonWriter(Object o, Writer writer, JsonWriteOptions options) throws IOException; /** * Convert a bean or collection to json string using default options. */ - public String toJsonString(Object o); + public String toJsonString(Object o) throws IOException; /** * Convert a bean or collection to json string. */ - public String toJsonString(Object o, JsonWriteOptions options); + public String toJsonString(Object o, JsonWriteOptions options) throws IOException; /** * Return true if the type is known as an Entity or Xml type or a List Set or @@ -84,4 +89,13 @@ public interface JsonContext { */ public boolean isSupportedType(Type genericType); + /** + * Create and return a new JsonGenerator for the given writer. + */ + public JsonGenerator createGenerator(Writer writer) throws IOException; + + /** + * Create and return a new JsonParser for the given reader. + */ + public JsonParser createParser(Reader reader) throws IOException; } \ No newline at end of file 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 a59d768d7..b3810aaa5 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -2081,11 +2081,18 @@ public final class DefaultServer implements SpiEbeanServer { return new CallStack(finalTrace); } - public JsonContext createJsonContext() { + + @Override + public JsonContext json() { // immutable thread safe so return shared instance return jsonContext; } + @Override + public JsonContext createJsonContext() { + return json(); + } + @Override public void collectQueryStats(ObjectGraphNode node, long loadedBeanCount, long timeMicros) { 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 79aec6675..a02bbe763 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java @@ -39,6 +39,7 @@ import com.avaje.ebeaninternal.server.transaction.TransactionManager; import com.avaje.ebeaninternal.server.transaction.TransactionScopeManager; import com.avaje.ebeaninternal.server.type.DefaultTypeManager; import com.avaje.ebeaninternal.server.type.TypeManager; +import com.fasterxml.jackson.core.JsonFactory; /** * Used to extend the ServerConfig with additional objects used to configure and @@ -88,10 +89,13 @@ public class InternalConfiguration { private final XmlConfig xmlConfig; + private final JsonFactory jsonFactory; + public InternalConfiguration(XmlConfig xmlConfig, ClusterManager clusterManager, ServerCacheManager cacheManager, SpiBackgroundExecutor backgroundExecutor, ServerConfig serverConfig, BootupClasses bootupClasses, PstmtBatch pstmtBatch) { + this.jsonFactory = serverConfig.getJsonFactory(); this.xmlConfig = xmlConfig; this.pstmtBatch = pstmtBatch; this.clusterManager = clusterManager; @@ -162,8 +166,7 @@ public class InternalConfiguration { public JsonContext createJsonContext(SpiEbeanServer server) { - - return new DJsonContext(server); + return new DJsonContext(server, jsonFactory); } public XmlConfig getXmlConfig() { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanCollectionHelp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanCollectionHelp.java index 842e0545f..08eb0d9ff 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanCollectionHelp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanCollectionHelp.java @@ -1,5 +1,6 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; import java.util.Iterator; import com.avaje.ebean.EbeanServer; @@ -59,9 +60,9 @@ public interface BeanCollectionHelp { */ public void refresh(BeanCollection bc, EntityBean parentBean); - /** - * Write the collection out as json. - */ - public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude); + /** + * Write the collection out as json. + */ + public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude) throws IOException; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java index 67eadf243..15f11c47d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java @@ -1,5 +1,6 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; import java.lang.reflect.Modifier; import java.sql.SQLException; import java.util.ArrayList; @@ -13,7 +14,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import javax.json.stream.JsonParser; import javax.persistence.PersistenceException; import org.slf4j.Logger; @@ -67,6 +67,7 @@ import com.avaje.ebeaninternal.server.type.TypeManager; import com.avaje.ebeaninternal.util.SortByClause; import com.avaje.ebeaninternal.util.SortByClause.Property; import com.avaje.ebeaninternal.util.SortByClauseParser; +import com.fasterxml.jackson.core.JsonParser; /** * Describes Beans including their deployment information. @@ -2112,23 +2113,23 @@ public class BeanDescriptor implements MetaBeanInfo { return propertiesLocal; } - public void jsonWrite(WriteJson writeJson, EntityBean bean) { + public void jsonWrite(WriteJson writeJson, EntityBean bean) throws IOException { jsonHelp.jsonWrite(writeJson, bean, null); } - public void jsonWrite(WriteJson writeJson, EntityBean bean, String key) { + public void jsonWrite(WriteJson writeJson, EntityBean bean, String key) throws IOException { jsonHelp.jsonWrite(writeJson, bean, key); } - protected void jsonWriteProperties(WriteJson writeJson, EntityBean bean) { + protected void jsonWriteProperties(WriteJson writeJson, EntityBean bean) throws IOException { jsonHelp.jsonWriteProperties(writeJson, bean); } - public T jsonRead(JsonParser parser, String path) { + public T jsonRead(JsonParser parser, String path) throws IOException { return jsonHelp.jsonRead(parser, path); } - protected T jsonReadObject(JsonParser parser, String path) { + protected T jsonReadObject(JsonParser parser, String path) throws IOException { return jsonHelp.jsonReadObject(parser, path); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java index b6540e7db..4e33c009b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorJsonHelp.java @@ -1,12 +1,13 @@ package com.avaje.ebeaninternal.server.deploy; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; +import java.io.IOException; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.text.TextException; import com.avaje.ebeaninternal.server.text.json.WriteJson; import com.avaje.ebeaninternal.server.text.json.WriteJson.WriteBean; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; public class BeanDescriptorJsonHelp { @@ -19,31 +20,27 @@ public class BeanDescriptorJsonHelp { this.inheritInfo = desc.inheritInfo; } - public void jsonWrite(WriteJson writeJson, EntityBean bean, String key) { + public void jsonWrite(WriteJson writeJson, EntityBean bean, String key) throws IOException { -// if (writeJson.hasBean()) { + writeJson.writeStartObject(key); - writeJson.writeStartObject(key); - //WriteBeanState prevState = ctx.pushBeanState(bean); + if (inheritInfo == null) { + jsonWriteProperties(writeJson, bean); - if (inheritInfo == null) { - jsonWriteProperties(writeJson, bean); - - } else { - InheritInfo localInheritInfo = inheritInfo.readType(bean.getClass()); - String discValue = localInheritInfo.getDiscriminatorStringValue(); - String discColumn = localInheritInfo.getDiscriminatorColumn(); - writeJson.gen().write(discColumn, discValue); + } else { + InheritInfo localInheritInfo = inheritInfo.readType(bean.getClass()); + String discValue = localInheritInfo.getDiscriminatorStringValue(); + String discColumn = localInheritInfo.getDiscriminatorColumn(); + writeJson.gen().writeStringField(discColumn, discValue); - BeanDescriptor localDescriptor = localInheritInfo.getBeanDescriptor(); - localDescriptor.jsonWriteProperties(writeJson, bean); - } + BeanDescriptor localDescriptor = localInheritInfo.getBeanDescriptor(); + localDescriptor.jsonWriteProperties(writeJson, bean); + } - //ctx.pushPreviousState(prevState); - writeJson.gen().writeEnd(); + writeJson.writeEndObject(); } - protected void jsonWriteProperties(WriteJson writeJson, EntityBean bean) { + protected void jsonWriteProperties(WriteJson writeJson, EntityBean bean) throws IOException { WriteBean writeBean = writeJson.createWriteBean(desc, bean); @@ -52,17 +49,14 @@ public class BeanDescriptorJsonHelp { @SuppressWarnings("unchecked") - public T jsonRead(JsonParser parser, String path) { + public T jsonRead(JsonParser parser, String path) throws IOException { - if (!parser.hasNext()) { + JsonToken token = parser.nextToken(); + if (JsonToken.VALUE_NULL == token || JsonToken.END_ARRAY == token) { return null; } - Event event = parser.next(); - if (Event.VALUE_NULL == event || Event.END_ARRAY == event) { - return null; - } - if (Event.START_OBJECT != event) { - throw new RuntimeException("Unexpected token "+event+" - expecting start_object at: "+parser.getLocation()); + if (JsonToken.START_OBJECT != token) { + throw new IOException("Unexpected token "+token+" - expecting start_object at: "+parser.getCurrentLocation()); } if (desc.inheritInfo == null) { @@ -72,12 +66,13 @@ public class BeanDescriptorJsonHelp { // check for the discriminator value to determine the correct sub type String discColumn = inheritInfo.getRoot().getDiscriminatorColumn(); - if (!parser.hasNext() || ((event = parser.next()) != Event.KEY_NAME)) { + token = parser.nextToken(); + if (token != JsonToken.FIELD_NAME) { String msg = "Error reading inheritance discriminator - expected [" + discColumn + "] but no json key?"; throw new TextException(msg); } - String propName = parser.getString(); + String propName = parser.getCurrentName(); if (!propName.equalsIgnoreCase(discColumn)) { // just try to assume this is the correct bean type in the inheritance BeanProperty property = desc.getBeanProperty(propName); @@ -89,13 +84,8 @@ public class BeanDescriptorJsonHelp { String msg = "Error reading inheritance discriminator, expected property ["+discColumn+"] but got [" + propName + "] ?"; throw new TextException(msg); } - - if (!parser.hasNext() || ((event = parser.next()) != Event.VALUE_STRING)) { - String msg = "Error reading inheritance discriminator - expected value_string token but got [" + event + "] at ["+parser.getLocation()+"]?"; - throw new TextException(msg); - } - - String discValue = parser.getString(); + + String discValue = parser.nextTextValue(); // determine the sub type for this particular json object InheritInfo localInheritInfo = inheritInfo.readType(discValue); @@ -103,39 +93,35 @@ public class BeanDescriptorJsonHelp { return (T) localDescriptor.jsonReadObject(parser, path); } - protected T jsonReadObject(JsonParser parser, String path) { + protected T jsonReadObject(JsonParser parser, String path) throws IOException { EntityBean bean = desc.createEntityBean(); - //ctx.pushBean(bean, path, this); - return jsonReadProperties(parser, bean); } @SuppressWarnings("unchecked") - protected T jsonReadProperties(JsonParser parser, EntityBean bean) { + protected T jsonReadProperties(JsonParser parser, EntityBean bean) throws IOException { do { - if (parser.hasNext()) { - Event event = parser.next(); - if (Event.KEY_NAME == event) { - String key = parser.getString(); - BeanProperty p = desc.getBeanProperty(key); - if (p != null) { - p.jsonRead(parser, bean); - - } else { - //Object rawValue = EJson.parse(parser); - // unknown property key ... - //ctx.readUnmappedJson(propName); - } - - } else if (Event.END_OBJECT == event) { - break; - + JsonToken event = parser.nextToken(); + if (JsonToken.FIELD_NAME == event) { + String key = parser.getCurrentName(); + BeanProperty p = desc.getBeanProperty(key); + if (p != null) { + p.jsonRead(parser, bean); + } else { - throw new RuntimeException("Unexpected token "+event+" - expecting key or end_object at: "+parser.getLocation()); + // Object rawValue = EJson.parse(parser); + // unknown property key ... + // ctx.readUnmappedJson(propName); } + + } else if (JsonToken.END_OBJECT == event) { + break; + + } else { + throw new RuntimeException("Unexpected token " + event + " - expecting key or end_object at: " + parser.getCurrentLocation()); } } while (true); diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanListHelp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanListHelp.java index 71860bbd6..4e7568b4d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanListHelp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanListHelp.java @@ -1,5 +1,6 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -128,7 +129,7 @@ public final class BeanListHelp implements BeanCollectionHelp { } } - public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude) { + public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude) throws IOException { List list; if (collection instanceof BeanCollection) { @@ -147,11 +148,11 @@ public final class BeanListHelp implements BeanCollectionHelp { list = (List) collection; } - ctx.gen().writeStartArray(name); + ctx.writeStartArray(name); for (int j = 0; j < list.size(); j++) { targetDescriptor.jsonWrite(ctx, (EntityBean)list.get(j)); } - ctx.gen().writeEnd(); + ctx.writeEndArray(); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanMapHelp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanMapHelp.java index b4c6eb4bb..79a8b972c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanMapHelp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanMapHelp.java @@ -1,5 +1,6 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; @@ -156,7 +157,7 @@ public final class BeanMapHelp implements BeanCollectionHelp { } } - public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude) { + public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude) throws IOException { Map map; if (collection instanceof BeanCollection){ @@ -175,14 +176,14 @@ public final class BeanMapHelp implements BeanCollectionHelp { map = (Map)collection; } - ctx.gen().writeStartArray(name); + ctx.writeStartArray(name); Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); //FIXME: json write map key ... targetDescriptor.jsonWrite(ctx, (EntityBean) entry.getValue()); } - ctx.gen().writeEnd(); + ctx.writeEndArray(); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java index 85315b389..7b0d79fb5 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanProperty.java @@ -10,8 +10,6 @@ import java.sql.Types; import java.util.List; import java.util.Map; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; import javax.persistence.PersistenceException; import com.avaje.ebean.bean.EntityBean; @@ -34,6 +32,8 @@ import com.avaje.ebeaninternal.server.reflect.BeanReflectSetter; import com.avaje.ebeaninternal.server.text.json.WriteJson; import com.avaje.ebeaninternal.server.type.DataBind; import com.avaje.ebeaninternal.server.type.ScalarType; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Description of a property of a bean. Includes its deployment information such @@ -1186,32 +1186,30 @@ public class BeanProperty implements ElPropertyValue { return name; } - public void jsonWrite(WriteJson writeJson, EntityBean bean) { + public void jsonWrite(WriteJson writeJson, EntityBean bean) throws IOException { if (!jsonSerialize) { return; } Object value = getValueIntercept(bean); if (value == null) { - writeJson.gen().writeNull(name); + writeJson.writeNull(name); } else { scalarType.jsonWrite(writeJson.gen(), name, value); } } - public void jsonRead(JsonParser ctx, EntityBean bean) { + public void jsonRead(JsonParser ctx, EntityBean bean) throws IOException { if (!jsonDeserialize) { return; } - if (!ctx.hasNext()) { - throw new RuntimeException(ctx.getLocation().toString()); - } - Event event = ctx.next(); - if (Event.VALUE_NULL == event) { + + JsonToken event = ctx.nextToken(); + if (JsonToken.VALUE_NULL == event) { setValue(bean, null); } else { + // expect to read non-null json value Object objValue = scalarType.jsonRead(ctx, event); setValue(bean, objValue); } - } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index b31fccab6..0ee972c80 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -1,11 +1,11 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import javax.json.stream.JsonParser; import javax.persistence.PersistenceException; import org.slf4j.Logger; @@ -30,6 +30,7 @@ import com.avaje.ebeaninternal.server.el.ElPropertyValue; import com.avaje.ebeaninternal.server.lib.util.StringHelper; import com.avaje.ebeaninternal.server.query.SqlBeanLoad; import com.avaje.ebeaninternal.server.text.json.WriteJson; +import com.fasterxml.jackson.core.JsonParser; /** * Property mapped to a List Set or Map. @@ -877,7 +878,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { return null != targetDescriptor.getId(otherBean); } - public void jsonWrite(WriteJson ctx, EntityBean bean) { + public void jsonWrite(WriteJson ctx, EntityBean bean) throws IOException { if(!this.jsonSerialize){ return; } @@ -898,7 +899,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { } } - public void jsonRead(JsonParser parser, EntityBean parentBean) { + public void jsonRead(JsonParser parser, EntityBean parentBean) throws IOException { jsonHelp.jsonRead(parser, parentBean); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java index 9c923f52d..b97f579dc 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocManyJsonHelp.java @@ -1,11 +1,12 @@ package com.avaje.ebeaninternal.server.deploy; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; +import java.io.IOException; import com.avaje.ebean.bean.BeanCollectionAdd; import com.avaje.ebean.bean.EntityBean; -import com.avaje.ebean.text.TextException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; public class BeanPropertyAssocManyJsonHelp { @@ -15,23 +16,24 @@ public class BeanPropertyAssocManyJsonHelp { this.many = many; } - public void jsonRead(JsonParser parser, EntityBean parentBean) { + public void jsonRead(JsonParser parser, EntityBean parentBean) throws IOException { - if (!this.many.jsonDeserialize || !parser.hasNext()) { + if (!this.many.jsonDeserialize) { return; } - Event event = parser.next(); - if (Event.VALUE_NULL == event) { + + JsonToken event = parser.nextToken(); + if (JsonToken.VALUE_NULL == event) { return; } - if (Event.START_ARRAY != event) { - throw new TextException("Unexpected token "+event+" - expecting start_array at: "+parser.getLocation()); + if (JsonToken.START_ARRAY != event) { + throw new JsonParseException("Unexpected token " + event + " - expecting start_array ", parser.getCurrentLocation()); } - + Object collection = many.createEmpty(false); BeanCollectionAdd add = many.getBeanCollectionAdd(collection, null); do { - EntityBean detailBean = (EntityBean)many.targetDescriptor.jsonRead(parser, many.name); + EntityBean detailBean = (EntityBean) many.targetDescriptor.jsonRead(parser, many.name); if (detailBean == null) { // read the entire array break; diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java index d0a7c964d..997b04659 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyAssocOne.java @@ -1,11 +1,11 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import javax.json.stream.JsonParser; import javax.persistence.PersistenceException; import com.avaje.ebean.EbeanServer; @@ -26,6 +26,7 @@ import com.avaje.ebeaninternal.server.query.SplitName; import com.avaje.ebeaninternal.server.query.SqlBeanLoad; import com.avaje.ebeaninternal.server.query.SqlJoinType; import com.avaje.ebeaninternal.server.text.json.WriteJson; +import com.fasterxml.jackson.core.JsonParser; /** * Property mapped to a joined bean. @@ -830,36 +831,40 @@ public class BeanPropertyAssocOne extends BeanPropertyAssoc { } } - @Override - public void jsonWrite(WriteJson writeJson, EntityBean bean) { - - Object value = getValueIntercept(bean); - if (value == null){ - writeJson.gen().writeNull(name); - - } else { - if (writeJson.isParentBean(value)){ - // bi-directional and already rendered parent - - } else { - // Hmmm, not writing complex non-entity bean - if (value instanceof EntityBean) { - writeJson.beginAssocOne(name, bean); - BeanDescriptor refDesc = descriptor.getBeanDescriptor(value.getClass()); - refDesc.jsonWrite(writeJson, (EntityBean)value, name); - writeJson.endAssocOne(); - } - } - } + @Override + public void jsonWrite(WriteJson writeJson, EntityBean bean) throws IOException { + + if (!jsonSerialize) { + return; } - @Override - public void jsonRead(JsonParser parser, EntityBean bean) { - if (targetDescriptor != null) { - T assocBean = targetDescriptor.jsonRead(parser, name); - setValue(bean, assocBean); + Object value = getValueIntercept(bean); + if (value == null) { + writeJson.writeNull(name); + + } else { + if (writeJson.isParentBean(value)) { + // bi-directional and already rendered parent + + } else { + // Hmmm, not writing complex non-entity bean + if (value instanceof EntityBean) { + writeJson.beginAssocOne(name, bean); + BeanDescriptor refDesc = descriptor.getBeanDescriptor(value.getClass()); + refDesc.jsonWrite(writeJson, (EntityBean) value, name); + writeJson.endAssocOne(); + } } } + } + + @Override + public void jsonRead(JsonParser parser, EntityBean bean) throws IOException { + if (jsonDeserialize && targetDescriptor != null) { + T assocBean = targetDescriptor.jsonRead(parser, name); + setValue(bean, assocBean); + } + } public boolean isReference(Object detailBean) { EntityBean eb = (EntityBean)detailBean; 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 ea8c31606..0adbffb64 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyCompound.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanPropertyCompound.java @@ -1,12 +1,11 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; 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; @@ -18,6 +17,7 @@ import com.avaje.ebeaninternal.server.text.json.WriteJson; import com.avaje.ebeaninternal.server.type.CtCompoundProperty; import com.avaje.ebeaninternal.server.type.CtCompoundPropertyElAdapter; import com.avaje.ebeaninternal.server.type.CtCompoundType; +import com.fasterxml.jackson.core.JsonParser; /** * Property mapped to an Immutable Compound Value Object. @@ -180,19 +180,19 @@ public class BeanPropertyCompound extends BeanProperty { return bean; } - public void jsonWrite(WriteJson ctx, EntityBean bean) { + public void jsonWrite(WriteJson ctx, EntityBean bean) throws IOException { if (!jsonSerialize) { return; } Object value = getValueIntercept(bean); if (value == null) { - ctx.gen().writeNull(name); + ctx.writeNull(name); } else { compoundType.jsonWrite(ctx, value, name); } } - public void jsonRead(JsonParser ctx, EntityBean bean) { + public void jsonRead(JsonParser ctx, EntityBean bean) throws IOException { if (!jsonDeserialize) { return; diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanSetHelp.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanSetHelp.java index bc2f09931..a73c4054f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanSetHelp.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanSetHelp.java @@ -1,5 +1,6 @@ package com.avaje.ebeaninternal.server.deploy; +import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; @@ -129,7 +130,7 @@ public final class BeanSetHelp implements BeanCollectionHelp { } } - public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude) { + public void jsonWrite(WriteJson ctx, String name, Object collection, boolean explicitInclude) throws IOException { Set set; if (collection instanceof BeanCollection){ @@ -148,11 +149,11 @@ public final class BeanSetHelp implements BeanCollectionHelp { set = (Set)collection; } - ctx.gen().writeStartArray(name); + ctx.writeStartArray(name); Iterator it = set.iterator(); while (it.hasNext()) { targetDescriptor.jsonWrite(ctx, (EntityBean)it.next()); } - ctx.gen().writeEnd(); + ctx.writeEndArray(); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/EJsonReader.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/EJsonReader.java deleted file mode 100644 index 71f4e790e..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/EJsonReader.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import java.io.Reader; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; - -import javax.json.Json; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - -public class EJsonReader { - - @SuppressWarnings("unchecked") - public static Map parseObject(String json) { - return (Map) parse(json); - } - - @SuppressWarnings("unchecked") - public static List parseList(String json) { - return (List) parse(json); - } - - public static Object parse(String json) { - return parse(new StringReader(json)); - } - - public static Object parse(Reader reader) { - return parse(Json.createParser(reader)); - } - - public static Object parse(JsonParser parser) { - return new EJsonReader(parser).parseJson(); - } - - private final JsonParser parser; - - private final Stack stack = new Stack(); - - private Context currentContext; - - - EJsonReader(JsonParser parser) { - this.parser = parser; - } - - private void startArray() { - stack.push(currentContext); - currentContext = new ArrayContext(); - } - - private void startObject() { - stack.push(currentContext); - currentContext = new ObjectContext(); - } - - private void endArray() { - end(); - } - - private void endObject() { - end(); - } - - private void end() { - - if (!stack.isEmpty()) { - currentContext = stack.pop(); - } - } - - private void setValue(Object value) { - currentContext.setValue(value); - } - - private void setValueNull() { - currentContext.setValueNull(); - } - - private Object parseJson() { - - while (parser.hasNext()) { - Event event = parser.next(); - switch (event) { - - case START_ARRAY: - startArray(); - break; - - case START_OBJECT: - startObject(); - break; - - case KEY_NAME: - currentContext.setKey(parser.getString()); - break; - - case VALUE_STRING: - setValue(parser.getString()); - break; - - case VALUE_NUMBER: - if (parser.isIntegralNumber()) { - setValue(parser.getLong()); - } else { - setValue(parser.getBigDecimal()); - } - break; - - case VALUE_TRUE: - setValue(Boolean.TRUE); - break; - - case VALUE_FALSE: - setValue(Boolean.FALSE); - break; - - case VALUE_NULL: - setValueNull(); - break; - - case END_OBJECT: - endObject(); - break; - - case END_ARRAY: - endArray(); - break; - - default: - break; - } - } - - return currentContext.getValue(); - } - - private static final class Stack { - - private Context head; - - private void push(Context context) { - if (context != null) { - context.next = head; - head = context; - } - } - - private Context pop() { - if (head == null) { - throw new NoSuchElementException(); - } - Context temp = head; - head = head.next; - return temp; - } - - private boolean isEmpty() { - return head == null; - } - } - - private static abstract class Context { - Context next; - abstract Object getValue(); - abstract void setKey(String key); - abstract void setValue(Object value); - abstract void setValueNull(); - } - - private static class ObjectContext extends Context { - - private String key; - - Map map = new LinkedHashMap(); - - Object getValue() { - return map; - } - - public void setKey(String key) { - this.key = key; - } - - void setValue(Object value) { - map.put(key, value); - } - - void setValueNull() { - map.put(key, null); - } - } - - private static class ArrayContext extends Context { - - List values = new ArrayList(); - - Object getValue() { - return values; - } - - void setValue(Object value) { - values.add(value); - } - - void setValueNull() { - } - void setKey(String key) { - } - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ReadJson.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ReadJson.java deleted file mode 100644 index 871517f40..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ReadJson.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import javax.json.stream.JsonParser; - -public class ReadJson { - - JsonParser parser; - -} 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 8a43ccbef..9e0f2576e 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 @@ -1,5 +1,6 @@ package com.avaje.ebeaninternal.server.text.json; +import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; @@ -13,11 +14,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import javax.json.Json; -import javax.json.stream.JsonGenerator; -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; @@ -29,6 +25,11 @@ import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.util.ParamTypeHelper; import com.avaje.ebeaninternal.util.ParamTypeHelper.ManyType; import com.avaje.ebeaninternal.util.ParamTypeHelper.TypeInfo; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Default implementation of JsonContext. @@ -38,55 +39,59 @@ import com.avaje.ebeaninternal.util.ParamTypeHelper.TypeInfo; public class DJsonContext implements JsonContext { private final SpiEbeanServer server; + + private final JsonFactory jsonFactory; - public DJsonContext(SpiEbeanServer server) { + public DJsonContext(SpiEbeanServer server, JsonFactory jsonFactory) { this.server = server; + this.jsonFactory = (jsonFactory != null) ? jsonFactory : new JsonFactory(); } public boolean isSupportedType(Type genericType) { return server.isSupportedType(genericType); } - private JsonParser createReader(Reader jsonReader) { - return Json.createParser(jsonReader); + public JsonGenerator createGenerator(Writer writer) throws IOException { + return jsonFactory.createGenerator(writer); + } + + public JsonParser createParser(Reader reader) throws IOException { + return jsonFactory.createParser(reader); } - public T toBean(Class cls, String json) { + public T toBean(Class cls, String json) throws IOException { return toBean(cls, new StringReader(json)); } - public T toBean(Class cls, Reader jsonReader) { - return toBean(cls, createReader(jsonReader)); + public T toBean(Class cls, Reader jsonReader) throws IOException { + return toBean(cls, createParser(jsonReader)); } - private T toBean(Class cls, JsonParser parser) { + private T toBean(Class cls, JsonParser parser) throws IOException { BeanDescriptor d = getDecriptor(cls); return d.jsonRead(parser, null); } - public List toList(Class cls, String json) { + public List toList(Class cls, String json) throws IOException { return toList(cls, new StringReader(json)); } - public List toList(Class cls, Reader jsonReader) { - return toList(cls, createReader(jsonReader)); + public List toList(Class cls, Reader jsonReader) throws IOException { + return toList(cls, createParser(jsonReader)); } - private List toList(Class cls, JsonParser src) { + private List toList(Class cls, JsonParser src) throws IOException { try { BeanDescriptor d = getDecriptor(cls); List list = new ArrayList(); - if (!src.hasNext()) { - return list; - } - Event event = src.next(); - if (event != Event.START_ARRAY) { - throw new TextException("Expecting start_array event but got [" + event + "] at [" + src.getLocation() + "]"); + JsonToken event = src.nextToken(); + if (event != JsonToken.START_ARRAY) { + throw new JsonParseException("Expecting start_array event but got " + event ,src.getCurrentLocation()); } do { @@ -105,7 +110,7 @@ public class DJsonContext implements JsonContext { } } - public Object toObject(Type genericType, String json) { + public Object toObject(Type genericType, String json) throws IOException { TypeInfo info = ParamTypeHelper.getTypeInfo(genericType); ManyType manyType = info.getManyType(); @@ -121,7 +126,7 @@ public class DJsonContext implements JsonContext { } } - public Object toObject(Type genericType, Reader json) { + public Object toObject(Type genericType, Reader json) throws IOException { TypeInfo info = ParamTypeHelper.getTypeInfo(genericType); ManyType manyType = info.getManyType(); @@ -137,40 +142,40 @@ public class DJsonContext implements JsonContext { } } - public void toJsonWriter(Object o, Writer writer) { + public void toJsonWriter(Object o, Writer writer) throws IOException { toJsonWriter(o, writer, null); } - public void toJsonWriter(Object o, Writer writer, JsonWriteOptions options) { - JsonGenerator generator = Json.createGenerator(writer); + public void toJsonWriter(Object o, Writer writer, JsonWriteOptions options) throws IOException { + JsonGenerator generator = createGenerator(writer); toJsonInternal(o, generator, options); generator.close(); } - public String toJsonString(Object o) { + public String toJsonString(Object o) throws IOException { return toJsonString(o, null); } - public String toJsonString(Object o, JsonWriteOptions options) { + public String toJsonString(Object o, JsonWriteOptions options) throws IOException { StringWriter writer = new StringWriter(500); - JsonGenerator gen = Json.createGenerator(writer); + JsonGenerator gen = createGenerator(writer); toJsonInternal(o, gen, options); gen.close(); return writer.toString(); } @SuppressWarnings("unchecked") - private void toJsonInternal(Object o, JsonGenerator gen, JsonWriteOptions options) { + private void toJsonInternal(Object o, JsonGenerator gen, JsonWriteOptions options) throws IOException { if (o == null) { gen.writeNull(); } else if (o instanceof Number) { - gen.write(((Number) o).doubleValue()); + gen.writeNumber(((Number) o).doubleValue()); } else if (o instanceof Boolean) { - gen.write(((Boolean) o).booleanValue()); + gen.writeBoolean(((Boolean) o).booleanValue()); } else if (o instanceof String) { - gen.write((String) o); + gen.writeString((String) o); // } else if (o instanceof JsonElement) { @@ -192,13 +197,12 @@ public class DJsonContext implements JsonContext { return new WriteJson(server, gen, pathProps); } - private void toJsonFromCollection(Collection c, String key, JsonGenerator gen, JsonWriteOptions options) { + private void toJsonFromCollection(Collection c, String key, JsonGenerator gen, JsonWriteOptions options) throws IOException { - if (key == null) { - gen.writeStartArray(); - } else { - gen.writeStartArray(key); + if (key != null) { + gen.writeFieldName(key); } + gen.writeStartArray(); WriteJson writeJson = createWriteJson(gen, options); @@ -208,10 +212,10 @@ public class DJsonContext implements JsonContext { BeanDescriptor d = getDecriptor(t.getClass()); d.jsonWrite(writeJson, (EntityBean)t, null); } - gen.writeEnd(); + gen.writeEndArray(); } - private void toJsonFromMap(Map map, JsonGenerator gen, JsonWriteOptions options) { + private void toJsonFromMap(Map map, JsonGenerator gen, JsonWriteOptions options) throws IOException { Set> entrySet = map.entrySet(); Iterator> it = entrySet.iterator(); @@ -224,7 +228,7 @@ public class DJsonContext implements JsonContext { String key = entry.getKey().toString(); Object value = entry.getValue(); if (value == null) { - gen.writeNull(key); + gen.writeNullField(key); } else { if (value instanceof Collection) { toJsonFromCollection((Collection) value, key, gen, options); @@ -238,7 +242,7 @@ public class DJsonContext implements JsonContext { } } } - gen.writeEnd(); + gen.writeEndObject(); } private BeanDescriptor getDecriptor(Class cls) { 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 7fb263f09..58fb0e57a 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 @@ -1,17 +1,17 @@ package com.avaje.ebeaninternal.server.text.json; +import java.io.IOException; import java.util.Collection; import java.util.Iterator; import java.util.Set; -import javax.json.stream.JsonGenerator; - import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.text.PathProperties; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.deploy.BeanProperty; import com.avaje.ebeaninternal.server.util.ArrayStack; +import com.fasterxml.jackson.core.JsonGenerator; public class WriteJson { @@ -122,8 +122,8 @@ public class WriteJson { } } - public void write(WriteJson writeJson) { - //EntityBean bean = writeJson.getBean(); + public void write(WriteJson writeJson) throws IOException { + BeanProperty beanProp = desc.getIdProperty(); if (beanProp != null) { if (isIncludeProperty(beanProp)) { @@ -159,7 +159,7 @@ public class WriteJson { return null; } - public void toJson(String name, Collection c) { + public void toJson(String name, Collection c) throws IOException { beginAssocMany(name); @@ -181,22 +181,40 @@ public class WriteJson { return d; } - public void beginAssocMany(String key) { + public void beginAssocMany(String key) throws IOException { pathStack.pushPathKey(key); - generator.writeStartArray(key); + generator.writeFieldName(key); + generator.writeStartArray(); } - public void endAssocMany() { + public void endAssocMany() throws IOException { pathStack.pop(); - generator.writeEnd(); + generator.writeEndArray(); } - public void writeStartObject(String key) { - if (key == null) { - generator.writeStartObject(); - } else { - generator.writeStartObject(key); + public void writeStartArray(String key) throws IOException { + if (key != null) { + generator.writeFieldName(key); + } + generator.writeStartArray(); + } + + public void writeStartObject(String key) throws IOException { + if (key != null) { + generator.writeFieldName(key); } + generator.writeStartObject(); + } + + public void writeNull(String name) throws IOException { + generator.writeNullField(name); } + public void writeEndObject() throws IOException { + generator.writeEndObject(); + } + + public void writeEndArray() throws IOException { + generator.writeEndArray(); + } } 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 da6ab5d71..5167aca71 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/CtCompoundType.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/CtCompoundType.java @@ -1,5 +1,6 @@ package com.avaje.ebeaninternal.server.type; +import java.io.IOException; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.Map; @@ -195,7 +196,7 @@ public final class CtCompoundType implements ScalarDataReader { } - public void jsonWrite(WriteJson ctx, Object valueObject, String propertyName) { + public void jsonWrite(WriteJson ctx, Object valueObject, String propertyName) throws IOException { ctx.beginAssocOne(propertyName, valueObject); jsonWriteProps(ctx, valueObject, propertyName); @@ -203,13 +204,12 @@ public final class CtCompoundType implements ScalarDataReader { } @SuppressWarnings({ "unchecked", "rawtypes" }) - private void jsonWriteProps(WriteJson ctx, Object valueObject, String propertyName) { + private void jsonWriteProps(WriteJson ctx, Object valueObject, String propertyName) throws IOException { if (propertyName != null) { - ctx.gen().writeStartObject(propertyName); - } else { - ctx.gen().writeStartObject(); - } + ctx.gen().writeFieldName(propertyName); + } + ctx.gen().writeStartObject(); for (int i = 0; i < properties.length; i++) { String propName = properties[i].getName(); @@ -223,7 +223,7 @@ public final class CtCompoundType implements ScalarDataReader { } } - ctx.gen().writeEnd(); + ctx.gen().writeEndObject(); } } 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 8495fc3f8..da37c315f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarType.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarType.java @@ -5,12 +5,11 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.StringFormatter; import com.avaje.ebean.text.StringParser; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Describes a scalar type. @@ -189,8 +188,8 @@ public interface ScalarType extends StringParser, StringFormatter, ScalarData public void writeData(DataOutput dataOutput, Object v) throws IOException; - public Object jsonRead(JsonParser ctx, Event event); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException; - public void jsonWrite(JsonGenerator ctx, String name, Object value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException; } 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 d48b040c2..d2b8cacc4 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDate.java @@ -7,9 +7,9 @@ import java.sql.Date; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Base class for Date types. @@ -63,18 +63,18 @@ public abstract class ScalarTypeBaseDate extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - if (ctx.isIntegralNumber()) { - return parseDateTime(ctx.getLong()); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + if (JsonToken.VALUE_NUMBER_INT == event) { + return parseDateTime(ctx.getLongValue()); } else { - String string = ctx.getString(); - throw new RuntimeException("convert "+string); + String string = ctx.getText(); + throw new RuntimeException("convert " + string); } } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { long millis = convertToMillis(value); - ctx.write(name, millis); + ctx.writeNumberField(name, millis); } public abstract long convertToMillis(Object value); 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 287de52b9..35443da5f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseDateTime.java @@ -7,9 +7,9 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Base type for DateTime types. @@ -45,21 +45,23 @@ public abstract class ScalarTypeBaseDateTime extends ScalarTypeBase { } } - @Override - public Object jsonRead(JsonParser ctx, Event event) { - if (ctx.isIntegralNumber()) { - long millis = ctx.getLong(); - return parseDateTime(millis); - } else { - String string = ctx.getString(); - throw new RuntimeException("convert "+string); - } + @Override + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + + if (JsonToken.VALUE_NUMBER_INT == event) { + long millis = ctx.getLongValue(); + return parseDateTime(millis); + + } else { + String string = ctx.getText(); + throw new RuntimeException("convert " + string); } + } @Override - public void jsonWrite(JsonGenerator ctx, String name, Object value) { + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { long millis = convertToMillis(value); - ctx.write(name, millis); + ctx.writeNumberField(name, millis); } public String formatValue(T t) { 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 38950f0d9..cfa79e7f2 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBaseVarchar.java @@ -6,11 +6,10 @@ import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Base ScalarType for types which converts to and from a VARCHAR database @@ -106,11 +105,11 @@ public abstract class ScalarTypeBaseVarchar extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return parse(ctx.getString()); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return parse(ctx.getValueAsString()); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, format(value)); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeStringField(name, format(value)); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java index 91f363fe5..4aee53063 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBigDecimal.java @@ -4,15 +4,13 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.math.BigDecimal; -import java.math.BigInteger; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for BigDecimal. @@ -81,12 +79,12 @@ public class ScalarTypeBigDecimal extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getBigDecimal(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getDecimalValue(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (BigDecimal)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeNumberField(name, (BigDecimal)value); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java index 44608da90..1d78f0364 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBoolean.java @@ -3,16 +3,14 @@ package com.avaje.ebeaninternal.server.type; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import java.math.BigDecimal; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Boolean and boolean. @@ -293,12 +291,12 @@ public class ScalarTypeBoolean { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return Event.VALUE_TRUE == event ? Boolean.TRUE : Boolean.FALSE; + public Object jsonRead(JsonParser ctx, JsonToken event) { + return JsonToken.VALUE_TRUE == event ? Boolean.TRUE : Boolean.FALSE; } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (Boolean)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeBooleanField(name, (Boolean)value); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java index 003b78e2a..e0ad23496 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeByte.java @@ -6,12 +6,11 @@ import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Byte. @@ -48,7 +47,7 @@ public class ScalarTypeByte extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { + public Object jsonRead(JsonParser ctx, JsonToken event) { throw new TextException("Not supported"); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java index a2c11e603..2f3b3fb94 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesBase.java @@ -5,11 +5,10 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Base type for binary types. @@ -51,7 +50,7 @@ public abstract class ScalarTypeBytesBase extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { + public Object jsonRead(JsonParser ctx, JsonToken event) { throw new TextException("Not supported"); } 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 032002882..bd9f66180 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeBytesEncrypted.java @@ -5,11 +5,10 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Encrypted ScalarType that wraps a byte[] types. @@ -74,7 +73,7 @@ public class ScalarTypeBytesEncrypted implements ScalarType { } @Override - public Object jsonRead(JsonParser ctx, Event event) { + public Object jsonRead(JsonParser ctx, JsonToken event) { throw new TextException("Not supported"); } 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 8dc695e7a..d1f37206c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeChar.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeChar.java @@ -1,12 +1,12 @@ package com.avaje.ebeaninternal.server.type; +import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for char. @@ -61,11 +61,10 @@ public class ScalarTypeChar extends ScalarTypeBaseVarchar { public Character parse(String value) { return value.charAt(0); } - - @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getString(); - } + @Override + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getValueAsString(); + } } 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 72adf5552..6ea69b70f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCharArray.java @@ -1,13 +1,13 @@ package com.avaje.ebeaninternal.server.type; +import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for char[]. @@ -64,11 +64,11 @@ public class ScalarTypeCharArray extends ScalarTypeBaseVarchar{ } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getString().toCharArray(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getValueAsString().toCharArray(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, String.valueOf(value)); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeStringField(name, String.valueOf(value)); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClass.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClass.java index e2a1f110d..67086bd74 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClass.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeClass.java @@ -1,8 +1,11 @@ package com.avaje.ebeaninternal.server.type; -import javax.json.stream.JsonGenerator; +import java.io.IOException; + import javax.persistence.PersistenceException; +import com.fasterxml.jackson.core.JsonGenerator; + /** * ScalarType for Class that persists it to VARCHAR column. * @@ -44,8 +47,8 @@ public class ScalarTypeClass extends ScalarTypeBaseVarchar { } } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, formatValue((Class)value)); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeStringField(name, formatValue((Class)value)); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCurrency.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCurrency.java index eb58f0d7c..02679ccaf 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCurrency.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeCurrency.java @@ -1,10 +1,11 @@ package com.avaje.ebeaninternal.server.type; +import java.io.IOException; import java.util.Currency; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for java.util.Currency which converts to and from a VARCHAR database column. @@ -39,11 +40,11 @@ public class ScalarTypeCurrency extends ScalarTypeBaseVarchar { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return parse(ctx.getString()); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return parse(ctx.getValueAsString()); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, formatValue((Currency)value)); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeStringField(name, formatValue((Currency)value)); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java index 65be80b09..d33c29917 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeDouble.java @@ -5,13 +5,11 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import java.util.Currency; - -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Double and double. @@ -89,11 +87,11 @@ public class ScalarTypeDouble extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getBigDecimal().doubleValue(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getDoubleValue(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (Double)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeNumberField(name, (Double)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 7aa817b22..7c687152c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEncryptedWrapper.java @@ -5,9 +5,9 @@ import java.io.DataOutput; import java.io.IOException; import java.sql.SQLException; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; public class ScalarTypeEncryptedWrapper implements ScalarType { @@ -34,7 +34,7 @@ public class ScalarTypeEncryptedWrapper implements ScalarType { } @Override - public Object jsonRead(JsonParser ctx, Event event) { + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { return wrapped.jsonRead(ctx, event); } @@ -120,7 +120,7 @@ public class ScalarTypeEncryptedWrapper implements ScalarType { wrapped.accumulateScalarTypes(propName, list); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { 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 4a2220902..f6cc6a5b7 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java @@ -7,11 +7,10 @@ import java.sql.SQLException; import java.sql.Types; import java.util.EnumSet; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** @@ -230,14 +229,14 @@ public class ScalarTypeEnumStandard { } @Override - public Object jsonRead(JsonParser ctx, Event event) { + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { - String val = ctx.getString(); + String val = ctx.getValueAsString(); return parse(val); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, formatValue(value)); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeStringField(name, formatValue(value)); } public Object readData(DataInput dataInput) throws IOException { diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java index 973cc752b..d875fef89 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeFloat.java @@ -6,11 +6,10 @@ import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Float and float. @@ -87,11 +86,11 @@ public class ScalarTypeFloat extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getBigDecimal().floatValue(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getFloatValue(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (Float)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeNumberField(name, (Float)value); } } 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 dd1b29c35..4a2f8617f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeInteger.java @@ -6,12 +6,11 @@ import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Integer and int. @@ -68,11 +67,11 @@ public class ScalarTypeInteger extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return Integer.valueOf(ctx.getInt()); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getIntValue(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (Integer) value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeNumberField(name, (Integer) value); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java index 464255cc9..6d4b4146d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateMidnight.java @@ -4,7 +4,6 @@ import java.sql.Date; import java.sql.Types; import org.joda.time.DateMidnight; -import org.joda.time.DateTime; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java index 485007afc..807e7f5df 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaDateTime.java @@ -4,7 +4,6 @@ import java.sql.Timestamp; import java.sql.Types; import org.joda.time.DateTime; -import org.joda.time.LocalDate; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java index f0da2c0f7..15b6aa246 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeJodaLocalTime.java @@ -7,14 +7,13 @@ import java.sql.SQLException; import java.sql.Time; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import org.joda.time.DateTimeZone; import org.joda.time.LocalTime; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Joda LocalTime. This maps to a JDBC Time. @@ -67,17 +66,17 @@ public class ScalarTypeJodaLocalTime extends ScalarTypeBase { } @Override - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(value.toString()); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeStringField(name, value.toString()); } @Override - public Object jsonRead(JsonParser ctx, Event event) { - if (ctx.isIntegralNumber()) { - long millis = ctx.getLong(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + if (JsonToken.VALUE_NUMBER_INT == event) { + long millis = ctx.getLongValue(); return parseDateTime(millis); } else { - String string = ctx.getString(); + String string = ctx.getValueAsString(); throw new RuntimeException("convert "+string); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java index 5127d7f90..2088d559f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeLong.java @@ -6,11 +6,10 @@ import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Long and long. @@ -79,11 +78,11 @@ public class ScalarTypeLong extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getLong(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getLongValue(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (Long)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeNumberField(name, (Long)value); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java index c81303163..6cb53f831 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeMathBigInteger.java @@ -7,11 +7,10 @@ import java.math.BigInteger; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for java.math.BigInteger. @@ -85,12 +84,12 @@ public class ScalarTypeMathBigInteger extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getBigDecimal().toBigInteger(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getDecimalValue().toBigInteger(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (BigInteger)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeNumberField(name, ((BigInteger)value).longValue()); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java index 02a89f051..46746acfa 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypePostgresHstore.java @@ -6,11 +6,10 @@ import java.io.IOException; import java.sql.SQLException; import java.util.Map; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.config.dbplatform.PostgresPlatform; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * Postgres Hstore type which maps Map to a single 'HStore column' in the DB. @@ -74,7 +73,7 @@ public class ScalarTypePostgresHstore extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { + public Object jsonRead(JsonParser ctx, JsonToken event) { // TODO Auto-generated method stub return null; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeShort.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeShort.java index 0556411fc..89a7437e2 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeShort.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeShort.java @@ -6,12 +6,11 @@ import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebean.text.TextException; import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for Short and short. @@ -80,11 +79,11 @@ public class ScalarTypeShort extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return (short)ctx.getInt(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getShortValue(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (Short)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeNumberField(name, (Short)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 60477accd..236994692 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeString.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeString.java @@ -6,11 +6,10 @@ import java.io.IOException; import java.sql.SQLException; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for String. @@ -78,11 +77,11 @@ public class ScalarTypeString extends ScalarTypeBase { } @Override - public Object jsonRead(JsonParser ctx, Event event) { - return ctx.getString(); + public Object jsonRead(JsonParser ctx, JsonToken event) throws IOException { + return ctx.getValueAsString(); } - public void jsonWrite(JsonGenerator ctx, String name, Object value) { - ctx.write(name, (String)value); + public void jsonWrite(JsonGenerator ctx, String name, Object value) throws IOException { + ctx.writeStringField(name, (String)value); } } diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTime.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTime.java index 55ada137a..2776a91f4 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTime.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeTime.java @@ -7,11 +7,10 @@ import java.sql.SQLException; import java.sql.Time; import java.sql.Types; -import javax.json.stream.JsonGenerator; -import javax.json.stream.JsonParser; -import javax.json.stream.JsonParser.Event; - import com.avaje.ebeaninternal.server.core.BasicTypeConverter; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; /** * ScalarType for java.sql.Time. @@ -81,13 +80,13 @@ public class ScalarTypeTime extends ScalarTypeBase