From ee8bdefa8bb92dcbd9e4bb1d72d809d87a2d1548 Mon Sep 17 00:00:00 2001 From: "luca.frosini" Date: Fri, 22 Sep 2023 19:06:05 +0200 Subject: [PATCH] Added pagination to contexts --- .../contexts/ServerContextCache.java | 4 +- .../contexts/entities/ContextManagement.java | 75 ++++++++++++++++++- .../contexts/ContextManagementTest.java | 73 +++++++++++++++++- src/test/resources/logback-test.xml | 1 + 4 files changed, 147 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/ServerContextCache.java b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/ServerContextCache.java index 2e88b15..09cbaed 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/ServerContextCache.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/ServerContextCache.java @@ -85,7 +85,9 @@ public class ServerContextCache extends ContextCache { @Override public List renew() throws ResourceRegistryException { ContextManagement contextManagement = new ContextManagement(); - String contextsJsonString = contextManagement.allFromServer(false); + contextManagement.setForceOffset(0); + contextManagement.setForceLimit(-1); + String contextsJsonString = contextManagement.allFromDatabase(false); List contexts = null; try { contexts = ElementMapper.unmarshalList(contextsJsonString); diff --git a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java index bbd34bd..a96ad0f 100644 --- a/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java +++ b/src/main/java/org/gcube/informationsystem/resourceregistry/contexts/entities/ContextManagement.java @@ -1,5 +1,6 @@ package org.gcube.informationsystem.resourceregistry.contexts.entities; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -33,6 +34,8 @@ import org.gcube.informationsystem.resourceregistry.contexts.security.SecurityCo import org.gcube.informationsystem.resourceregistry.instances.base.entities.EntityElementManagement; import org.gcube.informationsystem.resourceregistry.queries.operators.QueryConditionalOperator; import org.gcube.informationsystem.resourceregistry.queries.operators.QueryLogicalOperator; +import org.gcube.informationsystem.resourceregistry.requests.RequestUtility; +import org.gcube.informationsystem.resourceregistry.requests.ServerRequestInfo; import org.gcube.informationsystem.resourceregistry.utils.OrientDBUtility; import org.gcube.informationsystem.serialization.ElementMapper; import org.gcube.informationsystem.types.reference.entities.EntityType; @@ -56,6 +59,16 @@ public class ContextManagement extends EntityElementManagement iterable = oDatabaseDocument.browseClass(typeName, polymorphic); for (ODocument vertex : iterable) { + if(++position < offset) { + continue; + } + ContextManagement contextManagement = new ContextManagement(); contextManagement.setForceIncludeMeta(forceIncludeMeta); contextManagement.setForceIncludeAllMeta(forceIncludeAllMeta); @@ -421,6 +455,9 @@ public class ContextManagement extends EntityElementManagement 0 && ++count >= limit) { + break; + } } catch (ResourceRegistryException e) { logger.error("Unable to correctly serialize {}. It will be excluded from results. {}", vertex.toString(), OrientDBUtility.SHOULD_NOT_OCCUR_ERROR_MESSAGE); @@ -433,7 +470,7 @@ public class ContextManagement extends EntityElementManagement contexts = contextCache.getContexts(); - return ElementMapper.marshal(contexts); + + ServerRequestInfo requestInfo = RequestUtility.getRequestInfo().get(); + int limit = requestInfo.getLimit(); + if(forceLimit!=null) { + limit = forceLimit; + } + + int offset = requestInfo.getOffset(); + if(forceOffset!=null) { + offset = forceOffset; + } + + int position = -1; + int count = 0; + + if(offset==0 && limit<=0) { + return ElementMapper.marshal(contexts); + } + + List requestedContexts = new ArrayList<>(); + for (Context c : contexts) { + if(++position < offset) { + continue; + } + + requestedContexts.add(c); + + if(limit > 0 && ++count >= limit) { + break; + } + } + + return ElementMapper.marshal(requestedContexts); } catch (JsonProcessingException | ResourceRegistryException e) { - return allFromServer(polymorphic); + return allFromDatabase(polymorphic); } } diff --git a/src/test/java/org/gcube/informationsystem/resourceregistry/contexts/ContextManagementTest.java b/src/test/java/org/gcube/informationsystem/resourceregistry/contexts/ContextManagementTest.java index 81d1112..2b7f260 100644 --- a/src/test/java/org/gcube/informationsystem/resourceregistry/contexts/ContextManagementTest.java +++ b/src/test/java/org/gcube/informationsystem/resourceregistry/contexts/ContextManagementTest.java @@ -1,8 +1,10 @@ package org.gcube.informationsystem.resourceregistry.contexts; import java.io.IOException; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import org.gcube.com.fasterxml.jackson.core.JsonProcessingException; @@ -441,7 +443,13 @@ public class ContextManagementTest extends ContextTest { } private List getAll() throws Exception { + return getAll(0, -1); + } + + private List getAll(Integer forceOffset, Integer forcelimit) throws Exception { ContextManagement contextManagement = new ContextManagement(); + contextManagement.setForceOffset(forceOffset); + contextManagement.setForceLimit(forcelimit); String allString = contextManagement.all(false); logger.trace(allString); List all = ElementMapper.unmarshalList(Context.class, allString); @@ -494,11 +502,10 @@ public class ContextManagementTest extends ContextTest { delete(context); } - @Test public void testContextCache() throws Exception { List contexts = getAll(); - logger.debug("{}", contexts); + logger.info("{}", contexts); ServerContextCache contextCache = ServerContextCache.getInstance(); Map uuidToContextFullName = contextCache.getUUIDToContextFullNameAssociation(); @@ -537,4 +544,66 @@ public class ContextManagementTest extends ContextTest { logger.debug("{} - {} : {}", uuid, fullName, context); } } + + @Test + public void testLimitOffset() throws Exception { + int limit = 2; + + List contexts = getAll(0, limit); + if(contexts.size()==0) { + return; + } + Assert.assertTrue(contexts.size() <= limit); + + if(contexts.size()< limit) { + return; + } + + Set uuids = new HashSet<>(); + for(Context context : contexts) { + UUID uuid = context.getID(); + uuids.add(uuid); + logger.info("Found {} with UUID {} and name {}", Context.NAME, uuid, context.getName()); + } + + contexts = getAll(limit, limit); + + if(contexts.size()>0) { + Assert.assertTrue(contexts.size() <= limit); + + for(Context context : contexts) { + UUID uuid = context.getID(); + Assert.assertFalse(uuids.contains(uuid)); + uuids.add(uuid); + logger.info("Found {} with UUID {} and name {}", Context.NAME, uuid, context.getName()); + } + + if(contexts.size()=uuids.size()); + + for(Context context : contexts) { + UUID uuid = context.getID(); + logger.info("No limit listing: Got {} with UUID {} and name {}", Context.NAME, uuid, context.getName()); + } + } } diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml index 1bb86ba..7c403cf 100644 --- a/src/test/resources/logback-test.xml +++ b/src/test/resources/logback-test.xml @@ -14,6 +14,7 @@ +