diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANGroup.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANGroup.java index ae2f50a..9144968 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANGroup.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANGroup.java @@ -98,4 +98,11 @@ public class CKANGroup extends CKAN { } return groups; } + + public int count() { + list(100000, 0); + ArrayNode arrayNode = (ArrayNode) result; + return arrayNode.size(); + } + } diff --git a/src/main/java/org/gcube/gcat/persistence/ckan/CKANOrganization.java b/src/main/java/org/gcube/gcat/persistence/ckan/CKANOrganization.java index 5b7fa58..dd1907f 100644 --- a/src/main/java/org/gcube/gcat/persistence/ckan/CKANOrganization.java +++ b/src/main/java/org/gcube/gcat/persistence/ckan/CKANOrganization.java @@ -1,12 +1,12 @@ package org.gcube.gcat.persistence.ckan; +import org.gcube.com.fasterxml.jackson.databind.node.ArrayNode; +import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.gcat.utils.ContextUtility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.gcube.com.fasterxml.jackson.databind.node.ObjectNode; - /** * @author Luca Frosini (ISTI - CNR) */ @@ -76,4 +76,11 @@ public class CKANOrganization extends CKAN { ScopeBean scopeBean = new ScopeBean(context); return scopeBean.name().toLowerCase(); } + + public int count() { + list(100000, 0); + ArrayNode arrayNode = (ArrayNode) result; + return arrayNode.size(); + } + } diff --git a/src/main/java/org/gcube/gcat/profile/ISProfile.java b/src/main/java/org/gcube/gcat/profile/ISProfile.java index 8b35609..591544b 100644 --- a/src/main/java/org/gcube/gcat/profile/ISProfile.java +++ b/src/main/java/org/gcube/gcat/profile/ISProfile.java @@ -48,6 +48,14 @@ public class ISProfile { return mapper; } + public int count() { + try { + return (new MetadataUtility()).getProfilesNames().size(); + }catch(Exception e) { + throw new InternalServerErrorException(e); + } + } + public ArrayNode list() { ArrayNode arrayNode = mapper.createArrayNode(); diff --git a/src/main/java/org/gcube/gcat/rest/BaseREST.java b/src/main/java/org/gcube/gcat/rest/BaseREST.java index 1830510..91bc7ac 100644 --- a/src/main/java/org/gcube/gcat/rest/BaseREST.java +++ b/src/main/java/org/gcube/gcat/rest/BaseREST.java @@ -5,6 +5,7 @@ import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.Response.ResponseBuilder; import org.gcube.common.authorization.library.provider.CalledMethodProvider; +import org.gcube.gcat.api.GCatConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,4 +28,14 @@ public class BaseREST { String.format("%s/%s", uriInfo.getAbsolutePath().toString(), id)); } + protected String createCountJson(int count) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("{\""); + stringBuilder.append(GCatConstants.COUNT_KEY); + stringBuilder.append("\":"); + stringBuilder.append(count); + stringBuilder.append("}"); + return stringBuilder.toString(); + } + } diff --git a/src/main/java/org/gcube/gcat/rest/Group.java b/src/main/java/org/gcube/gcat/rest/Group.java index e9e8b03..a6ef71b 100644 --- a/src/main/java/org/gcube/gcat/rest/Group.java +++ b/src/main/java/org/gcube/gcat/rest/Group.java @@ -11,6 +11,7 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; +import javax.xml.ws.WebServiceException; import org.gcube.gcat.ResourceInitializer; import org.gcube.gcat.annotation.PATCH; @@ -30,8 +31,31 @@ public class Group extends REST implements org.gcube.gcat.api.interfa super(GROUPS, GROUP_ID_PARAMETER, CKANGroup.class); } + /* + * Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface + */ + @Override + public int count() throws WebServiceException { + CKANGroup ckan = getInstance(); + return ckan.count(); + } + @GET @Produces(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8) + public String list(@QueryParam(GCatConstants.LIMIT_PARAMETER) @DefaultValue("10") int limit, + @QueryParam(GCatConstants.OFFSET_PARAMETER) @DefaultValue("0") int offset, + @QueryParam(GCatConstants.COUNT_ONLY_PARAMETER) @DefaultValue("false") Boolean countOnly) { + if(countOnly) { + int count = count(); + return createCountJson(count); + }else { + return list(limit, offset); + } + } + + /* + * Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface + */ @Override public String list(@QueryParam(GCatConstants.LIMIT_PARAMETER) @DefaultValue("10") int limit, @QueryParam(GCatConstants.OFFSET_PARAMETER) @DefaultValue("0") int offset) { diff --git a/src/main/java/org/gcube/gcat/rest/Item.java b/src/main/java/org/gcube/gcat/rest/Item.java index d22c981..09f3ba1 100644 --- a/src/main/java/org/gcube/gcat/rest/Item.java +++ b/src/main/java/org/gcube/gcat/rest/Item.java @@ -56,20 +56,12 @@ public class Item extends REST implements org.gcube.gcat.api.interf public String list(@QueryParam(GCatConstants.LIMIT_PARAMETER) @DefaultValue("10") int limit, @QueryParam(GCatConstants.OFFSET_PARAMETER) @DefaultValue("0") int offset, @QueryParam(GCatConstants.COUNT_ONLY_PARAMETER) @DefaultValue("false") Boolean countOnly) { - String ret = null; if(countOnly) { int count = count(); - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("{\""); - stringBuilder.append(GCatConstants.COUNT_KEY); - stringBuilder.append("\":"); - stringBuilder.append(count); - stringBuilder.append("}"); - ret = stringBuilder.toString(); + return createCountJson(count); }else { - ret = list(limit, offset); + return list(limit, offset); } - return ret; } /* diff --git a/src/main/java/org/gcube/gcat/rest/Organization.java b/src/main/java/org/gcube/gcat/rest/Organization.java index d1acc3c..e5eef1a 100644 --- a/src/main/java/org/gcube/gcat/rest/Organization.java +++ b/src/main/java/org/gcube/gcat/rest/Organization.java @@ -11,6 +11,7 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; +import javax.xml.ws.WebServiceException; import org.gcube.gcat.ResourceInitializer; import org.gcube.gcat.annotation.PATCH; @@ -31,8 +32,31 @@ public class Organization extends REST super(ORGANIZATIONS, ORGANIZATION_ID_PARAMETER, CKANOrganization.class); } + /* + * Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface + */ + @Override + public int count() throws WebServiceException { + CKANOrganization ckan = getInstance(); + return ckan.count(); + } + @GET @Produces(ResourceInitializer.APPLICATION_JSON_CHARSET_UTF_8) + public String list(@QueryParam(GCatConstants.LIMIT_PARAMETER) @DefaultValue("10") int limit, + @QueryParam(GCatConstants.OFFSET_PARAMETER) @DefaultValue("0") int offset, + @QueryParam(GCatConstants.COUNT_ONLY_PARAMETER) @DefaultValue("false") Boolean countOnly) { + if(countOnly) { + int count = count(); + return createCountJson(count); + }else { + return list(limit, offset); + } + } + + /* + * Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface + */ @Override public String list(@QueryParam(GCatConstants.LIMIT_PARAMETER) @DefaultValue("10") int limit, @QueryParam(GCatConstants.OFFSET_PARAMETER) @DefaultValue("0") int offset) { diff --git a/src/main/java/org/gcube/gcat/rest/Profile.java b/src/main/java/org/gcube/gcat/rest/Profile.java index 68ce3c2..2ba3daa 100644 --- a/src/main/java/org/gcube/gcat/rest/Profile.java +++ b/src/main/java/org/gcube/gcat/rest/Profile.java @@ -13,6 +13,7 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -23,6 +24,7 @@ import javax.ws.rs.core.UriInfo; import org.gcube.datacatalogue.metadatadiscovery.DataCalogueMetadataFormatReader; import org.gcube.gcat.ResourceInitializer; +import org.gcube.gcat.api.GCatConstants; import org.gcube.gcat.profile.ISProfile; import org.xml.sax.SAXException; @@ -53,10 +55,46 @@ public class Profile extends BaseREST implements org.gcube.gcat.api.interfaces.P @Context private UriInfo uriInfo; + /* + * Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface + */ + @Override + public int count() { + setCalledMethod("GET /" + PROFILES); + try { + ISProfile isProfile = new ISProfile(); + return isProfile.count(); + } catch(WebApplicationException e) { + throw e; + } catch(Exception e) { + throw new InternalServerErrorException(e); + } + } + @GET @Produces(MediaType.APPLICATION_JSON) - public String list() { + public String listOrCount(@QueryParam(GCatConstants.COUNT_ONLY_PARAMETER) @DefaultValue("false") Boolean countOnly) { setCalledMethod("GET /" + PROFILES); + try { + ISProfile isProfile = new ISProfile(); + if(countOnly) { + return createCountJson(isProfile.count()); + }else{ + ArrayNode arrayNode = isProfile.list(); + return isProfile.getMapper().writeValueAsString(arrayNode); + } + } catch(WebApplicationException e) { + throw e; + } catch(Exception e) { + throw new InternalServerErrorException(e); + } + } + + /* + * Not used as REST method, implemented to respect {@link org.gcube.gcat.api.interfaces.Item} interface + */ + @Override + public String list() { try { ISProfile isProfile = new ISProfile(); ArrayNode arrayNode = isProfile.list(); @@ -161,5 +199,5 @@ public class Profile extends BaseREST implements org.gcube.gcat.api.interfaces.P public String update(String name, String xml) { return createOrUpdate(name, xml).getEntity().toString(); } - + } diff --git a/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java b/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java index a6001f5..969f776 100644 --- a/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java +++ b/src/test/java/org/gcube/gcat/persistence/ckan/CKANGroupTest.java @@ -14,10 +14,17 @@ public class CKANGroupTest extends ContextTest { private static Logger logger = LoggerFactory.getLogger(CKANGroupTest.class); + @Test + public void count() throws Exception { + CKANGroup ckanGroup = new CKANGroup(); + int count = ckanGroup.count(); + logger.debug("The groups are {}", count); + } + @Test public void list() throws Exception { CKANGroup ckanGroup = new CKANGroup(); - String ret = ckanGroup.list(10, 0); + String ret = ckanGroup.list(10000, 0); logger.debug("{}", ret); } diff --git a/src/test/java/org/gcube/gcat/persistence/ckan/CKANOrganizationTest.java b/src/test/java/org/gcube/gcat/persistence/ckan/CKANOrganizationTest.java index cb25939..d76a8bf 100644 --- a/src/test/java/org/gcube/gcat/persistence/ckan/CKANOrganizationTest.java +++ b/src/test/java/org/gcube/gcat/persistence/ckan/CKANOrganizationTest.java @@ -21,7 +21,15 @@ public class CKANOrganizationTest extends ContextTest { */ @Test - public void listOrganization() throws Exception { + public void countOrganizations() throws Exception { + ContextTest.setContextByName("/gcube"); + CKANOrganization ckanOrganization = new CKANOrganization(); + int count = ckanOrganization.count(); + logger.debug("The organizations are {}", count); + } + + @Test + public void listOrganizations() throws Exception { ContextTest.setContextByName("/gcube"); CKANOrganization ckanOrganization = new CKANOrganization(); String ret = ckanOrganization.list(1000, 0); diff --git a/src/test/java/org/gcube/gcat/profile/ProfileTest.java b/src/test/java/org/gcube/gcat/profile/ProfileTest.java index 24f1064..d3a2314 100644 --- a/src/test/java/org/gcube/gcat/profile/ProfileTest.java +++ b/src/test/java/org/gcube/gcat/profile/ProfileTest.java @@ -18,6 +18,13 @@ public class ProfileTest extends ContextTest { private static Logger logger = LoggerFactory.getLogger(ProfileTest.class); + @Test + public void count() throws Exception { + ISProfile profile = new ISProfile(); + int count = profile.count(); + logger.debug("We have {} types", count); + } + @Test public void list() throws Exception { ISProfile profile = new ISProfile();