[OLINGO-1237]Serialization changes for odata.metadata=minimal
This commit is contained in:
parent
48f93fd871
commit
75cc7197e3
|
@ -66,10 +66,12 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer {
|
|||
|
||||
protected final boolean isIEEE754Compatible;
|
||||
protected final boolean isODataMetadataNone;
|
||||
protected final boolean isODataMetadataFull;
|
||||
|
||||
public EdmAssistedJsonSerializer(final ContentType contentType) {
|
||||
this.isIEEE754Compatible = ContentTypeHelper.isODataIEEE754Compatible(contentType);
|
||||
this.isODataMetadataNone = ContentTypeHelper.isODataMetadataNone(contentType);
|
||||
this.isODataMetadataFull = ContentTypeHelper.isODataMetadataFull(contentType);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -207,15 +209,17 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer {
|
|||
if (eTag != null) {
|
||||
json.writeStringField(Constants.JSON_ETAG, eTag);
|
||||
}
|
||||
if (type != null) {
|
||||
json.writeStringField(Constants.JSON_TYPE, type);
|
||||
}
|
||||
if (id == null) {
|
||||
if (writeNullId) {
|
||||
json.writeNullField(Constants.JSON_ID);
|
||||
if(isODataMetadataFull){
|
||||
if (type != null) {
|
||||
json.writeStringField(Constants.JSON_TYPE, type);
|
||||
}
|
||||
if (id == null) {
|
||||
if (writeNullId) {
|
||||
json.writeNullField(Constants.JSON_ID);
|
||||
}
|
||||
} else {
|
||||
json.writeStringField(Constants.JSON_ID, id.toASCIIString());
|
||||
}
|
||||
} else {
|
||||
json.writeStringField(Constants.JSON_ID, id.toASCIIString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -326,7 +330,7 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer {
|
|||
final ComplexValue value) throws IOException, SerializerException {
|
||||
json.writeStartObject();
|
||||
|
||||
if (typeName != null && !isODataMetadataNone) {
|
||||
if (typeName != null && isODataMetadataFull) {
|
||||
json.writeStringField(Constants.JSON_TYPE, typeName);
|
||||
}
|
||||
|
||||
|
@ -362,7 +366,7 @@ public class EdmAssistedJsonSerializer implements EdmAssistedSerializer {
|
|||
protected void valuable(JsonGenerator json, final Valuable valuable, final String name, final EdmType type,
|
||||
final EdmProperty edmProperty) throws IOException, SerializerException {
|
||||
|
||||
if (!isODataMetadataNone
|
||||
if (isODataMetadataFull
|
||||
&& !(valuable instanceof Annotation) && !valuable.isComplex()) {
|
||||
|
||||
String typeName = valuable.getType();
|
||||
|
|
|
@ -56,9 +56,13 @@ public class EdmAssistedJsonSerializerTest {
|
|||
new EdmTechProvider(), Collections.<EdmxReference> emptyList(), null);
|
||||
private static final EdmEntityContainer entityContainer = metadata.getEdm().getEntityContainer();
|
||||
private final EdmAssistedSerializer serializer;
|
||||
private final EdmAssistedSerializer serializerMin;
|
||||
private final EdmAssistedSerializer serializerNone;
|
||||
|
||||
public EdmAssistedJsonSerializerTest() throws SerializerException {
|
||||
serializer = oData.createEdmAssistedSerializer(ContentType.JSON);
|
||||
serializer = oData.createEdmAssistedSerializer(ContentType.JSON_FULL_METADATA);
|
||||
serializerMin = oData.createEdmAssistedSerializer(ContentType.JSON);
|
||||
serializerNone = oData.createEdmAssistedSerializer(ContentType.JSON_NO_METADATA);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -136,7 +140,7 @@ public class EdmAssistedJsonSerializerTest {
|
|||
+ "\"Property3@odata.type\":\"#Byte\",\"Property3\":20}]}",
|
||||
serialize(
|
||||
oData.createEdmAssistedSerializer(
|
||||
ContentType.create(ContentType.JSON, ContentType.PARAMETER_IEEE754_COMPATIBLE, "true")),
|
||||
ContentType.create(ContentType.JSON_FULL_METADATA, ContentType.PARAMETER_IEEE754_COMPATIBLE, "true")),
|
||||
metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
|
@ -373,4 +377,292 @@ public class EdmAssistedJsonSerializerTest {
|
|||
EdmAssistedSerializerOptions.with().contextURL(contextURLBuilder.build()).build())
|
||||
.getContent());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void entityCollectionSimpleMetadataMin() throws Exception {
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1.25F));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1)\","
|
||||
+ "\"value\":[{\"Property1\":1.25}]}",
|
||||
serialize(serializerMin, metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionSimpleMetadataNone() throws Exception {
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1.25F));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
Assert.assertEquals("{\"value\":[{\"Property1\":1.25}]}",
|
||||
serialize(serializerNone, metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionMetadataMin() throws Exception {
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property0", ValueType.PRIMITIVE, null))
|
||||
.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1));
|
||||
Calendar date = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
|
||||
date.clear();
|
||||
date.set(2000, 1, 29);
|
||||
entity.addProperty(new Property("Edm.Date", "Property2", ValueType.PRIMITIVE, date))
|
||||
.addProperty(new Property("Edm.DateTimeOffset", "Property3", ValueType.PRIMITIVE, date))
|
||||
.addProperty(new Property(null, "Property4", ValueType.COLLECTION_PRIMITIVE,
|
||||
Arrays.asList(true, false, null)));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
entityCollection.setCount(2);
|
||||
entityCollection.setNext(URI.create("nextLink"));
|
||||
Assert.assertEquals(
|
||||
"{\"@odata.context\":\"$metadata#EntitySet(Property0,Property1,Property2,Property3,Property4)\","
|
||||
+ "\"@odata.count\":2,"
|
||||
+ "\"value\":[{"
|
||||
+ "\"Property0\":null,"
|
||||
+ "\"Property1\":1,"
|
||||
+ "\"Property2\":\"2000-02-29\","
|
||||
+ "\"Property3\":\"2000-02-29T00:00:00Z\","
|
||||
+ "\"Property4\":[true,false,null]}],"
|
||||
+ "\"@odata.nextLink\":\"nextLink\"}",
|
||||
serialize(serializerMin, metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionMetadataNone() throws Exception {
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property0", ValueType.PRIMITIVE, null))
|
||||
.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1));
|
||||
Calendar date = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
|
||||
date.clear();
|
||||
date.set(2000, 1, 29);
|
||||
entity.addProperty(new Property("Edm.Date", "Property2", ValueType.PRIMITIVE, date))
|
||||
.addProperty(new Property("Edm.DateTimeOffset", "Property3", ValueType.PRIMITIVE, date))
|
||||
.addProperty(new Property(null, "Property4", ValueType.COLLECTION_PRIMITIVE,
|
||||
Arrays.asList(true, false, null)));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
entityCollection.setCount(2);
|
||||
entityCollection.setNext(URI.create("nextLink"));
|
||||
Assert.assertEquals(
|
||||
"{"
|
||||
+ "\"@odata.count\":2,"
|
||||
+ "\"value\":[{"
|
||||
+ "\"Property0\":null,"
|
||||
+ "\"Property1\":1,"
|
||||
+ "\"Property2\":\"2000-02-29\","
|
||||
+ "\"Property3\":\"2000-02-29T00:00:00Z\","
|
||||
+ "\"Property4\":[true,false,null]}],"
|
||||
+ "\"@odata.nextLink\":\"nextLink\"}",
|
||||
serialize(serializerNone, metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionWithComplexPropertyMetadataMin() throws Exception {
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1L));
|
||||
ComplexValue complexValue = new ComplexValue();
|
||||
complexValue.getValue().add(new Property(null, "Inner1", ValueType.PRIMITIVE,
|
||||
BigDecimal.TEN.scaleByPowerOfTen(-5)));
|
||||
Calendar time = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
|
||||
time.clear();
|
||||
time.set(Calendar.HOUR_OF_DAY, 13);
|
||||
time.set(Calendar.SECOND, 59);
|
||||
time.set(Calendar.MILLISECOND, 999);
|
||||
complexValue.getValue().add(new Property("Edm.TimeOfDay", "Inner2", ValueType.PRIMITIVE, time));
|
||||
entity.addProperty(new Property("Namespace.ComplexType", "Property2", ValueType.COMPLEX, complexValue));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1,Property2)\","
|
||||
+ "\"value\":[{"
|
||||
+ "\"Property1\":1,"
|
||||
+ "\"Property2\":{"
|
||||
+ "\"Inner1\":0.00010,"
|
||||
+ "\"Inner2\":\"13:00:59.999\"}}]}",
|
||||
serialize(serializerMin, metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionWithComplexPropertyMetadataNone() throws Exception {
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, 1L));
|
||||
ComplexValue complexValue = new ComplexValue();
|
||||
complexValue.getValue().add(new Property(null, "Inner1", ValueType.PRIMITIVE,
|
||||
BigDecimal.TEN.scaleByPowerOfTen(-5)));
|
||||
Calendar time = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
|
||||
time.clear();
|
||||
time.set(Calendar.HOUR_OF_DAY, 13);
|
||||
time.set(Calendar.SECOND, 59);
|
||||
time.set(Calendar.MILLISECOND, 999);
|
||||
complexValue.getValue().add(new Property("Edm.TimeOfDay", "Inner2", ValueType.PRIMITIVE, time));
|
||||
entity.addProperty(new Property("Namespace.ComplexType", "Property2", ValueType.COMPLEX, complexValue));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
Assert.assertEquals("{"
|
||||
+ "\"value\":[{"
|
||||
+ "\"Property1\":1,"
|
||||
+ "\"Property2\":{"
|
||||
+ "\"Inner1\":0.00010,"
|
||||
+ "\"Inner2\":\"13:00:59.999\"}}]}",
|
||||
serialize(serializerNone, metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionWithComplexCollectionMin() throws Exception {
|
||||
final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp");
|
||||
ComplexValue complexValue1 = new ComplexValue();
|
||||
complexValue1.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 1));
|
||||
complexValue1.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "one"));
|
||||
ComplexValue complexValue2 = new ComplexValue();
|
||||
complexValue2.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 2));
|
||||
complexValue2.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "two"));
|
||||
ComplexValue complexValue3 = new ComplexValue();
|
||||
complexValue3.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 3));
|
||||
complexValue3.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "three"));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(new Entity()
|
||||
.addProperty(new Property(null, "CollPropertyComp", ValueType.COLLECTION_COMPLEX,
|
||||
Arrays.asList(complexValue1, complexValue2, complexValue3))));
|
||||
Assert.assertEquals("{\"@odata.context\":\"$metadata#ESMixPrimCollComp(CollPropertyComp)\","
|
||||
+ "\"value\":[{"
|
||||
+ "\"CollPropertyComp\":["
|
||||
+ "{\"PropertyInt16\":1,\"PropertyString\":\"one\"},"
|
||||
+ "{\"PropertyInt16\":2,\"PropertyString\":\"two\"},"
|
||||
+ "{\"PropertyInt16\":3,\"PropertyString\":\"three\"}]}]}",
|
||||
serialize(serializerMin, metadata, entitySet, entityCollection, "CollPropertyComp"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionWithComplexCollectionNone() throws Exception {
|
||||
final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp");
|
||||
ComplexValue complexValue1 = new ComplexValue();
|
||||
complexValue1.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 1));
|
||||
complexValue1.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "one"));
|
||||
ComplexValue complexValue2 = new ComplexValue();
|
||||
complexValue2.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 2));
|
||||
complexValue2.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "two"));
|
||||
ComplexValue complexValue3 = new ComplexValue();
|
||||
complexValue3.getValue().add(new Property(null, "PropertyInt16", ValueType.PRIMITIVE, 3));
|
||||
complexValue3.getValue().add(new Property(null, "PropertyString", ValueType.PRIMITIVE, "three"));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(new Entity()
|
||||
.addProperty(new Property(null, "CollPropertyComp", ValueType.COLLECTION_COMPLEX,
|
||||
Arrays.asList(complexValue1, complexValue2, complexValue3))));
|
||||
Assert.assertEquals("{"
|
||||
+ "\"value\":[{"
|
||||
+ "\"CollPropertyComp\":["
|
||||
+ "{\"PropertyInt16\":1,\"PropertyString\":\"one\"},"
|
||||
+ "{\"PropertyInt16\":2,\"PropertyString\":\"two\"},"
|
||||
+ "{\"PropertyInt16\":3,\"PropertyString\":\"three\"}]}]}",
|
||||
serialize(serializerNone, metadata, entitySet, entityCollection, "CollPropertyComp"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionWithEmptyCollectionMin() throws Exception {
|
||||
final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp");
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(new Entity()
|
||||
.addProperty(new Property(null, "CollPropertyString", ValueType.COLLECTION_PRIMITIVE,
|
||||
Collections.emptyList())));
|
||||
Assert.assertEquals(
|
||||
"{\"@odata.context\":\"$metadata#ESMixPrimCollComp(CollPropertyString)\","
|
||||
+ "\"value\":[{\"CollPropertyString\":[]}]}",
|
||||
serialize(serializerMin, metadata, entitySet, entityCollection, "CollPropertyString"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityCollectionWithEmptyCollectionNone() throws Exception {
|
||||
final EdmEntitySet entitySet = entityContainer.getEntitySet("ESMixPrimCollComp");
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(new Entity()
|
||||
.addProperty(new Property(null, "CollPropertyString", ValueType.COLLECTION_PRIMITIVE,
|
||||
Collections.emptyList())));
|
||||
Assert.assertEquals(
|
||||
"{"
|
||||
+ "\"value\":[{\"CollPropertyString\":[]}]}",
|
||||
serialize(serializerNone, metadata, entitySet, entityCollection, "CollPropertyString"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void expandMetadataMin() throws Exception {
|
||||
final Entity relatedEntity1 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 1.5));
|
||||
final Entity relatedEntity2 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 2.75));
|
||||
EntityCollection target = new EntityCollection();
|
||||
target.getEntities().add(relatedEntity1);
|
||||
target.getEntities().add(relatedEntity2);
|
||||
Link link = new Link();
|
||||
link.setTitle("NavigationProperty");
|
||||
link.setInlineEntitySet(target);
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, (short) 1));
|
||||
entity.getNavigationLinks().add(link);
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1,NavigationProperty(Related1))\","
|
||||
+ "\"value\":[{"
|
||||
+ "\"Property1\":1,"
|
||||
+ "\"NavigationProperty\":["
|
||||
+ "{\"Related1\":1.5},"
|
||||
+ "{\"Related1\":2.75}]}]}",
|
||||
serialize(serializerMin, metadata, null, entityCollection, "Property1,NavigationProperty(Related1)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void expandMetadataNone() throws Exception {
|
||||
final Entity relatedEntity1 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 1.5));
|
||||
final Entity relatedEntity2 = new Entity().addProperty(new Property(null, "Related1", ValueType.PRIMITIVE, 2.75));
|
||||
EntityCollection target = new EntityCollection();
|
||||
target.getEntities().add(relatedEntity1);
|
||||
target.getEntities().add(relatedEntity2);
|
||||
Link link = new Link();
|
||||
link.setTitle("NavigationProperty");
|
||||
link.setInlineEntitySet(target);
|
||||
Entity entity = new Entity();
|
||||
entity.setId(null);
|
||||
entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE, (short) 1));
|
||||
entity.getNavigationLinks().add(link);
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
Assert.assertEquals("{"
|
||||
+ "\"value\":[{"
|
||||
+ "\"Property1\":1,"
|
||||
+ "\"NavigationProperty\":["
|
||||
+ "{\"Related1\":1.5},"
|
||||
+ "{\"Related1\":2.75}]}]}",
|
||||
serialize(serializerNone, metadata, null, entityCollection, "Property1,NavigationProperty(Related1)"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void metadataMin() throws Exception {
|
||||
final ServiceMetadata metadata = oData.createServiceMetadata(null, Collections.<EdmxReference> emptyList(),
|
||||
new MetadataETagSupport("W/\"42\""));
|
||||
Entity entity = new Entity();
|
||||
entity.setType("Namespace.EntityType");
|
||||
entity.setId(URI.create("ID"));
|
||||
entity.setETag("W/\"1000\"");
|
||||
Link link = new Link();
|
||||
link.setHref("editLink");
|
||||
entity.setEditLink(link);
|
||||
entity.setMediaContentSource(URI.create("media"));
|
||||
entity.addProperty(new Property(null, "Property1", ValueType.PRIMITIVE,
|
||||
UUID.fromString("12345678-ABCD-1234-CDEF-123456789012")));
|
||||
EntityCollection entityCollection = new EntityCollection();
|
||||
entityCollection.getEntities().add(entity);
|
||||
Assert.assertEquals("{\"@odata.context\":\"$metadata#EntitySet(Property1)\","
|
||||
+ "\"@odata.metadataEtag\":\"W/\\\"42\\\"\",\"value\":[{"
|
||||
+ "\"@odata.etag\":\"W/\\\"1000\\\"\","
|
||||
+ "\"Property1\":\"12345678-abcd-1234-cdef-123456789012\","
|
||||
+ "\"@odata.editLink\":\"editLink\","
|
||||
+ "\"@odata.mediaReadLink\":\"editLink/$value\"}]}",
|
||||
serialize(serializerMin, metadata, null, entityCollection, null));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue