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 33f3e86 [OLINGO-1505]Support instance annotation for Stream property
33f3e86 is described below
commit 33f3e86f1ed8ca392dc9d231e9ca4d6f9b408538
Author: ramya vasanth <[email protected]>
AuthorDate: Fri Jan 22 13:39:37 2021 +0530
[OLINGO-1505]Support instance annotation for Stream property
---
.../deserializer/json/ODataJsonDeserializer.java | 55 +++++++++++++++++++++-
.../ODataJsonInstanceAnnotationDeserializer.java | 2 +-
...sonDeserializerWithInstanceAnnotationsTest.java | 38 ++++++++++++++-
3 files changed, 92 insertions(+), 3 deletions(-)
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 babc5a0..4e09c7a 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
@@ -115,6 +115,9 @@ public class ODataJsonDeserializer implements
ODataDeserializer {
private static final String ODATA_ANNOTATION_MARKER = "@";
private static final String ODATA_CONTROL_INFORMATION_PREFIX = "@odata.";
private static final String REASON = "reason";
+ private static final String ODATA_STREAM_PROPERTY_MEDIA_READ_LINK =
"mediaReadLink";
+ private static final String ODATA_STREAM_PROPERTY_MEDIA_EDIT_LINK =
"mediaEditLink";
+ private static final String ODATA_STREAM_PROPERTY_MEDIA_MIME_TYPE =
"mediaMimeType";
private final boolean isIEEE754Compatible;
private ServiceMetadata serviceMetadata;
@@ -479,6 +482,9 @@ public class ODataJsonDeserializer implements
ODataDeserializer {
entity.getAnnotations().add(annotation);
}
toRemove.add(field.getKey());
+ } else if (isStreamPropertyNode(field.getKey())) {
+ consumeStreamPropertyNode(entity, edmEntityType, field);
+ toRemove.add(field.getKey());
}
}
// remove here to avoid iterator issues.
@@ -487,6 +493,53 @@ public class ODataJsonDeserializer implements
ODataDeserializer {
removeAnnotations(node);
}
+ /**
+ * Process stream property instance annotation,
+ * include
+ * <ul>
+ * <li>odata.mediaReadLink for 4.0 or mediaReadLink for 4.01</li>
+ * <li>odata.mediaEditLink for 4.0 or mediaEditLink for 4.01</li>
+ * <li>odata.mediaMimeType for 4.0 or mediaMimeType for 4.01</li>
+ * </ul>
+ *
+ * @return true if jsonNodeKey present stream property annotation, false for
otherwise
+ */
+ private boolean isStreamPropertyNode(String jsonNodeKey) {
+ return jsonNodeKey.endsWith(ODATA_STREAM_PROPERTY_MEDIA_READ_LINK)
+ || jsonNodeKey.endsWith(ODATA_STREAM_PROPERTY_MEDIA_EDIT_LINK)
+ || jsonNodeKey.endsWith(ODATA_STREAM_PROPERTY_MEDIA_MIME_TYPE);
+ }
+
+ /**
+ * Construct a empty {@code Property} and fill stream property annotation
data into it
+ *
+ * @param entity entity instance which is filled
+ * @param edmEntityType edm entity type which for which the json node is
consumed
+ * @param field Json field entry which current consuming
+ *
+ * @throws DeserializerException thrown by {@code instanceAnnotDeserializer}
if consume
+ * instance annotation failed
+ */
+ private void consumeStreamPropertyNode(final Entity entity,
+ final EdmEntityType edmEntityType,
+ final Entry<String, JsonNode> field)
throws DeserializerException {
+ String[] keySplit = field.getKey().split(ODATA_ANNOTATION_MARKER);
+ String termName = keySplit[1];
+ Annotation annotation =
instanceAnnotDeserializer.consumeInstanceAnnotation(termName, field.getValue());
+ String propertyName = keySplit[0];
+ if(edmEntityType.getProperty(propertyName) == null) {
+ return;
+ }
+
+ Property property = entity.getProperty(propertyName);
+ if(property == null) {
+ property = new Property();
+ property.setName(propertyName);
+ entity.addProperty(property);
+ }
+ property.getAnnotations().add(annotation);
+ }
+
private void consumeEntityProperties(final EdmEntityType edmEntityType,
final ObjectNode node,
final Entity entity) throws DeserializerException {
List<String> propertyNames = edmEntityType.getPropertyNames();
@@ -929,7 +982,7 @@ public class ODataJsonDeserializer implements
ODataDeserializer {
/**
* Returns the primitive type's default class or the manually mapped class
if present.
* @param mapping
- * @param edmPrimitiveType
+ * @param type
* @return the java class to be used during deserialization
*/
private Class<?> getJavaClassForPrimitiveType(final EdmMapping mapping,
final EdmPrimitiveType type) {
diff --git
a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonInstanceAnnotationDeserializer.java
b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonInstanceAnnotationDeserializer.java
index 0ac5251..d00f641 100644
---
a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonInstanceAnnotationDeserializer.java
+++
b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/json/ODataJsonInstanceAnnotationDeserializer.java
@@ -108,7 +108,7 @@ public class ODataJsonInstanceAnnotationDeserializer {
case PRIMITIVE:
if (valuable.getType() == null && typeInfo != null) {
-
valuable.setType(typeInfo.getFullQualifiedName().toString());
+
valuable.setType(typeInfo.getPrimitiveTypeKind().name());
}
final Object primitiveValue = fromPrimitive(node,
typeInfo);
valuable.setValue(primitiveValue instanceof Geospatial
?
diff --git
a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerWithInstanceAnnotationsTest.java
b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerWithInstanceAnnotationsTest.java
index ab4b2eb..283be48 100644
---
a/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerWithInstanceAnnotationsTest.java
+++
b/lib/server-test/src/test/java/org/apache/olingo/server/core/deserializer/json/ODataJsonDeserializerWithInstanceAnnotationsTest.java
@@ -231,7 +231,43 @@ public class
ODataJsonDeserializerWithInstanceAnnotationsTest extends AbstractOD
assertEquals(ValueType.COLLECTION_COMPLEX,
complxProperties.get(1).getValueType());
assertEquals(2, complxProperties.get(1).asCollection().size());
}
-
+
+ @Test
+ public void instanceAnnotationForStreamProperty() throws
DeserializerException {
+ final String entityString = "{"
+ +
"\"@odata.context\":\"$metadata#ETWithStream/$entity\","
+ + "\"[email protected]\":\"#Int16\","
+ + "\"PropertyInt16\":32767,"
+ +
"\"[email protected]\":\"http://mockReadLink1\","
+ +
"\"[email protected]\":\"http://mockEditLink1\","
+ +
"\"[email protected]\":\"image/png\","
+ +
"\"PropertyStream@mediaReadLink\":\"http://mockReadLink2\","
+ +
"\"PropertyStream@mediaEditLink\":\"http://mockEditLink2\","
+ + "\"PropertyStream@mediaMimeType\":\"image/jpeg\""
+ +"}";
+ final Entity entity = deserialize(entityString, "ETWithStream");
+ assertNotNull(entity);
+ Property propertyStream = entity.getProperty("PropertyStream");
+ assertNotNull(propertyStream);
+ List<Annotation> annotations = propertyStream.getAnnotations();
+ assertEquals(6, annotations.size());
+ for(Annotation annotation : annotations) {
+ if("odata.mediaReadLink".equals(annotation.getTerm())) {
+ assertEquals("http://mockReadLink1",
annotation.getValue().toString());
+ } else
if("odata.mediaEditLink".equals(annotation.getTerm())) {
+ assertEquals("http://mockEditLink1",
annotation.getValue().toString());
+ } else
if("odata.mediaMimeType".equals(annotation.getTerm())) {
+ assertEquals("image/png",
annotation.getValue().toString());
+ } else if("mediaReadLink".equals(annotation.getTerm()))
{
+ assertEquals("http://mockReadLink2",
annotation.getValue().toString());
+ } else if("mediaEditLink".equals(annotation.getTerm()))
{
+ assertEquals("http://mockEditLink2",
annotation.getValue().toString());
+ } else if("mediaMimeType".equals(annotation.getTerm()))
{
+ assertEquals("image/jpeg",
annotation.getValue().toString());
+ }
+ }
+ }
+
protected static DeserializerResult
deserializeWithResultWithConstantV401(final InputStream stream,
final String entityTypeName, final ContentType contentType)
throws DeserializerException {