[OLINGO-704] IEEE754Compatible support added to ODataJsonDeserializer.
Tests for read scenario added
This commit is contained in:
parent
0043bd9c2e
commit
be55285ce3
|
@ -28,6 +28,7 @@ import static org.junit.Assert.assertThat;
|
|||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.net.URI;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
|
@ -44,6 +45,7 @@ import org.apache.olingo.client.api.communication.request.cud.UpdateType;
|
|||
import org.apache.olingo.client.api.communication.request.retrieve.EdmMetadataRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntitySetRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.ODataPropertyRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.ODataServiceDocumentRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.ODataValueRequest;
|
||||
import org.apache.olingo.client.api.communication.request.retrieve.XMLMetadataRequest;
|
||||
|
@ -75,11 +77,27 @@ import org.apache.olingo.commons.api.http.HttpHeader;
|
|||
import org.apache.olingo.commons.api.http.HttpStatusCode;
|
||||
import org.apache.olingo.fit.AbstractBaseTestITCase;
|
||||
import org.apache.olingo.fit.tecsvc.TecSvcConst;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
public class BasicITCase extends AbstractBaseTestITCase {
|
||||
|
||||
|
||||
private static final String CONTENT_TYPE_JSON_IEEE754_COMPATIBLE = "application/json;odata.metadata=minimal;"
|
||||
+ "IEEE754Compatible=true";
|
||||
private static final String SERVICE_NAMESPACE = "olingo.odata.test1";
|
||||
private static final String ET_ALL_PRIM_NAME = "ETAllPrim";
|
||||
private static final FullQualifiedName ET_ALL_PRIM = new FullQualifiedName(SERVICE_NAMESPACE, ET_ALL_PRIM_NAME);
|
||||
|
||||
private static final String PROPERTY_INT16 = "PropertyInt16";
|
||||
private static final String PROPERTY_INT64 = "PropertyInt64";
|
||||
private static final String PROPERTY_DECIMAL = "PropertyDecimal";
|
||||
private static final String PROPERTY_COMP_ALL_PRIM = "PropertyCompAllPrim";
|
||||
private static final String NAV_PROPERTY_ET_TWO_PRIM_ONE = "NavPropertyETTwoPrimOne";
|
||||
|
||||
private static final String SERVICE_URI = TecSvcConst.BASE_URI;
|
||||
private static final String ES_ALL_PRIM = "ESAllPrim";
|
||||
private static final String ES_TWO_PRIM = "ESTwoPrim";
|
||||
private static final String ES_KEY_NAV = "ESKeyNav";
|
||||
|
||||
@Test
|
||||
public void readServiceDocument() {
|
||||
|
@ -376,7 +394,7 @@ public class BasicITCase extends AbstractBaseTestITCase {
|
|||
ClientEntity newEntity = factory.newEntity(new FullQualifiedName("olingo.odata.test1", "ETAllPrim"));
|
||||
newEntity.getProperties().add(factory.newPrimitiveProperty("PropertyInt64",
|
||||
factory.newPrimitiveValueBuilder().buildInt32(42)));
|
||||
newEntity.addLink(factory.newEntityNavigationLink("NavPropertyETTwoPrimOne",
|
||||
newEntity.addLink(factory.newEntityNavigationLink(NAV_PROPERTY_ET_TWO_PRIM_ONE,
|
||||
client.newURIBuilder(SERVICE_URI)
|
||||
.appendEntitySetSegment("ESTwoPrim")
|
||||
.appendKeySegment(32766)
|
||||
|
@ -916,7 +934,173 @@ public class BasicITCase extends AbstractBaseTestITCase {
|
|||
.get("PropertyInt16")
|
||||
.hasNullValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createEntityWithIEEE754CompatibleParameter() {
|
||||
final ODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
|
||||
client.getConfiguration().setDefaultPubFormat(ODataFormat.JSON);
|
||||
final ClientObjectFactory of = client.getObjectFactory();
|
||||
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_ALL_PRIM).build();
|
||||
final URI linkURI = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_TWO_PRIM)
|
||||
.appendKeySegment(32767).build();
|
||||
|
||||
final ClientEntity newEntity = of.newEntity(ET_ALL_PRIM);
|
||||
newEntity.getProperties().add(of.newPrimitiveProperty(PROPERTY_INT64,
|
||||
of.newPrimitiveValueBuilder().buildString("" + Long.MAX_VALUE)));
|
||||
newEntity.getProperties().add(of.newPrimitiveProperty(PROPERTY_DECIMAL,
|
||||
of.newPrimitiveValueBuilder().buildString("" + 34L)));
|
||||
newEntity.addLink(of.newEntityNavigationLink(NAV_PROPERTY_ET_TWO_PRIM_ONE, linkURI));
|
||||
|
||||
final ODataEntityCreateRequest<ClientEntity> request = client.getCUDRequestFactory()
|
||||
.getEntityCreateRequest(uri, newEntity);
|
||||
request.setContentType(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
|
||||
request.setAccept(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
|
||||
final ODataEntityCreateResponse<ClientEntity> response = request.execute();
|
||||
|
||||
assertEquals(Long.MAX_VALUE, response.getBody().getProperty(PROPERTY_INT64).getPrimitiveValue().toValue());
|
||||
assertEquals(BigDecimal.valueOf(34), response.getBody().getProperty(PROPERTY_DECIMAL)
|
||||
.getPrimitiveValue().toValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createEntityInt64AndDecimalAsStringWithoutIEEE754ComaptibleParameter() {
|
||||
final ODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
|
||||
client.getConfiguration().setDefaultPubFormat(ODataFormat.JSON);
|
||||
final ClientObjectFactory of = client.getObjectFactory();
|
||||
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_ALL_PRIM).build();
|
||||
final URI linkURI = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_TWO_PRIM)
|
||||
.appendKeySegment(32767).build();
|
||||
|
||||
final ClientEntity newEntity = of.newEntity(ET_ALL_PRIM);
|
||||
newEntity.getProperties().add(of.newPrimitiveProperty(PROPERTY_INT64,
|
||||
of.newPrimitiveValueBuilder().buildString("" + Long.MAX_VALUE)));
|
||||
newEntity.getProperties().add(of.newPrimitiveProperty(PROPERTY_DECIMAL,
|
||||
of.newPrimitiveValueBuilder().buildString("" + 34L)));
|
||||
newEntity.addLink(of.newEntityNavigationLink(NAV_PROPERTY_ET_TWO_PRIM_ONE, linkURI));
|
||||
|
||||
final ODataEntityCreateRequest<ClientEntity> request = client.getCUDRequestFactory()
|
||||
.getEntityCreateRequest(uri, newEntity);
|
||||
try {
|
||||
request.execute();
|
||||
fail();
|
||||
} catch(ODataClientErrorException e) {
|
||||
assertEquals(HttpStatusCode.BAD_REQUEST.getStatusCode(), e.getStatusLine().getStatusCode());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readESAllPrimCollectionWithIEEE754CompatibleParameter() {
|
||||
final ODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
|
||||
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_ALL_PRIM)
|
||||
.orderBy(PROPERTY_INT16)
|
||||
.build();
|
||||
|
||||
final ODataEntitySetRequest<ClientEntitySet> request = client.getRetrieveRequestFactory().getEntitySetRequest(uri);
|
||||
request.setAccept(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
|
||||
final ODataRetrieveResponse<ClientEntitySet> response = request.execute();
|
||||
|
||||
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
|
||||
final List<ClientEntity> entities = response.getBody().getEntities();
|
||||
assertEquals(3, entities.size());
|
||||
|
||||
ClientEntity entity = entities.get(0);
|
||||
assertEquals(-32768, entity.getProperty(PROPERTY_INT16).getPrimitiveValue().toValue());
|
||||
assertEquals(Long.MIN_VALUE, entity.getProperty(PROPERTY_INT64).getPrimitiveValue().toValue());
|
||||
assertEquals(BigDecimal.valueOf(-34), entity.getProperty(PROPERTY_DECIMAL).getPrimitiveValue().toValue());
|
||||
|
||||
entity = entities.get(1);
|
||||
assertEquals(0, entity.getProperty(PROPERTY_INT16).getPrimitiveValue().toValue());
|
||||
assertEquals(0L, entity.getProperty(PROPERTY_INT64).getPrimitiveValue().toValue());
|
||||
assertEquals(BigDecimal.valueOf(0), entity.getProperty(PROPERTY_DECIMAL).getPrimitiveValue().toValue());
|
||||
|
||||
entity = entities.get(2);
|
||||
assertEquals(32767, entity.getProperty(PROPERTY_INT16).getPrimitiveValue().toValue());
|
||||
assertEquals(Long.MAX_VALUE, entity.getProperty(PROPERTY_INT64).getPrimitiveValue().toValue());
|
||||
assertEquals(BigDecimal.valueOf(34), entity.getProperty(PROPERTY_DECIMAL).getPrimitiveValue().toValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readESKeyNavCheckComplexPropertyWithIEEE754CompatibleParameter() {
|
||||
final ODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
|
||||
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_KEY_NAV).appendKeySegment(1).build();
|
||||
|
||||
final ODataEntityRequest<ClientEntity> request = client.getRetrieveRequestFactory().getEntityRequest(uri);
|
||||
request.setAccept(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
|
||||
final ODataRetrieveResponse<ClientEntity> response = request.execute();
|
||||
|
||||
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
|
||||
assertEquals(1, response.getBody().getProperty(PROPERTY_INT16).getPrimitiveValue().toValue());
|
||||
|
||||
assertEquals(BigDecimal.valueOf(34), response.getBody().getProperty(PROPERTY_COMP_ALL_PRIM)
|
||||
.getComplexValue()
|
||||
.get(PROPERTY_DECIMAL)
|
||||
.getPrimitiveValue()
|
||||
.toValue());
|
||||
|
||||
assertEquals(Long.MAX_VALUE, response.getBody().getProperty(PROPERTY_COMP_ALL_PRIM)
|
||||
.getComplexValue()
|
||||
.get(PROPERTY_INT64)
|
||||
.getPrimitiveValue()
|
||||
.toValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readESKEyNavComplexPropertyWithIEEE754CompatibleParameter() {
|
||||
final ODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
|
||||
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_KEY_NAV)
|
||||
.appendKeySegment(1)
|
||||
.appendNavigationSegment(PROPERTY_COMP_ALL_PRIM)
|
||||
.build();
|
||||
ODataPropertyRequest<ClientProperty> request = client.getRetrieveRequestFactory().getPropertyRequest(uri);
|
||||
request.setAccept(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
|
||||
final ODataRetrieveResponse<ClientProperty> response = request.execute();
|
||||
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
|
||||
|
||||
assertEquals(BigDecimal.valueOf(34), response.getBody().getComplexValue()
|
||||
.get(PROPERTY_DECIMAL)
|
||||
.getPrimitiveValue()
|
||||
.toValue());
|
||||
|
||||
assertEquals(Long.MAX_VALUE, response.getBody().getComplexValue()
|
||||
.get(PROPERTY_INT64)
|
||||
.getPrimitiveValue()
|
||||
.toValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void readEdmInt64PropertyWithIEEE754ComaptibleParameter() {
|
||||
final ODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
|
||||
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_KEY_NAV)
|
||||
.appendKeySegment(1)
|
||||
.appendPropertySegment(PROPERTY_COMP_ALL_PRIM)
|
||||
.appendPropertySegment(PROPERTY_INT64)
|
||||
.build();
|
||||
ODataPropertyRequest<ClientProperty> request = client.getRetrieveRequestFactory().getPropertyRequest(uri);
|
||||
request.setAccept(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
|
||||
final ODataRetrieveResponse<ClientProperty> response = request.execute();
|
||||
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
|
||||
|
||||
assertEquals(Long.MAX_VALUE, response.getBody().getPrimitiveValue().toValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void readEdmDecimalPropertyWithIEEE754ComaptibleParameter() {
|
||||
final ODataClient client = ODataClientFactory.getEdmEnabledClient(SERVICE_URI);
|
||||
final URI uri = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment(ES_KEY_NAV)
|
||||
.appendKeySegment(1)
|
||||
.appendPropertySegment(PROPERTY_COMP_ALL_PRIM)
|
||||
.appendPropertySegment(PROPERTY_DECIMAL)
|
||||
.build();
|
||||
ODataPropertyRequest<ClientProperty> request = client.getRetrieveRequestFactory().getPropertyRequest(uri);
|
||||
request.setAccept(CONTENT_TYPE_JSON_IEEE754_COMPATIBLE);
|
||||
final ODataRetrieveResponse<ClientProperty> response = request.execute();
|
||||
assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
|
||||
|
||||
assertEquals(BigDecimal.valueOf(34), response.getBody().getPrimitiveValue().toValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ODataClient getClient() {
|
||||
ODataClient odata = ODataClientFactory.getClient();
|
||||
|
|
|
@ -19,15 +19,20 @@
|
|||
package org.apache.olingo.fit.tecsvc.http;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
|
||||
import org.apache.olingo.client.api.ODataClient;
|
||||
import org.apache.olingo.commons.api.format.ContentType;
|
||||
import org.apache.olingo.commons.api.http.HttpHeader;
|
||||
import org.apache.olingo.commons.api.http.HttpStatusCode;
|
||||
import org.apache.olingo.fit.AbstractBaseTestITCase;
|
||||
import org.apache.olingo.fit.tecsvc.TecSvcConst;
|
||||
import org.apache.olingo.server.core.deserializer.batch.BufferedReaderIncludingLineEndings;
|
||||
import org.junit.Test;
|
||||
|
||||
public class BasicHttpITCase extends AbstractBaseTestITCase {
|
||||
|
@ -116,7 +121,54 @@ public class BasicHttpITCase extends AbstractBaseTestITCase {
|
|||
String v = connection.getHeaderField(HttpHeader.ODATA_VERSION);
|
||||
assertEquals("4.0", v);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testIEEE754ParameterContentNegotiation() throws Exception {
|
||||
final URL url = new URL(SERVICE_URI + "/ESAllPrim(32767)?$format=application/json;IEEE754Compatible=true");
|
||||
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
connection.setRequestProperty(HttpHeader.ACCEPT, "application/json;IEEE754Compatible=false");
|
||||
connection.connect();
|
||||
|
||||
assertEquals(HttpStatusCode.OK.getStatusCode(), connection.getResponseCode());
|
||||
assertEquals(ContentType.create("application/json;IEEE754Compatible=true;odata.metadata=minimal"),
|
||||
ContentType.create(connection.getContentType()));
|
||||
final String content = inputStreamToString(connection.getInputStream());
|
||||
|
||||
assertTrue(content.contains("\"PropertyDecimal\":\"34\""));
|
||||
assertTrue(content.contains("\"PropertyInt64\":\"9223372036854775807\""));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIEEE754ParameterViaAcceptHeader() throws Exception {
|
||||
final URL url = new URL(SERVICE_URI + "/ESAllPrim(32767)");
|
||||
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
connection.setRequestProperty(HttpHeader.ACCEPT, "application/json;IEEE754Compatible=true");
|
||||
connection.connect();
|
||||
|
||||
assertEquals(HttpStatusCode.OK.getStatusCode(), connection.getResponseCode());
|
||||
assertEquals(ContentType.create("application/json;IEEE754Compatible=true;odata.metadata=minimal"),
|
||||
ContentType.create(connection.getContentType()));
|
||||
final String content = inputStreamToString(connection.getInputStream());
|
||||
|
||||
assertTrue(content.contains("\"PropertyDecimal\":\"34\""));
|
||||
assertTrue(content.contains("\"PropertyInt64\":\"9223372036854775807\""));
|
||||
}
|
||||
|
||||
private String inputStreamToString(final InputStream in) throws Exception {
|
||||
final BufferedReaderIncludingLineEndings reader = new BufferedReaderIncludingLineEndings(new InputStreamReader(in));
|
||||
final StringBuffer buffer = new StringBuffer();
|
||||
String current;
|
||||
|
||||
while((current = reader.readLine()) != null) {
|
||||
buffer.append(current);
|
||||
}
|
||||
|
||||
reader.close();
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ODataClient getClient() {
|
||||
return null;
|
||||
|
|
|
@ -41,14 +41,13 @@ import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
|
|||
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
|
||||
import org.apache.olingo.commons.api.edm.EdmProperty;
|
||||
import org.apache.olingo.commons.api.format.ContentType;
|
||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||
import org.apache.olingo.commons.api.http.HttpHeader;
|
||||
import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
|
||||
import org.apache.olingo.commons.core.edm.primitivetype.EdmStream;
|
||||
import org.apache.olingo.server.api.OData;
|
||||
import org.apache.olingo.server.api.ODataApplicationException;
|
||||
import org.apache.olingo.server.api.ODataResponse;
|
||||
import org.apache.olingo.server.api.ODataLibraryException;
|
||||
import org.apache.olingo.server.api.ODataResponse;
|
||||
import org.apache.olingo.server.api.ServiceMetadata;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException.MessageKeys;
|
||||
|
@ -440,7 +439,7 @@ public class DataRequest extends ServiceRequest {
|
|||
handler.deleteReference(DataRequest.this, new URI(id), getETag(), new NoContentResponse(
|
||||
getServiceMetaData(), response));
|
||||
} catch (URISyntaxException e) {
|
||||
throw new DeserializerException("failed to read $id", e, MessageKeys.UNKOWN_CONTENT);
|
||||
throw new DeserializerException("failed to read $id", e, MessageKeys.UNKNOWN_CONTENT);
|
||||
}
|
||||
}
|
||||
} else if (isPUT()) {
|
||||
|
|
|
@ -121,10 +121,10 @@ public class PropertyResponse extends ServiceResponse {
|
|||
throws SerializerException {
|
||||
if(this.collection) {
|
||||
this.response.setContent(
|
||||
this.serializer.primitiveCollection(type, property, this.primitiveOptions).getContent());
|
||||
this.serializer.primitiveCollection(metadata, type, property, this.primitiveOptions).getContent());
|
||||
} else {
|
||||
this.response.setContent(
|
||||
this.serializer.primitive(type, property, this.primitiveOptions).getContent());
|
||||
this.serializer.primitive(metadata, type, property, this.primitiveOptions).getContent());
|
||||
}
|
||||
writeOK(this.responseContentType.toContentTypeString());
|
||||
close();
|
||||
|
|
|
@ -51,7 +51,7 @@ public class ServiceDocumentResponse extends ServiceResponse {
|
|||
public void writeServiceDocument(String serviceRoot)
|
||||
throws ODataLibraryException {
|
||||
assert (!isClosed());
|
||||
this.response.setContent(this.serializer.serviceDocument(metadata.getEdm(), serviceRoot).getContent());
|
||||
this.response.setContent(this.serializer.serviceDocument(metadata, serviceRoot).getContent());
|
||||
writeOK(this.responseContentType.toContentTypeString());
|
||||
close();
|
||||
}
|
||||
|
|
|
@ -51,12 +51,15 @@ import org.apache.olingo.commons.api.edm.EdmProperty;
|
|||
import org.apache.olingo.commons.api.edm.EdmType;
|
||||
import org.apache.olingo.commons.api.edm.EdmTypeDefinition;
|
||||
import org.apache.olingo.commons.api.format.ContentType;
|
||||
import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerException.MessageKeys;
|
||||
import org.apache.olingo.server.api.deserializer.DeserializerResult;
|
||||
import org.apache.olingo.server.api.deserializer.ODataDeserializer;
|
||||
import org.apache.olingo.server.core.deserializer.DeserializerResultImpl;
|
||||
import org.apache.olingo.server.core.deserializer.helper.ExpandTreeBuilder;
|
||||
import org.apache.olingo.server.core.deserializer.helper.ExpandTreeBuilderImpl;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonFactory;
|
||||
import com.fasterxml.jackson.core.JsonParseException;
|
||||
import com.fasterxml.jackson.core.JsonParser;
|
||||
|
@ -72,8 +75,12 @@ public class ODataJsonDeserializer implements ODataDeserializer {
|
|||
|
||||
private static final String ODATA_ANNOTATION_MARKER = "@";
|
||||
private static final String ODATA_CONTROL_INFORMATION_PREFIX = "@odata.";
|
||||
|
||||
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
|
||||
|
@ -666,8 +673,17 @@ public class ODataJsonDeserializer implements ODataDeserializer {
|
|||
EdmPrimitiveType edmPrimitiveType = (EdmPrimitiveType) type;
|
||||
checkJsonTypeBasedOnPrimitiveType(name, edmPrimitiveType.getName(), jsonNode);
|
||||
Class<?> javaClass = getJavaClassForPrimitiveType(mapping, edmPrimitiveType);
|
||||
return edmPrimitiveType.valueOfString(jsonNode.asText(),
|
||||
isNullable, maxLength, precision, scale, isUnicode, javaClass);
|
||||
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",
|
||||
MessageKeys.INVALID_NULL_PROPERTY, name);
|
||||
}
|
||||
}
|
||||
|
||||
return edmPrimitiveType.valueOfString(jsonNodeAsText, isNullable, maxLength, precision, scale, isUnicode,
|
||||
javaClass);
|
||||
} catch (EdmPrimitiveTypeException e) {
|
||||
throw new DeserializerException(
|
||||
"Invalid value: " + jsonNode.asText() + " for property: " + name, e,
|
||||
|
@ -734,20 +750,33 @@ public class ODataJsonDeserializer implements ODataDeserializer {
|
|||
+ " property: " + propertyName, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, propertyName);
|
||||
}
|
||||
break;
|
||||
// Numbers
|
||||
// Numbers (must be numbers)
|
||||
case Int16:
|
||||
case Int32:
|
||||
case Int64:
|
||||
case Byte:
|
||||
case SByte:
|
||||
case Single:
|
||||
case Double:
|
||||
case Decimal:
|
||||
if (!jsonNode.isNumber()) {
|
||||
throw new DeserializerException("Invalid json type: " + jsonNode.getNodeType() + " for edm " + primKind
|
||||
+ " property: " + propertyName, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, propertyName);
|
||||
}
|
||||
break;
|
||||
case Int64:
|
||||
case Decimal:
|
||||
// Numbers (eighter numers or string)
|
||||
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);
|
||||
}
|
||||
} else {
|
||||
if (!jsonNode.isNumber()) {
|
||||
throw new DeserializerException("Invalid json type: " + jsonNode.getNodeType() + " for edm " + primKind
|
||||
+ " property: " + propertyName, DeserializerException.MessageKeys.INVALID_VALUE_FOR_PROPERTY, propertyName);
|
||||
}
|
||||
}
|
||||
break;
|
||||
// Strings
|
||||
case String:
|
||||
case Binary:
|
||||
|
@ -851,4 +880,10 @@ public class ODataJsonDeserializer implements ODataDeserializer {
|
|||
DeserializerException.MessageKeys.UNKNOWN_CONTENT);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isODataIEEE754Compatible(final ContentType contentType) {
|
||||
return contentType.getParameters().containsKey("ieee754compatible")
|
||||
&& Boolean.TRUE.toString().toLowerCase().equals(
|
||||
contentType.getParameters().get("ieee754compatible").toLowerCase());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,6 +31,9 @@ import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
|
|||
|
||||
public class AbstractODataDeserializerTest {
|
||||
protected static final ContentType CONTENT_TYPE_JSON = ODataFormat.JSON.getContentType();
|
||||
protected static final ContentType CONTENT_TYPE_JSON_IEEE754Compatible =
|
||||
ContentType.parse("application/json;odata.format=minimal;IEEE754Compatible=true");
|
||||
|
||||
protected static final Edm edm = OData.newInstance().createServiceMetadata(
|
||||
new EdmTechProvider(), Collections.<EdmxReference> emptyList()).getEdm();
|
||||
|
||||
|
|
|
@ -52,7 +52,6 @@ import org.apache.olingo.server.api.deserializer.DeserializerException;
|
|||
import org.apache.olingo.server.api.deserializer.ODataDeserializer;
|
||||
import org.apache.olingo.server.api.edmx.EdmxReference;
|
||||
import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTest {
|
||||
|
@ -1414,9 +1413,8 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
|
|||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void ieee754Compatible() throws Exception {
|
||||
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON);
|
||||
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
|
||||
String entityString =
|
||||
"{\"PropertyInt16\":32767," +
|
||||
"\"PropertyString\":\"First Resource - positive values\"," +
|
||||
|
@ -1440,7 +1438,86 @@ public class ODataJsonDeserializerEntityTest extends AbstractODataDeserializerTe
|
|||
.entity(stream, edm.getEntityType(new FullQualifiedName("Namespace1_Alias", "ETAllPrim"))).getEntity();
|
||||
|
||||
assertEquals(9223372036854775807L, entity.getProperty("PropertyInt64").asPrimitive());
|
||||
assertEquals(34, entity.getProperty("PropertyDecimal").asPrimitive());
|
||||
assertEquals(BigDecimal.valueOf(34), entity.getProperty("PropertyDecimal").asPrimitive());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ieee754CompatibleNull() throws Exception {
|
||||
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
|
||||
String entityString =
|
||||
"{\"PropertyInt16\":32767," +
|
||||
"\"PropertyString\":\"First Resource - positive values\"," +
|
||||
"\"PropertyBoolean\":null," +
|
||||
"\"PropertyByte\":255," +
|
||||
"\"PropertySByte\":127," +
|
||||
"\"PropertyInt32\":2147483647," +
|
||||
"\"PropertyInt64\":null," +
|
||||
"\"PropertySingle\":1.79E20," +
|
||||
"\"PropertyDouble\":-1.79E19," +
|
||||
"\"PropertyDecimal\":null," +
|
||||
"\"PropertyBinary\":\"ASNFZ4mrze8=\"," +
|
||||
"\"PropertyDate\":null," +
|
||||
"\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\"," +
|
||||
"\"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)
|
||||
public void ieee754CompatibleEmptyString() throws Exception {
|
||||
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
|
||||
String entityString =
|
||||
"{\"PropertyInt16\":32767," +
|
||||
"\"PropertyString\":\"First Resource - positive values\"," +
|
||||
"\"PropertyBoolean\":null," +
|
||||
"\"PropertyByte\":255," +
|
||||
"\"PropertySByte\":127," +
|
||||
"\"PropertyInt32\":2147483647," +
|
||||
"\"PropertyInt64\":\"\"," +
|
||||
"\"PropertySingle\":1.79E20," +
|
||||
"\"PropertyDouble\":-1.79E19," +
|
||||
"\"PropertyDecimal\":\" \"," +
|
||||
"\"PropertyBinary\":\"ASNFZ4mrze8=\"," +
|
||||
"\"PropertyDate\":null," +
|
||||
"\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\"," +
|
||||
"\"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)
|
||||
public void ieee754CompatibleNullAsString() throws Exception {
|
||||
ODataDeserializer deserializer = OData.newInstance().createDeserializer(CONTENT_TYPE_JSON_IEEE754Compatible);
|
||||
String entityString =
|
||||
"{\"PropertyInt16\":32767," +
|
||||
"\"PropertyString\":\"First Resource - positive values\"," +
|
||||
"\"PropertyBoolean\":null," +
|
||||
"\"PropertyByte\":255," +
|
||||
"\"PropertySByte\":127," +
|
||||
"\"PropertyInt32\":2147483647," +
|
||||
"\"PropertyInt64\":\"null\"," +
|
||||
"\"PropertySingle\":1.79E20," +
|
||||
"\"PropertyDouble\":-1.79E19," +
|
||||
"\"PropertyDecimal\":\"null\"," +
|
||||
"\"PropertyBinary\":\"ASNFZ4mrze8=\"," +
|
||||
"\"PropertyDate\":null," +
|
||||
"\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\"," +
|
||||
"\"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 {
|
||||
|
|
|
@ -36,11 +36,7 @@ import org.apache.olingo.commons.api.edm.EdmEntitySet;
|
|||
import org.apache.olingo.commons.api.edm.EdmEntityType;
|
||||
import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
|
||||
import org.apache.olingo.commons.api.edm.EdmProperty;
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
import org.apache.olingo.commons.api.edm.FullQualifiedName;
|
||||
import org.apache.olingo.commons.api.format.ContentType;
|
||||
>>>>>>> [OLINGO-690] ODataSerializer and ODataDeserializer are created by contentType instead of ODataFormat
|
||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||
import org.apache.olingo.server.api.ServiceMetadata;
|
||||
import org.apache.olingo.server.api.edmx.EdmxReference;
|
||||
|
@ -326,6 +322,7 @@ public class ODataJsonSerializerTest {
|
|||
.entityCollection(metadata, edmEntitySet.getEntityType(), entitySet,
|
||||
EntityCollectionSerializerOptions.with()
|
||||
.contextURL(ContextURL.with().entitySet(edmEntitySet).build()).build()).getContent();
|
||||
|
||||
final String resultString = IOUtils.toString(result);
|
||||
final String expectedResult = "{\"value\":["
|
||||
+ "{\"PropertyInt16\":32766,\"PropertyString\":\"Test String1\"},"
|
||||
|
@ -809,6 +806,7 @@ public class ODataJsonSerializerTest {
|
|||
final String resultString = IOUtils.toString(result);
|
||||
final String expectedResult = "{"
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim/$entity\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"PropertyInt16\":32767,"
|
||||
+ "\"PropertyString\":\"First Resource - positive values\","
|
||||
+ "\"PropertyBoolean\":true,"
|
||||
|
@ -841,6 +839,7 @@ public class ODataJsonSerializerTest {
|
|||
final String resultString = IOUtils.toString(result);
|
||||
final String expectedResult = "{"
|
||||
+ "\"@odata.context\":\"http://host/service/$metadata#ESCollAllPrim/$entity\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"PropertyInt16\":1,"
|
||||
+ "\"CollPropertyString\":"
|
||||
+ "[\"Employee1@company.example\",\"Employee2@company.example\",\"Employee3@company.example\"],"
|
||||
|
@ -872,13 +871,14 @@ public class ODataJsonSerializerTest {
|
|||
final Property property = data.readAll(edmEntitySet).getEntities().get(0).getProperty(edmProperty.getName());
|
||||
|
||||
final String resultString = IOUtils.toString(serializerIEEECompatible
|
||||
.primitiveCollection((EdmPrimitiveType) edmProperty.getType(), property,
|
||||
.primitiveCollection(metadata, (EdmPrimitiveType) edmProperty.getType(), property,
|
||||
PrimitiveSerializerOptions.with()
|
||||
.contextURL(ContextURL.with()
|
||||
.entitySet(edmEntitySet).keyPath("1").navOrPropertyPath(edmProperty.getName()).build())
|
||||
.build()).getContent());
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESCollAllPrim(1)/CollPropertyInt64\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"value\":[\"929292929292\",\"333333333333\",\"444444444444\"]}",
|
||||
resultString);
|
||||
}
|
||||
|
@ -890,13 +890,14 @@ public class ODataJsonSerializerTest {
|
|||
final Property property = data.readAll(edmEntitySet).getEntities().get(0).getProperty(edmProperty.getName());
|
||||
|
||||
final String resultString = IOUtils.toString(serializerIEEECompatible
|
||||
.primitiveCollection((EdmPrimitiveType) edmProperty.getType(), property,
|
||||
.primitiveCollection(metadata, (EdmPrimitiveType) edmProperty.getType(), property,
|
||||
PrimitiveSerializerOptions.with()
|
||||
.contextURL(ContextURL.with()
|
||||
.entitySet(edmEntitySet).keyPath("1").navOrPropertyPath(edmProperty.getName()).build())
|
||||
.build()).getContent());
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESCollAllPrim(1)/CollPropertyDecimal\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"value\":[\"12\",\"-2\",\"1234\"]}",
|
||||
resultString);
|
||||
}
|
||||
|
@ -907,13 +908,14 @@ public class ODataJsonSerializerTest {
|
|||
final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("PropertyInt64");
|
||||
final Property property = data.readAll(edmEntitySet).getEntities().get(0).getProperty(edmProperty.getName());
|
||||
final String resultString = IOUtils.toString(serializerIEEECompatible
|
||||
.primitive((EdmPrimitiveType) edmProperty.getType(), property,
|
||||
.primitive(metadata, (EdmPrimitiveType) edmProperty.getType(), property,
|
||||
PrimitiveSerializerOptions.with()
|
||||
.contextURL(ContextURL.with()
|
||||
.entitySet(edmEntitySet).keyPath("32767").navOrPropertyPath(edmProperty.getName()).build())
|
||||
.build()).getContent());
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim(32767)/PropertyInt64\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"value\":\"" + Long.MAX_VALUE + "\"}",
|
||||
resultString);
|
||||
}
|
||||
|
@ -924,13 +926,14 @@ public class ODataJsonSerializerTest {
|
|||
final EdmProperty edmProperty = (EdmProperty) edmEntitySet.getEntityType().getProperty("PropertyDecimal");
|
||||
final Property property = data.readAll(edmEntitySet).getEntities().get(0).getProperty(edmProperty.getName());
|
||||
final String resultString = IOUtils.toString(serializerIEEECompatible
|
||||
.primitive((EdmPrimitiveType) edmProperty.getType(), property,
|
||||
.primitive(metadata, (EdmPrimitiveType) edmProperty.getType(), property,
|
||||
PrimitiveSerializerOptions.with()
|
||||
.contextURL(ContextURL.with()
|
||||
.entitySet(edmEntitySet).keyPath("32767").navOrPropertyPath(edmProperty.getName()).build())
|
||||
.build()).getContent());
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim(32767)/PropertyDecimal\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"value\":\"34\"}",
|
||||
resultString);
|
||||
}
|
||||
|
@ -952,6 +955,7 @@ public class ODataJsonSerializerTest {
|
|||
|
||||
Assert.assertThat(resultString, CoreMatchers.startsWith("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"@odata.count\":\"3\",\"value\":["));
|
||||
Assert.assertThat(resultString, CoreMatchers.endsWith("],"
|
||||
+ "\"@odata.nextLink\":\"/next\"}"));
|
||||
|
@ -981,6 +985,7 @@ public class ODataJsonSerializerTest {
|
|||
|
||||
Assert.assertThat(resultString, CoreMatchers.startsWith("{"
|
||||
+ "\"@odata.context\":\"$metadata#Collection($ref)\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\","
|
||||
+ "\"@odata.count\":\"3\",\"value\":["));
|
||||
Assert.assertThat(resultString, CoreMatchers.endsWith("],"
|
||||
+ "\"@odata.nextLink\":\"/next\"}"));
|
||||
|
|
|
@ -50,7 +50,7 @@ public class ServiceDocumentTest {
|
|||
ODataSerializer serializer = server.createSerializer(ODataFormat.JSON.getContentType());
|
||||
assertNotNull(serializer);
|
||||
|
||||
InputStream result = serializer.serviceDocument(metadata.getEdm(), serviceRoot).getContent();
|
||||
InputStream result = serializer.serviceDocument(metadata, serviceRoot).getContent();
|
||||
assertNotNull(result);
|
||||
final String jsonString = IOUtils.toString(result);
|
||||
|
||||
|
|
Loading…
Reference in New Issue