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());
+  }
 }