You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2020/03/19 05:07:18 UTC
[olingo-odata4] branch master updated: [OLINGO-1437]Add additional
properties to OData Server Error
This is an automated email from the ASF dual-hosted git repository.
ramyav pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git
The following commit(s) were added to refs/heads/master by this push:
new a3318be [OLINGO-1437]Add additional properties to OData Server Error
a3318be is described below
commit a3318beed39dd92d887a953a07cf815693df8188
Author: ramya vasanth <ra...@sap.com>
AuthorDate: Thu Mar 19 10:37:08 2020 +0530
[OLINGO-1437]Add additional properties to OData Server Error
---
.../apache/olingo/commons/api/ex/ODataError.java | 19 +++++++++
.../olingo/commons/api/ex/ODataErrorDetail.java | 21 ++++++++++
.../apache/olingo/server/api/ODataServerError.java | 9 +++++
.../core/serializer/json/ODataErrorSerializer.java | 31 ++++++++++++++-
.../serializer/json/ServerErrorSerializerTest.java | 45 ++++++++++++++++++++++
5 files changed, 124 insertions(+), 1 deletion(-)
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataError.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataError.java
index 2f68f67..c9a36b4 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataError.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataError.java
@@ -31,6 +31,7 @@ public class ODataError {
private String target;
private List<ODataErrorDetail> details;
private Map<String, String> innerError;
+ private Map<String, Object> additionalProperties;
/**
* The value for the code name/value pair is a language-independent string. Its value is a service-defined error code.
@@ -129,4 +130,22 @@ public class ODataError {
this.innerError = innerError;
return this;
}
+
+ /**
+ * Sets server defined additional properties
+ * @param additionalProperties
+ * @return this for method chaining.
+ */
+ public ODataError setAdditionalProperties(final Map<String, Object> additionalProperties) {
+ this.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * Gets server defined additional properties.
+ * @return a pair representing server defined object.
+ */
+ public Map<String, Object> getAdditionalProperties() {
+ return this.additionalProperties;
+ }
}
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataErrorDetail.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataErrorDetail.java
index 53c4de6..cefc059 100644
--- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataErrorDetail.java
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/ex/ODataErrorDetail.java
@@ -18,6 +18,8 @@
*/
package org.apache.olingo.commons.api.ex;
+import java.util.Map;
+
/**
* OData details, for example <tt>{ "error": {..., "details":[
* {"code": "301","target": "$search" ,"message": "$search query option not supported"}
@@ -28,6 +30,7 @@ public class ODataErrorDetail {
private String code;
private String message;
private String target;
+ private Map<String, Object> additionalProperties;
/**
* Gets error code.
@@ -76,4 +79,22 @@ public class ODataErrorDetail {
this.target = target;
return this;
}
+
+ /**
+ * Sets server defined additional properties
+ * @param additionalProperties additionalProperties
+ * @return this ODataErrorDetail instance (fluent builder)
+ */
+ public ODataErrorDetail setAdditionalProperties(final Map<String, Object> additionalProperties) {
+ this.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * Gets server defined additional properties.
+ * @return a pair representing server defined object.
+ */
+ public Map<String, Object> getAdditionalProperties() {
+ return this.additionalProperties;
+ }
}
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java
index 0e6c72c..a290ec3 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/ODataServerError.java
@@ -140,4 +140,13 @@ public class ODataServerError extends ODataError {
return this;
}
+ /**
+ * Sets server defined key-value pairs.
+ * @return this for method chaining.
+ */
+ @Override
+ public ODataServerError setAdditionalProperties(final Map<String, Object> additionalProperties) {
+ super.setAdditionalProperties(additionalProperties);
+ return this;
+ }
}
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializer.java
index 9a84c27..5d983a1 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataErrorSerializer.java
@@ -19,6 +19,9 @@
package org.apache.olingo.server.core.serializer.json;
import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.ex.ODataError;
@@ -40,12 +43,14 @@ public class ODataErrorSerializer {
json.writeStartObject();
writeODataError(json, error.getCode(), error.getMessage(), error.getTarget());
+ writeODataAdditionalProperties(json, error.getAdditionalProperties());
if (error.getDetails() != null) {
json.writeArrayFieldStart(Constants.ERROR_DETAILS);
for (ODataErrorDetail detail : error.getDetails()) {
json.writeStartObject();
writeODataError(json, detail.getCode(), detail.getMessage(), detail.getTarget());
+ writeODataAdditionalProperties(json, detail.getAdditionalProperties());
json.writeEndObject();
}
json.writeEndArray();
@@ -55,7 +60,31 @@ public class ODataErrorSerializer {
json.writeEndObject();
}
- private void writeODataError(final JsonGenerator json, final String code, final String message, final String target)
+ @SuppressWarnings("unchecked")
+ private void writeODataAdditionalProperties(JsonGenerator json,
+ Map<String, Object> additionalProperties) throws IOException {
+ if (additionalProperties != null) {
+ for (Entry<String, Object> additionalProperty : additionalProperties.entrySet()) {
+ Object value = additionalProperty.getValue();
+ if (value instanceof List) {
+ List<Map<String, Object>> list = (List<Map<String, Object>>) value;
+ json.writeArrayFieldStart(additionalProperty.getKey());
+ for (Map<String, Object> entry : list) {
+ json.writeStartObject();
+ writeODataAdditionalProperties(json, entry);
+ json.writeEndObject();
+ }
+ json.writeEndArray();
+ } else if (value instanceof Map) {
+ writeODataAdditionalProperties(json, (Map<String, Object>) value);
+ } else {
+ json.writeObjectField(additionalProperty.getKey(), value);
+ }
+ }
+ }
+}
+
+private void writeODataError(final JsonGenerator json, final String code, final String message, final String target)
throws IOException {
json.writeFieldName(Constants.ERROR_CODE);
if (code == null) {
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ServerErrorSerializerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ServerErrorSerializerTest.java
index c0e2121..4bf5685 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ServerErrorSerializerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/json/ServerErrorSerializerTest.java
@@ -24,7 +24,9 @@ import static org.junit.Assert.assertNotNull;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.olingo.commons.api.ex.ODataErrorDetail;
@@ -132,4 +134,47 @@ public class ServerErrorSerializerTest {
assertEquals("detailMessage", tree.get("message").textValue());
assertEquals("detailTarget", tree.get("target").textValue());
}
+
+ @Test
+ public void testErrorObjectWithAdditionalProperties() throws Exception {
+ Map<String, Object> innerError = new HashMap<>();
+ List<Map<String, Object>> list = new ArrayList<>();
+ Map<String, Object> map = new HashMap<>();
+ map.put("targetDetail", "targetDetail");
+ map.put("@Common.numericSeverity", 4);
+ list.add(map);
+ innerError.put("@Common.additionalTargets", list);
+ innerError.put("@Common.longtextUrl", "url");
+ ODataServerError error =
+ new ODataServerError().setCode("Code").setMessage("Message").setTarget("Target")
+ .setAdditionalProperties(innerError)
+ .setDetails(Collections.singletonList(
+ new ODataErrorDetail().setCode("detailCode").setMessage("detailMessage")
+ .setTarget("detailTarget").setAdditionalProperties(innerError)));
+ InputStream stream = ser.error(error).getContent();
+ JsonNode tree = new ObjectMapper().readTree(stream);
+ assertNotNull(tree);
+ tree = tree.get("error");
+ assertNotNull(tree);
+ assertEquals("Code", tree.get("code").textValue());
+ assertEquals("Message", tree.get("message").textValue());
+ assertEquals("Target", tree.get("target").textValue());
+ assertEquals(1, tree.get("@Common.additionalTargets").size());
+ assertEquals("targetDetail", tree.get("@Common.additionalTargets").get(0).get("targetDetail").textValue());
+ assertEquals(4, tree.get("@Common.additionalTargets").get(0).get("@Common.numericSeverity").asInt());
+ assertEquals("url", tree.get("@Common.longtextUrl").textValue());
+
+ tree = tree.get("details");
+ assertNotNull(tree);
+ assertEquals(JsonNodeType.ARRAY, tree.getNodeType());
+
+ tree = tree.get(0);
+ assertNotNull(tree);
+ assertEquals("detailCode", tree.get("code").textValue());
+ assertEquals("detailMessage", tree.get("message").textValue());
+ assertEquals("detailTarget", tree.get("target").textValue());
+ assertEquals(1, tree.get("@Common.additionalTargets").size());
+ assertEquals("targetDetail", tree.get("@Common.additionalTargets").get(0).get("targetDetail").textValue());
+ assertEquals("url", tree.get("@Common.longtextUrl").textValue());
+ }
}