You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2015/06/25 16:34:29 UTC
[2/2] olingo-odata4 git commit: [OLINGO-659] more clean-up,
small fixes, and additional tests
[OLINGO-659] more clean-up, small fixes, and additional tests
Signed-off-by: Christian Amend <ch...@sap.com>
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/2a841552
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/2a841552
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/2a841552
Branch: refs/heads/master
Commit: 2a841552f4935c57e7a21be0c25cb042a9863e8f
Parents: 94b3917
Author: Klaus Straubinger <kl...@sap.com>
Authored: Thu Jun 25 16:11:50 2015 +0200
Committer: Christian Amend <ch...@sap.com>
Committed: Thu Jun 25 16:26:38 2015 +0200
----------------------------------------------------------------------
.../olingo/commons/api/format/AcceptType.java | 7 +-
.../olingo/commons/api/format/ContentType.java | 74 +++----
.../olingo/commons/api/http/HttpHeader.java | 4 +
.../commons/api/format/ContentTypeTest.java | 16 +-
.../olingo/server/core/ContentNegotiator.java | 32 ++-
.../core/batchhandler/BatchPartHandler.java | 1 -
.../core/deserializer/batch/BatchBodyPart.java | 9 +-
.../deserializer/batch/BatchParserCommon.java | 34 ++-
.../batch/BatchRequestTransformator.java | 2 +-
.../json/ODataJsonDeserializer.java | 40 ++--
.../serializer/json/ODataJsonSerializer.java | 214 +++++++++----------
.../json/ServiceDocumentJsonSerializer.java | 33 ++-
.../server/core/ContentNegotiatorTest.java | 3 +-
.../json/ODataJsonDeserializerBasicTest.java | 82 +++----
.../tecsvc/processor/TechnicalProcessor.java | 7 +-
.../json/ODataJsonDeserializerEntityTest.java | 26 +--
.../json/ODataJsonSerializerTest.java | 156 ++++++++++----
.../serializer/json/ServiceDocumentTest.java | 11 +
18 files changed, 397 insertions(+), 354 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
index 874944b..ec273be 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/AcceptType.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
@@ -158,7 +159,11 @@ public class AcceptType {
}
public Map<String, String> getParameters() {
- return parameters;
+ return Collections.unmodifiableMap(parameters);
+ }
+
+ public String getParameter(final String name) {
+ return parameters.get(name.toLowerCase(Locale.ROOT));
}
public Float getQuality() {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
index 57f73df..473ff58 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/format/ContentType.java
@@ -24,6 +24,7 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
@@ -60,16 +61,16 @@ public final class ContentType {
public static final ContentType APPLICATION_JSON = new ContentType(APPLICATION, "json", null);
public static final ContentType JSON = ContentType.create(ContentType.APPLICATION_JSON,
- PARAMETER_ODATA_METADATA + '=' + VALUE_ODATA_METADATA_MINIMAL);
+ PARAMETER_ODATA_METADATA, VALUE_ODATA_METADATA_MINIMAL);
public static final ContentType JSON_NO_METADATA = ContentType.create(ContentType.APPLICATION_JSON,
- PARAMETER_ODATA_METADATA + '=' + VALUE_ODATA_METADATA_NONE);
+ PARAMETER_ODATA_METADATA, VALUE_ODATA_METADATA_NONE);
public static final ContentType JSON_FULL_METADATA = ContentType.create(ContentType.APPLICATION_JSON,
- PARAMETER_ODATA_METADATA + '=' + VALUE_ODATA_METADATA_FULL);
+ PARAMETER_ODATA_METADATA, VALUE_ODATA_METADATA_FULL);
public static final ContentType APPLICATION_XML = new ContentType(APPLICATION, "xml", null);
public static final ContentType APPLICATION_ATOM_XML = new ContentType(APPLICATION, "atom+xml", null);
- public static final ContentType APPLICATION_ATOM_XML_ENTRY = create(APPLICATION_ATOM_XML, "type=entry");
- public static final ContentType APPLICATION_ATOM_XML_FEED = create(APPLICATION_ATOM_XML, "type=feed");
+ public static final ContentType APPLICATION_ATOM_XML_ENTRY = create(APPLICATION_ATOM_XML, "type", "entry");
+ public static final ContentType APPLICATION_ATOM_XML_FEED = create(APPLICATION_ATOM_XML, "type", "feed");
public static final ContentType APPLICATION_ATOM_SVC = new ContentType(APPLICATION, "atomsvc+xml", null);
public static final ContentType APPLICATION_OCTET_STREAM = new ContentType(APPLICATION, "octet-stream", null);
@@ -142,38 +143,23 @@ public final class ContentType {
}
/**
- * Creates a content type from format and key-value pairs for parameters.
- *
- * @param contentType for example "application/json"
- * @param parameters for example "a=b", "c=d"
- * @return a new <code>ContentType</code> object
+ * Creates a content type from an existing content type and an additional parameter as key-value pair.
+ * @param contentType an existing content type
+ * @param parameterName the name of the additional parameter
+ * @param parameterValue the value of the additional parameter
+ * @return a new {@link ContentType} object
*/
- public static ContentType create(final String contentType, final String... parameters) {
- ContentType ct = parse(contentType);
-
- for (String p : parameters) {
- final String[] keyvalue = TypeUtil.parseParameter(p);
- ct.parameters.put(keyvalue[0], keyvalue[1]);
+ public static ContentType create(final ContentType contentType,
+ final String parameterName, final String parameterValue) {
+ if (parameterName == null || parameterName.isEmpty() || parameterName.indexOf(TypeUtil.WHITESPACE_CHAR) >= 0) {
+ throw new IllegalArgumentException("Illegal parameter name '" + parameterName + "'.");
}
-
- return ct;
- }
-
- /**
- * Creates a content type from an existing content type and additional key-value pairs for parameters.
- *
- * @param contentType for example "application/json"
- * @param parameters for example "a=b", "c=d"
- * @return a new <code>ContentType</code> object
- */
- public static ContentType create(final ContentType contentType, final String... parameters) {
- ContentType ct = new ContentType(contentType.type, contentType.subtype, contentType.parameters);
-
- for (String p : parameters) {
- final String[] keyvalue = TypeUtil.parseParameter(p);
- ct.parameters.put(keyvalue[0], keyvalue[1]);
+ if (Character.isWhitespace(parameterValue.charAt(0))) {
+ throw new IllegalArgumentException("Value of parameter '" + parameterName + "' starts with whitespace.");
}
+ ContentType ct = new ContentType(contentType.type, contentType.subtype, contentType.parameters);
+ ct.parameters.put(parameterName.toLowerCase(Locale.ROOT), parameterValue);
return ct;
}
@@ -240,17 +226,19 @@ public final class ContentType {
TypeUtil.parseParameters(params, parameters);
}
+ /** Gets the type of this content type. */
public String getType() {
return type;
}
+ /** Gets the subtype of this content type. */
public String getSubtype() {
return subtype;
}
/**
- *
- * @return parameters of this {@link ContentType} as unmodifiable map.
+ * Gets the parameters of this content type.
+ * @return parameters of this {@link ContentType} as unmodifiable map
*/
public Map<String, String> getParameters() {
return Collections.unmodifiableMap(parameters);
@@ -258,13 +246,13 @@ public final class ContentType {
/**
* Returns the value of a given parameter.
- * If the parameter does not exists the method returns null
+ * If the parameter does not exists the method returns null.
*
- * @param name The parameter to get
- * @return the value of the parameter or null if the parameter is not present
+ * @param name the name of the parameter to get (case-insensitive)
+ * @return the value of the parameter or <code>null</code> if the parameter is not present
*/
public String getParameter(final String name) {
- return parameters.get(name);
+ return parameters.get(name.toLowerCase(Locale.ROOT));
}
@Override
@@ -300,17 +288,15 @@ public final class ContentType {
while (entries.hasNext()) {
final Entry<String, String> e = entries.next();
final Entry<String, String> oe = otherEntries.next();
- if (!areEqual(e.getKey(), oe.getKey())) {
- return false;
- }
- if (!areEqual(e.getValue(), oe.getValue())) {
+ if (!areEqual(e.getKey(), oe.getKey())
+ || !areEqual(e.getValue(), oe.getValue())) {
return false;
}
}
+ return true;
} else {
return false;
}
- return true;
}
/**
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
index f7b9364..1036b88 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/http/HttpHeader.java
@@ -135,10 +135,14 @@ public interface HttpHeader {
* OData Version 4.0 Part 1: Protocol</a> and <a href="https://www.ietf.org/rfc/rfc7240.txt">RFC 7240</a>.
*/
public static final String PREFERENCE_APPLIED = "Preference-Applied";
+ /** See <a href="http://www.rfc-editor.org/rfc/rfc7233.txt">RFC 7233</a>. */
+ public static final String RANGE = "Range";
/**
* See {@link <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.37">HTTP/1.1 documentation</a>}.
*/
public static final String RETRY_AFTER = "Retry-After";
+ /** See <a href="http://www.rfc-editor.org/rfc/rfc7230.txt">RFC 7230</a>. */
+ public static final String TE = "TE";
/**
* See {@link <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43">HTTP/1.1 documentation</a>}.
*/
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java b/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
index 8a7c642..6f7460b 100644
--- a/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
+++ b/lib/commons-api/src/test/java/org/apache/olingo/commons/api/format/ContentTypeTest.java
@@ -78,21 +78,23 @@ public class ContentTypeTest {
@Test
public void testCreateWithParameter() {
- assertEquals(ContentType.create("a/b;c=d"), ContentType.create("a/b", "c=d"));
- assertEquals(ContentType.create("a/b;e=f;c=d"), ContentType.create("a/b", "c=d", "e=f"));
- assertEquals(ContentType.create("a/b;e=f;c=d"), ContentType.create("A/B", "C=D", "E=F"));
+ assertEquals(ContentType.create("a/b;c=d"), ContentType.create(ContentType.create("a/b"), "c", "d"));
+ assertEquals(ContentType.create("a/b;e=f;c=d"), ContentType.create(
+ ContentType.create(ContentType.create("a/b"), "c", "d"), "e", "f"));
+ assertEquals(ContentType.create("a/b;e=f;c=d"), ContentType.create(
+ ContentType.create(ContentType.create("A/B"), "C", "D"), "E", "F"));
}
@Test
public void testCreateAndModify() {
ContentType ct1 = ContentType.create("a/b");
- assertEquals(ContentType.create("a/b;c=d"), ContentType.create(ct1, "c=d"));
+ assertEquals(ContentType.create("a/b;c=d"), ContentType.create(ct1, "c", "d"));
ContentType ct2 = ContentType.create("a/b;c=d");
- assertEquals(ContentType.create("a/b;c=d;e=f"), ContentType.create(ct2, "e=f"));
- assertEquals(ContentType.create("a/b;c=g"), ContentType.create(ct2, "c=g"));
+ assertEquals(ContentType.create("a/b;c=d;e=f"), ContentType.create(ct2, "e", "f"));
+ assertEquals(ContentType.create("a/b;c=g"), ContentType.create(ct2, "c", "g"));
- assertFalse(ContentType.create(ct2, "c=g").equals(ct2));
+ assertFalse(ContentType.create(ct2, "c", "g").equals(ct2));
}
@Test
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
index a262b69..f35c277 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ContentNegotiator.java
@@ -83,8 +83,8 @@ public class ContentNegotiator {
final String formatString = formatOption.getFormat().trim();
final ContentType contentType =
JSON.equalsIgnoreCase(formatString) ? ContentType.JSON :
- XML.equalsIgnoreCase(formatString) ? ContentType.APPLICATION_XML :
- ATOM.equalsIgnoreCase(formatString) ? ContentType.APPLICATION_ATOM_XML : null;
+ XML.equalsIgnoreCase(formatString) ? ContentType.APPLICATION_XML :
+ ATOM.equalsIgnoreCase(formatString) ? ContentType.APPLICATION_ATOM_XML : null;
try {
result = getAcceptedType(
AcceptType.fromContentType(contentType == null ?
@@ -128,26 +128,24 @@ public class ContentNegotiator {
for (final AcceptType acceptedType : acceptedContentTypes) {
for (final ContentType supportedContentType : supportedContentTypes) {
ContentType contentType = supportedContentType;
- if (acceptedType.getParameters().containsKey("charset")) {
- final String value = acceptedType.getParameters().get("charset");
- if ("utf8".equalsIgnoreCase(value) || "utf-8".equalsIgnoreCase(value)) {
- contentType = ContentType.create(contentType, ContentType.PARAMETER_CHARSET + "=utf-8");
+ final String charSetValue = acceptedType.getParameter(ContentType.PARAMETER_CHARSET);
+ if (charSetValue != null) {
+ if ("utf8".equalsIgnoreCase(charSetValue) || "utf-8".equalsIgnoreCase(charSetValue)) {
+ contentType = ContentType.create(contentType, ContentType.PARAMETER_CHARSET, "utf-8");
} else {
throw new IllegalArgumentException("charset not supported: " + acceptedType);
}
}
-
- if(acceptedType.getParameters().containsKey("ieee754compatible")) {
- final String value = acceptedType.getParameters().get("ieee754compatible");
- if("true".equalsIgnoreCase(value)) {
- contentType = ContentType.create(contentType, ContentType.PARAMETER_IEEE754_COMPATIBLE + "=true");
- } else if("false".equalsIgnoreCase(value)) {
- contentType = ContentType.create(contentType, ContentType.PARAMETER_IEEE754_COMPATIBLE + "=false");
- } else {
- throw new IllegalArgumentException("Invalid IEEE754Compatible value " + acceptedType);
- }
+
+ final String ieee754compatibleValue = acceptedType.getParameter(ContentType.PARAMETER_IEEE754_COMPATIBLE);
+ if ("true".equalsIgnoreCase(ieee754compatibleValue)) {
+ contentType = ContentType.create(contentType, ContentType.PARAMETER_IEEE754_COMPATIBLE, "true");
+ } else if ("false".equalsIgnoreCase(ieee754compatibleValue)) {
+ contentType = ContentType.create(contentType, ContentType.PARAMETER_IEEE754_COMPATIBLE, "false");
+ } else if (ieee754compatibleValue != null) {
+ throw new IllegalArgumentException("Invalid IEEE754Compatible value " + ieee754compatibleValue);
}
-
+
if (acceptedType.matches(contentType)) {
return contentType;
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java
index e115dcb..653fd5f 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/batchhandler/BatchPartHandler.java
@@ -30,7 +30,6 @@ import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart;
import org.apache.olingo.server.api.processor.BatchProcessor;
import org.apache.olingo.server.core.ODataHandler;
import org.apache.olingo.server.core.batchhandler.referenceRewriting.BatchReferenceRewriter;
-import org.apache.olingo.server.core.deserializer.batch.BatchParserCommon;
public class BatchPartHandler {
private final ODataHandler oDataHandler;
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java
index f5d68e4..f77f886 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java
@@ -28,7 +28,7 @@ import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerExceptio
public class BatchBodyPart implements BatchPart {
final private String boundary;
final private boolean isStrict;
- final List<Line> remainingMessage = new LinkedList<Line>();
+ List<Line> remainingMessage = new LinkedList<Line>();
private Header headers;
private boolean isChangeSet;
@@ -49,9 +49,8 @@ public class BatchBodyPart implements BatchPart {
return this;
}
- private boolean isChangeSet(final Header header) throws BatchDeserializerException {
+ private boolean isChangeSet(final Header headers) throws BatchDeserializerException {
final List<String> contentTypes = headers.getHeaders(HttpHeader.CONTENT_TYPE);
- boolean isChangeSet = false;
if (contentTypes.isEmpty()) {
throw new BatchDeserializerException("Missing content type",
@@ -59,12 +58,12 @@ public class BatchBodyPart implements BatchPart {
Integer.toString(headers.getLineNumber()));
}
+ boolean isChangeSet = false;
for (String contentType : contentTypes) {
if (isContentTypeMultiPartMixed(contentType)) {
isChangeSet = true;
}
}
-
return isChangeSet;
}
@@ -85,7 +84,7 @@ public class BatchBodyPart implements BatchPart {
return requestList;
}
- private List<List<Line>> splitChangeSet(final List<Line> remainingMessage2) throws BatchDeserializerException {
+ private List<List<Line>> splitChangeSet(List<Line> remainingMessage) throws BatchDeserializerException {
final HeaderField contentTypeField = headers.getHeaderField(HttpHeader.CONTENT_TYPE);
final String changeSetBoundary = BatchParserCommon.getBoundary(contentTypeField.getValueNotNull(),
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java
index 7fd17e5..7126f14 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java
@@ -20,7 +20,6 @@ package org.apache.olingo.server.core.deserializer.batch;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
-import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -33,15 +32,12 @@ import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerExceptio
public class BatchParserCommon {
- private static final String REG_EX_BOUNDARY =
- "([a-zA-Z0-9_\\-\\.'\\+]{1,70})|\"([a-zA-Z0-9_\\-\\.'\\+\\s\\" +
- "(\\),/:=\\?]{1,69}[a-zA-Z0-9_\\-\\.'\\+\\(\\),/:=\\?])\"";
- private static final Pattern PATTERN_LAST_CRLF = Pattern.compile("(.*)(\r\n){1}( *)", Pattern.DOTALL);
+ private static final String PATTERN_BOUNDARY =
+ "([a-zA-Z0-9_\\-\\.'\\+]{1,70})|"
+ + "\"([a-zA-Z0-9_\\-\\.'\\+\\s\\(\\),/:=\\?]{1,69}[a-zA-Z0-9_\\-\\.'\\+\\(\\),/:=\\?])\"";
+ private static final Pattern PATTERN_LAST_CRLF = Pattern.compile("(.*)\\r\\n\\s*", Pattern.DOTALL);
private static final Pattern PATTERN_HEADER_LINE = Pattern.compile("([a-zA-Z\\-]+):\\s?(.*)\\s*");
- protected static final String HTTP_RANGE = "Range";
- protected static final String HTTP_TE = "TE";
-
public static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
protected static final String BOUNDARY = "boundary";
@@ -49,13 +45,11 @@ public class BatchParserCommon {
public static String getBoundary(final String contentType, final int line) throws BatchDeserializerException {
final ContentType type = getContentType(contentType, ContentType.MULTIPART_MIXED, line);
-
- String boundary;
final Map<String, String> parameters = type.getParameters();
for (final String parameterName : parameters.keySet()) {
if (BOUNDARY.equalsIgnoreCase(parameterName)) {
- boundary = parameters.get(parameterName).trim();
- if (boundary.matches(REG_EX_BOUNDARY)) {
+ final String boundary = parameters.get(parameterName).trim();
+ if (boundary.matches(PATTERN_BOUNDARY)) {
return trimQuotes(boundary);
} else {
throw new BatchDeserializerException("Invalid boundary format",
@@ -91,9 +85,7 @@ public class BatchParserCommon {
public static String removeEndingSlash(final String content) {
String newContent = content.trim();
- int lastSlashIndex = newContent.lastIndexOf('/');
-
- return (lastSlashIndex == newContent.length() - 1) ? newContent.substring(0, newContent.length() - 1) : newContent;
+ return newContent.endsWith("/") ? newContent.substring(0, newContent.length() - 1) : newContent;
}
private static String trimQuotes(final String boundary) {
@@ -106,12 +98,12 @@ public class BatchParserCommon {
public static List<List<Line>> splitMessageByBoundary(final List<Line> message, final String boundary)
throws BatchDeserializerException {
final List<List<Line>> messageParts = new LinkedList<List<Line>>();
- List<Line> currentPart = new ArrayList<Line>();
+ List<Line> currentPart = new LinkedList<Line>();
boolean isEndReached = false;
final String quotedBoundary = Pattern.quote(boundary);
- final Pattern boundaryDelimiterPattern = Pattern.compile("--" + quotedBoundary + "--[\\s ]*");
- final Pattern boundaryPattern = Pattern.compile("--" + quotedBoundary + "[\\s ]*");
+ final Pattern boundaryDelimiterPattern = Pattern.compile("--" + quotedBoundary + "--\\s*");
+ final Pattern boundaryPattern = Pattern.compile("--" + quotedBoundary + "\\s*");
for (Line currentLine : message) {
if (boundaryDelimiterPattern.matcher(currentLine.toString()).matches()) {
@@ -153,9 +145,7 @@ public class BatchParserCommon {
}
public static Line removeEndingCRLF(final Line line) {
- Pattern pattern = PATTERN_LAST_CRLF;
- Matcher matcher = pattern.matcher(line.toString());
-
+ Matcher matcher = PATTERN_LAST_CRLF.matcher(line.toString());
if (matcher.matches()) {
return new Line(matcher.group(1), line.getLineNumber());
} else {
@@ -191,7 +181,7 @@ public class BatchParserCommon {
public static void consumeBlankLine(List<Line> remainingMessage, final boolean isStrict)
throws BatchDeserializerException {
- if (remainingMessage.size() > 0 && remainingMessage.get(0).toString().matches("\\s*(\r\n|\n)\\s*")) {
+ if (remainingMessage.size() > 0 && remainingMessage.get(0).toString().matches("\\s*\r?\n\\s*")) {
remainingMessage.remove(0);
} else {
if (isStrict) {
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java
index 57ecfbe..ce46839 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java
@@ -129,7 +129,7 @@ public class BatchRequestTransformator {
if (header.exists(HttpHeader.AUTHORIZATION) || header.exists(HttpHeader.EXPECT)
|| header.exists(HttpHeader.FROM) || header.exists(HttpHeader.MAX_FORWARDS)
- || header.exists(BatchParserCommon.HTTP_RANGE) || header.exists(BatchParserCommon.HTTP_TE)) {
+ || header.exists(HttpHeader.RANGE) || header.exists(HttpHeader.TE)) {
throw new BatchDeserializerException("Forbidden header", MessageKeys.FORBIDDEN_HEADER,
Integer.toString(header.getLineNumber()));
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
index c67efbc..71e5030 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializer.java
@@ -78,11 +78,11 @@ public class ODataJsonDeserializer implements ODataDeserializer {
private static final EdmPrimitiveType EDM_INT64 = EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int64);
private static final EdmPrimitiveType EDM_DECIMAL = EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal);
private final boolean isIEEE754Compatible;
-
+
public ODataJsonDeserializer(final ContentType contentType) {
isIEEE754Compatible = isODataIEEE754Compatible(contentType);
}
-
+
@Override
public DeserializerResult entityCollection(final InputStream stream, final EdmEntityType edmEntityType)
throws DeserializerException {
@@ -248,7 +248,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
private void consumeParameters(final EdmAction edmAction, final ObjectNode node,
final Map<String, Parameter> parameters)
- throws DeserializerException {
+ throws DeserializerException {
List<String> parameterNames = edmAction.getParameterNames();
if (edmAction.isBound()) {
// The binding parameter must not occur in the payload.
@@ -489,7 +489,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
private Object readComplexNode(final String name, final EdmType type, final boolean isNullable,
final JsonNode jsonNode)
- throws DeserializerException {
+ throws DeserializerException {
// read and add all complex properties
ComplexValue value = readComplexValue(name, type, isNullable, jsonNode);
@@ -674,15 +674,15 @@ public class ODataJsonDeserializer implements ODataDeserializer {
checkJsonTypeBasedOnPrimitiveType(name, edmPrimitiveType.getName(), jsonNode);
Class<?> javaClass = getJavaClassForPrimitiveType(mapping, edmPrimitiveType);
String jsonNodeAsText = jsonNode.asText();
-
+
if (isIEEE754Compatible && (edmPrimitiveType.equals(EDM_INT64) || edmPrimitiveType.equals(EDM_DECIMAL))) {
- if(jsonNodeAsText.length() == 0) {
- throw new DeserializerException("IEEE754Compatible values must not be of length 0",
+ if (jsonNodeAsText.length() == 0) {
+ throw new DeserializerException("IEEE754Compatible values must not be of length 0",
MessageKeys.INVALID_NULL_PROPERTY, name);
}
}
-
- return edmPrimitiveType.valueOfString(jsonNodeAsText, isNullable, maxLength, precision, scale, isUnicode,
+
+ return edmPrimitiveType.valueOfString(jsonNodeAsText, isNullable, maxLength, precision, scale, isUnicode,
javaClass);
} catch (EdmPrimitiveTypeException e) {
throw new DeserializerException(
@@ -734,7 +734,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
private void checkJsonTypeBasedOnPrimitiveType(final String propertyName, final String edmPrimitiveTypeName,
final JsonNode jsonNode)
- throws DeserializerException {
+ throws DeserializerException {
EdmPrimitiveTypeKind primKind;
try {
primKind = EdmPrimitiveTypeKind.valueOf(edmPrimitiveTypeName);
@@ -765,15 +765,17 @@ public class ODataJsonDeserializer implements ODataDeserializer {
case Int64:
case Decimal:
// Numbers (eighter numers or string)
- if(isIEEE754Compatible) {
+ if (isIEEE754Compatible) {
if (!jsonNode.isTextual()) {
throw new DeserializerException("Invalid json type: " + jsonNode.getNodeType() + " for edm " + primKind
- + " property: " + propertyName, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, propertyName);
+ + " property: " + propertyName, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY,
+ propertyName);
}
} else {
if (!jsonNode.isNumber()) {
throw new DeserializerException("Invalid json type: " + jsonNode.getNodeType() + " for edm " + primKind
- + " property: " + propertyName, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, propertyName);
+ + " property: " + propertyName, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY,
+ propertyName);
}
}
break;
@@ -849,7 +851,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
Iterator<JsonNode> it = arrayNode.iterator();
while (it.hasNext()) {
final JsonNode next = it.next();
- if(next.has(key)) {
+ if (next.has(key)) {
parsedValues.add(new URI(next.get(key).asText()));
}
}
@@ -860,7 +862,7 @@ public class ODataJsonDeserializer implements ODataDeserializer {
// if this is value there can be only one property
return DeserializerResultImpl.with().entityReferences(parsedValues).build();
}
- if(tree.get(key) != null) {
+ if (tree.get(key) != null) {
parsedValues.add(new URI(tree.get(key).asText()));
} else {
throw new DeserializerException("Missing entity reference", DeserializerException.MessageKeys.UNKNOWN_CONTENT);
@@ -880,10 +882,10 @@ public class ODataJsonDeserializer implements ODataDeserializer {
DeserializerException.MessageKeys.UNKNOWN_CONTENT);
}
}
-
+
private boolean isODataIEEE754Compatible(final ContentType contentType) {
- return contentType.getParameters().containsKey(ContentType.PARAMETER_IEEE754_COMPATIBLE)
- && Boolean.TRUE.toString().toLowerCase().equals(
- contentType.getParameter(ContentType.PARAMETER_IEEE754_COMPATIBLE).toLowerCase());
+ return contentType.getParameters().containsKey(ContentType.PARAMETER_IEEE754_COMPATIBLE)
+ && Boolean.TRUE.toString().equalsIgnoreCase(
+ contentType.getParameter(ContentType.PARAMETER_IEEE754_COMPATIBLE));
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
index f50fcad..e9d4858 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java
@@ -75,12 +75,12 @@ public class ODataJsonSerializer implements ODataSerializer {
private static final Logger log = LoggerFactory.getLogger(ODataJsonSerializer.class);
- private final ContentType contentType;
private final boolean isIEEE754Compatible;
-
+ private final boolean isODataMetadataNone;
+
public ODataJsonSerializer(final ContentType contentType) {
this.isIEEE754Compatible = isODataIEEE754Compatible(contentType);
- this.contentType = contentType;
+ this.isODataMetadataNone = ContentTypeHelper.isODataMetadataNone(contentType);
}
@Override
@@ -94,7 +94,7 @@ public class ODataJsonSerializer implements ODataSerializer {
gen = new JsonFactory().createGenerator(buffer.getOutputStream())
.setPrettyPrinter(new DefaultPrettyPrinter());
- new ServiceDocumentJsonSerializer(metadata, serviceRoot, contentType).writeServiceDocument(gen);
+ new ServiceDocumentJsonSerializer(metadata, serviceRoot, isODataMetadataNone).writeServiceDocument(gen);
gen.close();
@@ -146,15 +146,11 @@ public class ODataJsonSerializer implements ODataSerializer {
json.writeStartObject();
final ContextURL contextURL = checkContextURL(options == null ? null : options.getContextURL());
- if (contextURL != null) {
- json.writeStringField(Constants.JSON_CONTEXT,
- ContextURLBuilder.create(contextURL).toASCIIString());
- }
+ writeContextURL(contextURL, json);
writeMetadataETag(metadata, json);
- if (options != null && options.getCount() != null && options.getCount().getValue()
- && entitySet.getCount() != null) {
+ if (options != null && options.getCount() != null && options.getCount().getValue()) {
writeCount(entitySet, json);
}
json.writeFieldName(Constants.VALUE);
@@ -164,9 +160,7 @@ public class ODataJsonSerializer implements ODataSerializer {
writeEntitySet(metadata, entityType, entitySet,
options.getExpand(), options.getSelect(), options.onlyReferences(), json);
}
- if (entitySet.getNext() != null) {
- writeNextLink(entitySet, json);
- }
+ writeNextLink(entitySet, json);
json.close();
} catch (final IOException e) {
throw new SerializerException("An I/O exception occurred.", e,
@@ -196,7 +190,7 @@ public class ODataJsonSerializer implements ODataSerializer {
}
private ContextURL checkContextURL(final ContextURL contextURL) throws SerializerException {
- if(ContentTypeHelper.isODataMetadataNone(contentType)) {
+ if (isODataMetadataNone) {
return null;
} else if (contextURL == null) {
throw new SerializerException("ContextURL null!", SerializerException.MessageKeys.NO_CONTEXT_URL);
@@ -204,16 +198,6 @@ public class ODataJsonSerializer implements ODataSerializer {
return contextURL;
}
- private void writeMetadataETag(final ServiceMetadata metadata, JsonGenerator json) throws IOException {
- if (!ContentTypeHelper.isODataMetadataNone(contentType)
- && metadata != null
- && metadata.getServiceMetadataETagSupport() != null
- && metadata.getServiceMetadataETagSupport().getMetadataETag() != null) {
- json.writeStringField(Constants.JSON_METADATA_ETAG,
- metadata.getServiceMetadataETagSupport().getMetadataETag());
- }
- }
-
protected void writeEntitySet(final ServiceMetadata metadata, final EdmEntityType entityType,
final EntityCollection entitySet, final ExpandOption expand, final SelectOption select,
final boolean onlyReference, final JsonGenerator json) throws IOException,
@@ -233,12 +217,12 @@ public class ODataJsonSerializer implements ODataSerializer {
protected void writeEntity(final ServiceMetadata metadata, final EdmEntityType entityType,
final Entity entity, final ContextURL contextURL, final ExpandOption expand,
- final SelectOption select, final boolean onlyReference, final JsonGenerator json)
- throws IOException, SerializerException {
+ final SelectOption select, final boolean onlyReference, final JsonGenerator json)
+ throws IOException, SerializerException {
json.writeStartObject();
- if(!ContentTypeHelper.isODataMetadataNone(contentType)) {
+ if (!isODataMetadataNone) {
if (contextURL != null) { // top-level entity
- json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
+ writeContextURL(contextURL, json);
writeMetadataETag(metadata, json);
}
if (entity.getETag() != null) {
@@ -262,8 +246,8 @@ public class ODataJsonSerializer implements ODataSerializer {
if (onlyReference) {
json.writeStringField(Constants.JSON_ID, entity.getId().toASCIIString());
} else {
- EdmEntityType resolvedType = resolveEntityType(metadata, entityType, entity.getType());
- if (!resolvedType.equals(entityType)) {
+ final EdmEntityType resolvedType = resolveEntityType(metadata, entityType, entity.getType());
+ if (!isODataMetadataNone && !resolvedType.equals(entityType)) {
json.writeStringField(Constants.JSON_TYPE, "#" + entity.getType());
}
writeProperties(resolvedType, entity.getProperties(), select, json);
@@ -321,8 +305,8 @@ public class ODataJsonSerializer implements ODataSerializer {
}
protected void writeProperties(final EdmStructuredType type, final List<Property> properties,
- final SelectOption select, final JsonGenerator json)
- throws IOException, SerializerException {
+ final SelectOption select, final JsonGenerator json)
+ throws IOException, SerializerException {
final boolean all = ExpandSelectHelper.isAll(select);
final Set<String> selected = all ? null :
ExpandSelectHelper.getSelectedPropertyNames(select.getSelectItems());
@@ -362,8 +346,8 @@ public class ODataJsonSerializer implements ODataSerializer {
}
}
- protected void writeExpandedNavigationProperty(final ServiceMetadata metadata, final EdmNavigationProperty property,
- final Link navigationLink, final ExpandOption innerExpand, final SelectOption innerSelect,
+ protected void writeExpandedNavigationProperty(final ServiceMetadata metadata, final EdmNavigationProperty property,
+ final Link navigationLink, final ExpandOption innerExpand, final SelectOption innerSelect,
final JsonGenerator json) throws IOException, SerializerException {
json.writeFieldName(property.getName());
if (property.isCollection()) {
@@ -385,8 +369,8 @@ public class ODataJsonSerializer implements ODataSerializer {
}
protected void writeProperty(final EdmProperty edmProperty, final Property property,
- final Set<List<String>> selectedPaths, final JsonGenerator json)
- throws IOException, SerializerException {
+ final Set<List<String>> selectedPaths, final JsonGenerator json)
+ throws IOException, SerializerException {
json.writeFieldName(edmProperty.getName());
if (property == null || property.isNull()) {
if (edmProperty.isNullable() == Boolean.FALSE) {
@@ -401,8 +385,8 @@ public class ODataJsonSerializer implements ODataSerializer {
}
private void writePropertyValue(final EdmProperty edmProperty,
- final Property property, final Set<List<String>> selectedPaths, final JsonGenerator json)
- throws IOException, SerializerException {
+ final Property property, final Set<List<String>> selectedPaths, final JsonGenerator json)
+ throws IOException, SerializerException {
try {
if (edmProperty.isPrimitive()) {
if (edmProperty.isCollection()) {
@@ -435,8 +419,8 @@ public class ODataJsonSerializer implements ODataSerializer {
private void writePrimitiveCollection(final EdmPrimitiveType type, final Property property,
final Boolean isNullable, final Integer maxLength, final Integer precision, final Integer scale,
- final Boolean isUnicode, final JsonGenerator json)
- throws IOException, EdmPrimitiveTypeException, SerializerException {
+ final Boolean isUnicode, final JsonGenerator json)
+ throws IOException, EdmPrimitiveTypeException, SerializerException {
json.writeStartArray();
for (Object value : property.asCollection()) {
switch (property.getValueType()) {
@@ -500,20 +484,17 @@ public class ODataJsonSerializer implements ODataSerializer {
isNullable, maxLength, precision, scale, isUnicode);
if (value == null) {
json.writeNull();
- } else if(type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean)) {
- json.writeBoolean(Boolean.parseBoolean(value));
- } else if(isIEEE754Compatible &&
- ( type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int64)
- || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal))) {
- json.writeString(value.toString());
+ } else if (type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean)) {
+ json.writeBoolean(Boolean.parseBoolean(value));
} else if (type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Byte)
- || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal)
|| type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Double)
|| type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int16)
|| type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int32)
- || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int64)
|| type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.SByte)
- || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Single)) {
+ || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Single)
+ || (type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal)
+ || type == EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Int64))
+ && !isIEEE754Compatible) {
json.writeNumber(value);
} else {
json.writeString(value);
@@ -552,17 +533,18 @@ public class ODataJsonSerializer implements ODataSerializer {
try {
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
json.writeStartObject();
- if (contextURL != null) {
- json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
- }
+ writeContextURL(contextURL, json);
writeMetadataETag(metadata, json);
if (property.isNull()) {
throw new SerializerException("Property value can not be null.", SerializerException.MessageKeys.NULL_INPUT);
} else {
json.writeFieldName(Constants.VALUE);
writePrimitive(type, property,
- options.isNullable(), options.getMaxLength(), options.getPrecision(), options.getScale(),
- options.isUnicode(), json);
+ options == null ? null : options.isNullable(),
+ options == null ? null : options.getMaxLength(),
+ options == null ? null : options.getPrecision(),
+ options == null ? null : options.getScale(),
+ options == null ? null : options.isUnicode(), json);
}
json.writeEndObject();
json.close();
@@ -585,12 +567,10 @@ public class ODataJsonSerializer implements ODataSerializer {
try {
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
json.writeStartObject();
- if (contextURL != null) {
- json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
- }
+ writeContextURL(contextURL, json);
writeMetadataETag(metadata, json);
- EdmComplexType resolvedType = resolveComplexType(metadata, type, property.getType());
- if (!resolvedType.equals(type)) {
+ final EdmComplexType resolvedType = resolveComplexType(metadata, type, property.getType());
+ if (!isODataMetadataNone && !resolvedType.equals(type)) {
json.writeStringField(Constants.JSON_TYPE, "#" + property.getType());
}
final List<Property> values =
@@ -617,14 +597,15 @@ public class ODataJsonSerializer implements ODataSerializer {
try {
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
json.writeStartObject();
- if (contextURL != null) {
- json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
- }
+ writeContextURL(contextURL, json);
writeMetadataETag(metadata, json);
json.writeFieldName(Constants.VALUE);
writePrimitiveCollection(type, property,
- options.isNullable(), options.getMaxLength(), options.getPrecision(), options.getScale(),
- options.isUnicode(), json);
+ options == null ? null : options.isNullable(),
+ options == null ? null : options.getMaxLength(),
+ options == null ? null : options.getPrecision(),
+ options == null ? null : options.getScale(),
+ options == null ? null : options.isUnicode(), json);
json.writeEndObject();
json.close();
} catch (final IOException e) {
@@ -646,9 +627,7 @@ public class ODataJsonSerializer implements ODataSerializer {
try {
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
json.writeStartObject();
- if (contextURL != null) {
- json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
- }
+ writeContextURL(contextURL, json);
writeMetadataETag(metadata, json);
json.writeFieldName(Constants.VALUE);
writeComplexCollection(type, property, null, json);
@@ -666,95 +645,100 @@ public class ODataJsonSerializer implements ODataSerializer {
}
@Override
- public SerializerResult reference(final ServiceMetadata metadata, final EdmEntitySet edmEntitySet,
+ public SerializerResult reference(final ServiceMetadata metadata, final EdmEntitySet edmEntitySet,
final Entity entity, final ReferenceSerializerOptions options) throws SerializerException {
final ContextURL contextURL = checkContextURL(options == null ? null : options.getContextURL());
final CircleStreamBuffer buffer = new CircleStreamBuffer();
final UriHelper uriHelper = new UriHelperImpl();
-
+
try {
final JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
- writeReference(metadata, edmEntitySet, entity, contextURL, uriHelper, json);
+
+ json.writeStartObject();
+ writeContextURL(contextURL, json);
+ writeMetadataETag(metadata, json);
+ json.writeStringField(Constants.JSON_ID, uriHelper.buildCanonicalURL(edmEntitySet, entity));
+ json.writeEndObject();
json.close();
} catch (IOException e) {
- throw new SerializerException("An I/O exception occurred.", e, SerializerException.MessageKeys.IO_EXCEPTION);
+ throw new SerializerException("An I/O exception occurred.", e, SerializerException.MessageKeys.IO_EXCEPTION);
}
-
+
return SerializerResultImpl.with().content(buffer.getInputStream()).build();
}
-
+
@Override
- public SerializerResult referenceCollection(final ServiceMetadata metadata, final EdmEntitySet edmEntitySet,
- final EntityCollection entityCollection, final ReferenceCollectionSerializerOptions options)
- throws SerializerException {
+ public SerializerResult referenceCollection(final ServiceMetadata metadata, final EdmEntitySet edmEntitySet,
+ final EntityCollection entityCollection, final ReferenceCollectionSerializerOptions options)
+ throws SerializerException {
final ContextURL contextURL = checkContextURL(options == null ? null : options.getContextURL());
final CircleStreamBuffer buffer = new CircleStreamBuffer();
final UriHelper uriHelper = new UriHelperImpl();
-
+
try {
final JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
json.writeStartObject();
-
- json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
+
+ writeContextURL(contextURL, json);
writeMetadataETag(metadata, json);
- if(options != null && options.getCount() != null) {
+ if (options != null && options.getCount() != null && options.getCount().getValue()) {
writeCount(entityCollection, json);
}
-
- writeReferenceCollection(edmEntitySet, entityCollection, uriHelper,json);
- if(entityCollection.getNext() != null) {
- writeNextLink(entityCollection, json);
+ json.writeArrayFieldStart(Constants.VALUE);
+ for (final Entity entity : entityCollection.getEntities()) {
+ json.writeStartObject();
+ json.writeStringField(Constants.JSON_ID, uriHelper.buildCanonicalURL(edmEntitySet, entity));
+ json.writeEndObject();
}
-
+ json.writeEndArray();
+
+ writeNextLink(entityCollection, json);
+
json.writeEndObject();
json.close();
} catch (IOException e) {
- throw new SerializerException("An I/O exception occurred.", e, SerializerException.MessageKeys.IO_EXCEPTION);
+ throw new SerializerException("An I/O exception occurred.", e, SerializerException.MessageKeys.IO_EXCEPTION);
}
-
+
return SerializerResultImpl.with().content(buffer.getInputStream()).build();
}
- protected void writeReferenceCollection(final EdmEntitySet edmEntitySet, final EntityCollection entityCollection,
- final UriHelper uriHelper, final JsonGenerator json) throws IOException, SerializerException {
- json.writeArrayFieldStart(Constants.VALUE);
-
- for(final Entity entity : entityCollection.getEntities()) {
- writeReference(null, edmEntitySet, entity, null, uriHelper, json);
- }
-
- json.writeEndArray();
- }
-
- protected void writeReference(final ServiceMetadata metadata, final EdmEntitySet edmEntitySet, final Entity entity,
- final ContextURL contextURL, final UriHelper uriHelper, final JsonGenerator json)
- throws IOException, SerializerException {
- json.writeStartObject();
- if (contextURL != null) {
+ private void writeContextURL(final ContextURL contextURL, JsonGenerator json) throws IOException {
+ if (!isODataMetadataNone && contextURL != null) {
json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
- writeMetadataETag(metadata, json);
}
+ }
- json.writeStringField(Constants.JSON_ID, uriHelper.buildCanonicalURL(edmEntitySet, entity));
- json.writeEndObject();
+ private void writeMetadataETag(final ServiceMetadata metadata, JsonGenerator json) throws IOException {
+ if (!isODataMetadataNone
+ && metadata != null
+ && metadata.getServiceMetadataETagSupport() != null
+ && metadata.getServiceMetadataETagSupport().getMetadataETag() != null) {
+ json.writeStringField(Constants.JSON_METADATA_ETAG,
+ metadata.getServiceMetadataETagSupport().getMetadataETag());
+ }
}
-
- private void writeCount(final EntityCollection entitySet, final JsonGenerator json) throws IOException {
- if(isIEEE754Compatible) {
- json.writeStringField(Constants.JSON_COUNT, entitySet.getCount().toString());
- } else {
- json.writeNumberField(Constants.JSON_COUNT, entitySet.getCount());
+
+ private void writeCount(final EntityCollection entityCollection, JsonGenerator json) throws IOException {
+ if (entityCollection.getCount() != null) {
+ if (isIEEE754Compatible) {
+ json.writeStringField(Constants.JSON_COUNT, entityCollection.getCount().toString());
+ } else {
+ json.writeNumberField(Constants.JSON_COUNT, entityCollection.getCount());
+ }
}
}
private void writeNextLink(final EntityCollection entitySet, JsonGenerator json) throws IOException {
- json.writeStringField(Constants.JSON_NEXT_LINK, entitySet.getNext().toASCIIString());
+ if (entitySet.getNext() != null) {
+ json.writeStringField(Constants.JSON_NEXT_LINK, entitySet.getNext().toASCIIString());
+ }
}
-
+
private boolean isODataIEEE754Compatible(final ContentType contentType) {
- return contentType.getParameters().containsKey(ContentType.PARAMETER_IEEE754_COMPATIBLE)
+ return contentType.getParameters().containsKey(ContentType.PARAMETER_IEEE754_COMPATIBLE)
&& Boolean.TRUE.toString().toLowerCase().equals(
contentType.getParameter(ContentType.PARAMETER_IEEE754_COMPATIBLE).toLowerCase());
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ServiceDocumentJsonSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ServiceDocumentJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ServiceDocumentJsonSerializer.java
index 5b34184..30162c1 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ServiceDocumentJsonSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ServiceDocumentJsonSerializer.java
@@ -26,9 +26,7 @@ import org.apache.olingo.commons.api.edm.EdmEntityContainer;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmFunctionImport;
import org.apache.olingo.commons.api.edm.EdmSingleton;
-import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.server.api.ServiceMetadata;
-import org.apache.olingo.server.core.serializer.utils.ContentTypeHelper;
import com.fasterxml.jackson.core.JsonGenerator;
@@ -41,30 +39,31 @@ public class ServiceDocumentJsonSerializer {
private final ServiceMetadata metadata;
private final String serviceRoot;
- private final ContentType contentType;
+ private final boolean isODataMetadataNone;
public ServiceDocumentJsonSerializer(final ServiceMetadata metadata, final String serviceRoot,
- final ContentType contentType) {
+ final boolean isODataMetadataNone) {
this.metadata = metadata;
this.serviceRoot = serviceRoot;
- this.contentType = contentType;
+ this.isODataMetadataNone = isODataMetadataNone;
}
public void writeServiceDocument(final JsonGenerator gen) throws IOException {
gen.writeStartObject();
- final String metadataUri =
- (serviceRoot == null ? "" :
- serviceRoot.endsWith("/") ? serviceRoot : (serviceRoot + "/"))
- + Constants.METADATA;
- gen.writeObjectField(Constants.JSON_CONTEXT, metadataUri);
-
- if (!ContentTypeHelper.isODataMetadataNone(contentType)
- && metadata != null
- && metadata.getServiceMetadataETagSupport() != null
- && metadata.getServiceMetadataETagSupport().getMetadataETag() != null) {
- gen.writeStringField(Constants.JSON_METADATA_ETAG,
- metadata.getServiceMetadataETagSupport().getMetadataETag());
+ if (!isODataMetadataNone) {
+ final String metadataUri =
+ (serviceRoot == null ? "" :
+ serviceRoot.endsWith("/") ? serviceRoot : (serviceRoot + "/"))
+ + Constants.METADATA;
+ gen.writeObjectField(Constants.JSON_CONTEXT, metadataUri);
+
+ if (metadata != null
+ && metadata.getServiceMetadataETagSupport() != null
+ && metadata.getServiceMetadataETagSupport().getMetadataETag() != null) {
+ gen.writeStringField(Constants.JSON_METADATA_ETAG,
+ metadata.getServiceMetadataETagSupport().getMetadataETag());
+ }
}
gen.writeArrayFieldStart(Constants.VALUE);
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java
index 07e06ca..d4af42a 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/ContentNegotiatorTest.java
@@ -165,7 +165,8 @@ public class ContentNegotiatorTest {
ContentNegotiator.checkSupport(ContentType.create("a/b"), createCustomContentTypeSupport("a/b"),
RepresentationType.ENTITY);
- ContentNegotiator.checkSupport(ContentType.create("a/b", "c=d"), createCustomContentTypeSupport("a/b"),
+ ContentNegotiator.checkSupport(ContentType.create(ContentType.create("a/b"), "c", "d"),
+ createCustomContentTypeSupport("a/b"),
RepresentationType.ENTITY);
try {
ContentNegotiator.checkSupport(ContentType.create("a/b"), createCustomContentTypeSupport("a/b;c=d"),
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerBasicTest.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerBasicTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerBasicTest.java
index d29fdf8..c73acab 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerBasicTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerBasicTest.java
@@ -33,7 +33,7 @@ import org.apache.olingo.server.api.deserializer.ODataDeserializer;
import org.junit.Test;
public class ODataJsonDeserializerBasicTest {
-
+
@Test
public void checkSupportedJsonFormats() throws Exception {
ODataDeserializer deserializer = OData.newInstance().createDeserializer(ContentType.JSON);
@@ -78,7 +78,7 @@ public class ODataJsonDeserializerBasicTest {
assertEquals(1, values.size());
assertEquals("Orders(10643)", values.get(0).toASCIIString());
}
-
+
@Test
public void reference() throws Exception {
String entityString = "{"
@@ -89,82 +89,82 @@ public class ODataJsonDeserializerBasicTest {
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
ODataDeserializer deserializer = OData.newInstance().createDeserializer(ContentType.JSON);
final List<URI> entityReferences = deserializer.entityReferences(stream).getEntityReferences();
-
+
assertEquals(1, entityReferences.size());
assertEquals("ESAllPrim(0)", entityReferences.get(0).toASCIIString());
}
-
+
@Test
public void references() throws Exception {
- String entityString = "{" +
- " \"@odata.context\": \"$metadata#Collection($ref)\"," +
- " \"value\": [" +
- " { \"@odata.id\": \"ESAllPrim(0)\" }," +
- " { \"@odata.id\": \"ESAllPrim(1)\" }" +
- " ]" +
+ String entityString = "{" +
+ " \"@odata.context\": \"$metadata#Collection($ref)\"," +
+ " \"value\": [" +
+ " { \"@odata.id\": \"ESAllPrim(0)\" }," +
+ " { \"@odata.id\": \"ESAllPrim(1)\" }" +
+ " ]" +
"}";
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
ODataDeserializer deserializer = OData.newInstance().createDeserializer(ContentType.JSON);
final List<URI> entityReferences = deserializer.entityReferences(stream).getEntityReferences();
-
+
assertEquals(2, entityReferences.size());
assertEquals("ESAllPrim(0)", entityReferences.get(0).toASCIIString());
assertEquals("ESAllPrim(1)", entityReferences.get(1).toASCIIString());
}
-
+
@Test
public void referencesWithOtherAnnotations() throws Exception {
- String entityString = "{" +
- " \"@odata.context\": \"$metadata#Collection($ref)\"," +
- " \"value\": [" +
- " { \"@odata.id\": \"ESAllPrim(0)\" }," +
- " { \"@odata.nonExistingODataAnnotation\": \"ESAllPrim(1)\" }" +
- " ]" +
+ String entityString = "{" +
+ " \"@odata.context\": \"$metadata#Collection($ref)\"," +
+ " \"value\": [" +
+ " { \"@odata.id\": \"ESAllPrim(0)\" }," +
+ " { \"@odata.nonExistingODataAnnotation\": \"ESAllPrim(1)\" }" +
+ " ]" +
"}";
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
ODataDeserializer deserializer = OData.newInstance().createDeserializer(ContentType.JSON);
final List<URI> entityReferences = deserializer.entityReferences(stream).getEntityReferences();
-
+
assertEquals(1, entityReferences.size());
assertEquals("ESAllPrim(0)", entityReferences.get(0).toASCIIString());
}
-
+
@Test
public void referencesWithCustomAnnotation() throws Exception {
- String entityString = "{" +
- " \"@odata.context\": \"$metadata#Collection($ref)\"," +
- " \"value\": [" +
- " { \"@odata.id\": \"ESAllPrim(0)\" }," +
- " { \"@invalid\": \"ESAllPrim(1)\" }" +
- " ]" +
+ String entityString = "{" +
+ " \"@odata.context\": \"$metadata#Collection($ref)\"," +
+ " \"value\": [" +
+ " { \"@odata.id\": \"ESAllPrim(0)\" }," +
+ " { \"@invalid\": \"ESAllPrim(1)\" }" +
+ " ]" +
"}";
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
ODataDeserializer deserializer = OData.newInstance().createDeserializer(ContentType.JSON);
final List<URI> entityReferences = deserializer.entityReferences(stream).getEntityReferences();
-
+
assertEquals(1, entityReferences.size());
assertEquals("ESAllPrim(0)", entityReferences.get(0).toASCIIString());
}
-
+
@Test
public void referenceEmpty() throws Exception {
- String entityString = "{" +
- " \"@odata.context\": \"$metadata#Collection($ref)\"," +
- " \"value\": [" +
- " ]" +
+ String entityString = "{" +
+ " \"@odata.context\": \"$metadata#Collection($ref)\"," +
+ " \"value\": [" +
+ " ]" +
"}";
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
ODataDeserializer deserializer = OData.newInstance().createDeserializer(ContentType.JSON);
final List<URI> entityReferences = deserializer.entityReferences(stream).getEntityReferences();
-
+
assertEquals(0, entityReferences.size());
}
-
- @Test(expected=DeserializerException.class)
+
+ @Test(expected = DeserializerException.class)
public void referencesEmpty() throws Exception {
/*
* See OData JSON Format chaper 13
@@ -175,15 +175,15 @@ public class ODataJsonDeserializerBasicTest {
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
ODataDeserializer deserializer = OData.newInstance().createDeserializer(ContentType.JSON);
final List<URI> entityReferences = deserializer.entityReferences(stream).getEntityReferences();
-
+
assertEquals(0, entityReferences.size());
}
-
- @Test(expected=DeserializerException.class)
+
+ @Test(expected = DeserializerException.class)
public void referenceValueIsNotAnArray() throws Exception {
- String entityString = "{" +
- " \"@odata.context\": \"$metadata#Collection($ref)\"," +
- " \"value\": \"ESAllPrim(0)\"" + // This is not allowed. Value must be followed by an array
+ String entityString = "{" +
+ " \"@odata.context\": \"$metadata#Collection($ref)\"," +
+ " \"value\": \"ESAllPrim(0)\"" + // This is not allowed. Value must be followed by an array
"}";
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
----------------------------------------------------------------------
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
index 64327f3..e9761dc 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalProcessor.java
@@ -255,9 +255,10 @@ public abstract class TechnicalProcessor implements Processor {
HttpStatusCode.BAD_REQUEST.getStatusCode(), Locale.ROOT);
}
}
-
+
protected boolean isODataMetadataNone(final ContentType contentType) {
- return contentType.isCompatible(ContentType.APPLICATION_JSON)
- && ContentType.VALUE_ODATA_METADATA_NONE.equals(contentType.getParameter(ContentType.PARAMETER_ODATA_METADATA));
+ return contentType.isCompatible(ContentType.APPLICATION_JSON)
+ && ContentType.VALUE_ODATA_METADATA_NONE.equals(
+ contentType.getParameter(ContentType.PARAMETER_ODATA_METADATA));
}
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/2a841552/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
----------------------------------------------------------------------
diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
index 4684461..4a03b03 100644
--- a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
+++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerEntityTest.java
@@ -1411,7 +1411,7 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
throw e;
}
}
-
+
@Test
public void ieee754Compatible() throws Exception {
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
@@ -1432,15 +1432,15 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
"\"PropertyDuration\":\"PT6S\"," +
"\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\"," +
"\"PropertyTimeOfDay\":\"03:26:05\"}";
-
+
final InputStream stream = new ByteArrayInputStream(entityString.getBytes());
final Entity entity = deserializer
.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETAllPrim"))).getEntity();
-
+
assertEquals(9223372036854775807L, entity.getProperty("PropertyInt64").asPrimitive());
assertEquals(BigDecimal.valueOf(34), entity.getProperty("PropertyDecimal").asPrimitive());
}
-
+
@Test
public void ieee754CompatibleNull() throws Exception {
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
@@ -1461,16 +1461,16 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
"\"PropertyDuration\":\"PT6S\"," +
"\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\"," +
"\"PropertyTimeOfDay\":\"03:26:05\"}";
-
+
final InputStream stream = new ByteArrayInputStream(entityString.getBytes());
final Entity entity = deserializer
.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETAllPrim"))).getEntity();
-
+
assertTrue(entity.getProperty("PropertyInt64").isNull());
assertTrue(entity.getProperty("PropertyDecimal").isNull());
}
-
- @Test(expected=DeserializerException.class)
+
+ @Test(expected = DeserializerException.class)
public void ieee754CompatibleEmptyString() throws Exception {
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
String entityString =
@@ -1490,12 +1490,12 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
"\"PropertyDuration\":\"PT6S\"," +
"\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\"," +
"\"PropertyTimeOfDay\":\"03:26:05\"}";
-
+
final InputStream stream = new ByteArrayInputStream(entityString.getBytes());
deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETAllPrim"))).getEntity();
}
-
- @Test(expected=DeserializerException.class)
+
+ @Test(expected = DeserializerException.class)
public void ieee754CompatibleNullAsString() throws Exception {
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
String entityString =
@@ -1515,11 +1515,11 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
"\"PropertyDuration\":\"PT6S\"," +
"\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\"," +
"\"PropertyTimeOfDay\":\"03:26:05\"}";
-
+
final InputStream stream = new ByteArrayInputStream(entityString.getBytes());
deserializer.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETAllPrim"))).getEntity();
}
-
+
private void checkPropertyJsonType(final String entityString) throws DeserializerException {
InputStream stream = new ByteArrayInputStream(entityString.getBytes());
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON);