diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java index 0cf307f42..c5ac9f3f3 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java @@ -485,6 +485,18 @@ public class ODataJsonSerializer extends AbstractODataSerializer { protected void writeNavigationProperties(final ServiceMetadata metadata, final EdmStructuredType type, final Linked linked, final ExpandOption expand, final Integer toDepth, final Set ancestors, final JsonGenerator json) throws SerializerException, IOException { + if (isODataMetadataFull) { + for (final String propertyName : type.getNavigationPropertyNames()) { + final Link navigationLink = linked.getNavigationLink(propertyName); + if (navigationLink != null) { + json.writeStringField(propertyName + Constants.JSON_NAVIGATION_LINK, navigationLink.getHref()); + } + final Link associationLink = linked.getAssociationLink(propertyName); + if (associationLink != null) { + json.writeStringField(propertyName + Constants.JSON_ASSOCIATION_LINK, associationLink.getHref()); + } + } + } if ((toDepth != null && toDepth > 1) || (toDepth == null && ExpandSelectHelper.hasExpand(expand))) { final ExpandItem expandAll = ExpandSelectHelper.getExpandAll(expand); for (final String propertyName : type.getNavigationPropertyNames()) { @@ -543,17 +555,6 @@ public class ODataJsonSerializer extends AbstractODataSerializer { json); } } - } else if (isODataMetadataFull) { - for (final String propertyName : type.getNavigationPropertyNames()) { - final Link navigationLink = linked.getNavigationLink(propertyName); - if (navigationLink != null) { - json.writeStringField(propertyName + Constants.JSON_NAVIGATION_LINK, navigationLink.getHref()); - } - final Link associationLink = linked.getAssociationLink(propertyName); - if (associationLink != null) { - json.writeStringField(propertyName + Constants.JSON_ASSOCIATION_LINK, associationLink.getHref()); - } - } } } diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java index cf29d5f3b..9796aef90 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializerTest.java @@ -254,6 +254,100 @@ public class ODataJsonSerializerTest { Assert.assertTrue(resultString.startsWith(expected)); } + @Test + public void entitySetMetadataFullWithExpand() throws Exception { + final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim"); + final EntityCollection entityCol = data.readAll(edmEntitySet); + final ExpandOption expand = ExpandSelectMock.mockExpandOption(Collections.singletonList( + ExpandSelectMock.mockExpandItem(edmEntitySet, "NavPropertyETTwoPrimOne"))); + InputStream result = serializerFullMetadata.entityCollection(metadata, edmEntitySet.getEntityType(), entityCol, + EntityCollectionSerializerOptions.with() + .contextURL(ContextURL.with().entitySet(edmEntitySet).build()) + .expand(expand) + .build()).getContent(); + final String resultString = IOUtils.toString(result); + final String expected = "{" + + "\"@odata.context\":\"$metadata#ESAllPrim\"," + + "\"@odata.metadataEtag\":\"W/\\\"metadataETag\\\"\"," + + "\"#olingo.odata.test1.BAESAllPrimRTETAllPrim\":{" + + "\"title\":\"olingo.odata.test1.BAESAllPrimRTETAllPrim\"," + + "\"target\":\"ESAllPrim/olingo.odata.test1.BAESAllPrimRTETAllPrim\"" + + "}," + + "\"#olingo.odata.test1.BAESAllPrimRT\":{" + + "\"title\":\"olingo.odata.test1.BAESAllPrimRT\"," + + "\"target\":\"ESAllPrim/olingo.odata.test1.BAESAllPrimRT\"" + + "}," + + "\"#olingo.odata.test1.BFNESAllPrimRTCTAllPrim\":{" + + "\"title\":\"olingo.odata.test1.BFNESAllPrimRTCTAllPrim\"," + + "\"target\":\"ESAllPrim/olingo.odata.test1.BFNESAllPrimRTCTAllPrim\"" + + "}," + + "\"value\":[" + + "{" + + "\"@odata.type\":\"#olingo.odata.test1.ETAllPrim\"," + + "\"@odata.id\":\"ESAllPrim(32767)\"," + + "\"PropertyInt16@odata.type\":\"#Int16\"," + + "\"PropertyInt16\":32767," + + "\"PropertyString\":\"First Resource - positive values\"," + + "\"PropertyBoolean\":true," + + "\"PropertyByte@odata.type\":\"#Byte\"," + + "\"PropertyByte\":255," + + "\"PropertySByte@odata.type\":\"#SByte\"," + + "\"PropertySByte\":127," + + "\"PropertyInt32@odata.type\":\"#Int32\"," + + "\"PropertyInt32\":2147483647," + + "\"PropertyInt64@odata.type\":\"#Int64\"," + + "\"PropertyInt64\":9223372036854775807," + + "\"PropertySingle@odata.type\":\"#Single\"," + + "\"PropertySingle\":1.79E20," + + "\"PropertyDouble\":-1.79E19," + + "\"PropertyDecimal@odata.type\":\"#Decimal\"," + + "\"PropertyDecimal\":34," + + "\"PropertyBinary@odata.type\":\"#Binary\"," + + "\"PropertyBinary\":\"ASNFZ4mrze8=\"," + + "\"PropertyDate@odata.type\":\"#Date\"," + + "\"PropertyDate\":\"2012-12-03\"," + + "\"PropertyDateTimeOffset@odata.type\":\"#DateTimeOffset\"," + + "\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\"," + + "\"PropertyDuration@odata.type\":\"#Duration\"," + + "\"PropertyDuration\":\"PT6S\"," + + "\"PropertyGuid@odata.type\":\"#Guid\"," + + "\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\"," + + "\"PropertyTimeOfDay@odata.type\":\"#TimeOfDay\"," + + "\"PropertyTimeOfDay\":\"03:26:05\"," + + "\"NavPropertyETTwoPrimOne@odata.navigationLink\":\"ESTwoPrim(32767)\"," + + "\"NavPropertyETTwoPrimMany@odata.navigationLink\":\"ESAllPrim(32767)/NavPropertyETTwoPrimMany\"," + + "\"NavPropertyETTwoPrimOne\":{" + + "\"@odata.type\":\"#olingo.odata.test1.ETTwoPrim\"," + + "\"@odata.id\":\"ESTwoPrim(32767)\"," + + "\"PropertyInt16@odata.type\":\"#Int16\"," + + "\"PropertyInt16\":32767," + + "\"PropertyString\":\"Test String4\"," + + "\"NavPropertyETAllPrimOne@odata.navigationLink\":\"ESAllPrim(32767)\"," + + "\"#olingo.odata.test1.BAETTwoPrimRTString\":{" + + "\"title\":\"olingo.odata.test1.BAETTwoPrimRTString\"," + + "\"target\":\"ESTwoPrim(32767)/olingo.odata.test1.BAETTwoPrimRTString\"" + + "}," + + "\"#olingo.odata.test1.BAETTwoPrimRTCollString\":{" + + "\"title\":\"olingo.odata.test1.BAETTwoPrimRTCollString\"," + + "\"target\":\"ESTwoPrim(32767)/olingo.odata.test1.BAETTwoPrimRTCollString\"" + + "}," + + "\"#olingo.odata.test1.BAETTwoPrimRTCTAllPrim\":{" + + "\"title\":\"olingo.odata.test1.BAETTwoPrimRTCTAllPrim\"," + + "\"target\":\"ESTwoPrim(32767)/olingo.odata.test1.BAETTwoPrimRTCTAllPrim\"" + + "}," + + "\"#olingo.odata.test1.BAETTwoPrimRTCollCTAllPrim\":{" + + "\"title\":\"olingo.odata.test1.BAETTwoPrimRTCollCTAllPrim\"," + + "\"target\":\"ESTwoPrim(32767)/olingo.odata.test1.BAETTwoPrimRTCollCTAllPrim\"" + + "}" + + "}," + + "\"#olingo.odata.test1.BAETAllPrimRT\":{" + + "\"title\":\"olingo.odata.test1.BAETAllPrimRT\"," + + "\"target\":\"ESAllPrim(32767)/olingo.odata.test1.BAETAllPrimRT\"" + + "}},"; + + Assert.assertTrue(resultString.startsWith(expected)); + } + @Test public void entityAllPrimAllNull() throws Exception { final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");