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 ec75da089..aed0bb881 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 @@ -37,6 +37,7 @@ import org.apache.olingo.commons.api.data.AbstractEntityCollection; import org.apache.olingo.commons.api.data.ComplexValue; import org.apache.olingo.commons.api.data.ContextURL; import org.apache.olingo.commons.api.data.Entity; +import org.apache.olingo.commons.api.data.EntityCollection; import org.apache.olingo.commons.api.data.EntityIterator; import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Linked; @@ -654,12 +655,18 @@ public class ODataJsonSerializer extends AbstractODataSerializer { json.writeStartArray(); json.writeEndArray(); } else { + final EntityCollection inlineEntitySet = navigationLink.getInlineEntitySet(); if (innerCount != null && innerCount.getValue()) { - writeInlineCount(property.getName(), navigationLink.getInlineEntitySet().getCount(), json); + writeInlineCount(property.getName(), inlineEntitySet.getCount(), json); } json.writeFieldName(property.getName()); - writeEntitySet(metadata, property.getType(), navigationLink.getInlineEntitySet(), innerExpand, toDepth, + writeEntitySet(metadata, property.getType(), inlineEntitySet, innerExpand, toDepth, innerSelect, writeOnlyRef, ancestors, name, json); + + final URI nextLink = inlineEntitySet.getNext(); + if (nextLink != null) { + json.writeStringField(navigationLink.getTitle() + constants.getNextLink(), nextLink.toASCIIString()); + } } } } else { 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 5230e6020..b156bb964 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 @@ -25,9 +25,11 @@ import java.io.InputStream; import java.net.URI; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; +import java.nio.charset.Charset; import java.time.Instant; import java.time.LocalDate; import java.time.LocalTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; @@ -92,6 +94,7 @@ import org.apache.olingo.server.tecsvc.MetadataETagSupport; import org.apache.olingo.server.tecsvc.data.DataProvider; import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; import org.hamcrest.CoreMatchers; +import org.hamcrest.Matcher; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; @@ -1700,6 +1703,45 @@ public class ODataJsonSerializerTest { resultString); } + @Test + public void expandWithNextLink() throws Exception { + + final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESTwoPrim"); + final EdmEntityType entityType = edmEntitySet.getEntityType(); + final EdmEntitySet innerEntitySet = entityContainer.getEntitySet("ESAllPrim"); + final Entity entity = data.readAll(edmEntitySet).getEntities().get(0); + final EntityCollection innerEntities = data.readAll(innerEntitySet); + innerEntities.setNext(URI.create("/next")); + final ExpandItem expandItem = ExpandSelectMock.mockExpandItem(edmEntitySet, "NavPropertyETAllPrimMany"); + final List expandItems = new ArrayList<>(); + expandItems.add(expandItem); + + final ExpandOption expandOption = ExpandSelectMock.mockExpandOption(expandItems); + final Link link = new Link(); + link.setTitle("NavPropertyETAllPrimMany"); + link.setInlineEntitySet(innerEntities); + entity.getNavigationLinks().add(link); + + + final ContextURL build = ContextURL.with().entitySet(edmEntitySet) + .selectList(helper.buildContextURLSelectList(entityType, expandOption, null)) + .suffix(Suffix.ENTITY).build(); + final String resultString = IOUtils.toString(serializerV401 + .entity(metadata, entityType, entity, + EntitySerializerOptions.with() + .contextURL(build) + .expand(expandOption) + .build()).getContent(), Charset.defaultCharset()); + + + final Matcher stringMatcher = CoreMatchers.endsWith("}]," + + "\"NavPropertyETAllPrimMany@nextLink\":\"/next\"}"); + + final boolean matchResult = stringMatcher.matches(resultString); + Assert.assertTrue(matchResult); + + } + @Test public void primitiveProperty() throws Exception { final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");