[OLINGO-1483]Handle Decimal types in JsonPropertyConsumer
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java
index 7589aa5..e8a7cf2 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumer.java
@@ -219,6 +219,14 @@
.addContent(entityPropertyInfo.getName()));
}
break;
+ case Decimal:
+ if (tokenType == JsonToken.NUMBER || tokenType == JsonToken.STRING) {
+ value = reader.nextString();
+ } else {
+ throw new EntityProviderException(EntityProviderException.INVALID_PROPERTY_VALUE
+ .addContent(entityPropertyInfo.getName()));
+ }
+ break;
default:
if (tokenType == JsonToken.STRING) {
value = reader.nextString();
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
index 36b1cca..6d73fca 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java
@@ -97,6 +97,21 @@
when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Int32.getEdmSimpleTypeInstance());
resultMap = execute(edmProperty, reader);
assertEquals(Integer.valueOf("67"), resultMap.get("Age"));
+ // Decimal
+ reader = prepareReader(simplePropertyJson);
+ when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Decimal.getEdmSimpleTypeInstance());
+ resultMap = execute(edmProperty, reader);
+ assertEquals(BigDecimal.valueOf(67), resultMap.get("Age"));
+ //Decimal
+ simplePropertyJson = "{\"d\":{\"Revenue\":67.56}}";
+ edmProperty = mock(EdmProperty.class);
+ when(edmProperty.getName()).thenReturn("Revenue");
+ when(edmProperty.isSimple()).thenReturn(true);
+
+ reader = prepareReader(simplePropertyJson);
+ when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Decimal.getEdmSimpleTypeInstance());
+ resultMap = execute(edmProperty, reader);
+ assertEquals(BigDecimal.valueOf(67.56), resultMap.get("Revenue"));
}
@Test
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
index 1b3bc8c..367eefd 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlPropertyConsumerTest.java
@@ -26,6 +26,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
@@ -67,6 +68,18 @@
assertEquals(Integer.valueOf(67), resultMap.get("Age"));
}
+
+ @Test
+ public void readDecimalProperty() throws Exception {
+ String xml = "<Revenue xmlns=\"" + Edm.NAMESPACE_D_2007_08 + "\">67.56</Revenue>";
+ XMLStreamReader reader = createReaderForTest(xml, true);
+ final EdmProperty property =
+ (EdmProperty) MockFacade.getMockEdm().getEntityType("RefScenario", "Organization").getProperty("Revenue");
+
+ Map<String, Object> resultMap = new XmlPropertyConsumer().readProperty(reader, property, null);
+
+ assertEquals(BigDecimal.valueOf(67.56), resultMap.get("Revenue"));
+ }
@Test
public void readIntegerPropertyAsLong() throws Exception {
diff --git a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java
index d069b29..5a9a2ee 100644
--- a/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java
+++ b/odata2-lib/odata-testutil/src/main/java/org/apache/olingo/odata2/testutil/mock/EdmMock.java
@@ -180,11 +180,13 @@
createProperty("NGO", EdmSimpleTypeKind.Boolean, companyType);
EdmEntityType organizationType = organizationsEntitySet.getEntityType();
- when(organizationType.getPropertyNames()).thenReturn(Arrays.asList("Id", "Name", "Kind", "Location", "NoOfTeam"));
+ when(organizationType.getPropertyNames()).thenReturn(Arrays.asList("Id", "Name", "Kind", "Location", "NoOfTeam"
+ , "Revenue"));
when(organizationType.getProperty("Location")).thenReturn(locationComplexProperty);
EdmProperty orgName = createProperty("Name", EdmSimpleTypeKind.String, organizationType);
EdmProperty orgKind = createProperty("Kind", EdmSimpleTypeKind.String, organizationType);
createProperty("NoOfTeam", EdmSimpleTypeKind.Int16, organizationType);
+ createProperty("Revenue", EdmSimpleTypeKind.Decimal, organizationType);
EdmFacets orgNameFacets = mock(EdmFacets.class);
when(orgNameFacets.isNullable()).thenReturn(null);