[OLINGO-1573] Add next link support on expanded navigation

All the credit goes to c.schwyter@gmail.com for writing this patch.
This commit is contained in:
Scraylex 2023-02-03 08:43:32 +01:00 committed by mibo
parent 0734e23aab
commit 1cb2907fcc
2 changed files with 51 additions and 2 deletions

View File

@ -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.ComplexValue;
import org.apache.olingo.commons.api.data.ContextURL; import org.apache.olingo.commons.api.data.ContextURL;
import org.apache.olingo.commons.api.data.Entity; 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.EntityIterator;
import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Link;
import org.apache.olingo.commons.api.data.Linked; import org.apache.olingo.commons.api.data.Linked;
@ -654,12 +655,18 @@ public class ODataJsonSerializer extends AbstractODataSerializer {
json.writeStartArray(); json.writeStartArray();
json.writeEndArray(); json.writeEndArray();
} else { } else {
final EntityCollection inlineEntitySet = navigationLink.getInlineEntitySet();
if (innerCount != null && innerCount.getValue()) { if (innerCount != null && innerCount.getValue()) {
writeInlineCount(property.getName(), navigationLink.getInlineEntitySet().getCount(), json); writeInlineCount(property.getName(), inlineEntitySet.getCount(), json);
} }
json.writeFieldName(property.getName()); json.writeFieldName(property.getName());
writeEntitySet(metadata, property.getType(), navigationLink.getInlineEntitySet(), innerExpand, toDepth, writeEntitySet(metadata, property.getType(), inlineEntitySet, innerExpand, toDepth,
innerSelect, writeOnlyRef, ancestors, name, json); innerSelect, writeOnlyRef, ancestors, name, json);
final URI nextLink = inlineEntitySet.getNext();
if (nextLink != null) {
json.writeStringField(navigationLink.getTitle() + constants.getNextLink(), nextLink.toASCIIString());
}
} }
} }
} else { } else {

View File

@ -25,9 +25,11 @@ import java.io.InputStream;
import java.net.URI; import java.net.URI;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel; import java.nio.channels.WritableByteChannel;
import java.nio.charset.Charset;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Iterator; 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.data.DataProvider;
import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
import org.hamcrest.CoreMatchers; import org.hamcrest.CoreMatchers;
import org.hamcrest.Matcher;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
@ -1700,6 +1703,45 @@ public class ODataJsonSerializerTest {
resultString); 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<ExpandItem> 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<String> stringMatcher = CoreMatchers.endsWith("}],"
+ "\"NavPropertyETAllPrimMany@nextLink\":\"/next\"}");
final boolean matchResult = stringMatcher.matches(resultString);
Assert.assertTrue(matchResult);
}
@Test @Test
public void primitiveProperty() throws Exception { public void primitiveProperty() throws Exception {
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim"); final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");