From 40eec10e44e599d4526beac2e39e74a99229908a Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sat, 20 Sep 2014 09:23:46 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud) 84948: Merged PLATFORM1 (5.0/Cloud) to HEAD-BUG-FIX (5.0/Cloud) 83656: Addition of standard paging to FacetableProperties result sets. Part of ACE-2639. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@85265 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../facet/facetable-properties.get.desc.xml | 8 ++--- .../facet/facetable-properties.get.json.ftl | 3 ++ ...AbstractSolrFacetConfigAdminWebScript.java | 36 ++++++++++++++++++- .../scripts/facet/FacetablePropertiesGet.java | 30 +++++++++++----- 4 files changed, 63 insertions(+), 14 deletions(-) diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.desc.xml index 6c885cbd16..e3b883e57b 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.desc.xml @@ -4,8 +4,8 @@ :/alfresco/api/facet/facetable-properties[?nsp=eg] - http://:/alfresco/api/facet/classes/eg:aspectOrType/facetable-properties + http://:/alfresco/api/facet/facetable-properties[?nsp=eg&skipCount=50&maxItems=10] + http://:/alfresco/api/facet/classes/eg:aspectOrType/facetable-properties[?skipCount=50&maxItems=10] Example response from this web script: @@ -32,8 +32,8 @@ } ]]> - /api/facet/classes/{classname}/facetable-properties?nsp={namespacePrefix?} - /api/facet/facetable-properties?nsp={namespacePrefix?} + /api/facet/classes/{classname}/facetable-properties?nsp={namespacePrefix?}&skipCount={skipCount?}&maxItems={maxItems?} + /api/facet/facetable-properties?nsp={namespacePrefix?}&skipCount={skipCount?}&maxItems={maxItems?} argument user required diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.json.ftl index 7b03f6c83b..74957f8c43 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/facet/facetable-properties.get.json.ftl @@ -1,3 +1,4 @@ +<#import "../generic-paged-results.lib.ftl" as genericPaging /> <#escape x as jsonUtils.encodeJSONString(x)> { "data" : { @@ -16,5 +17,7 @@ ] } + + <@genericPaging.pagingJSON /> } diff --git a/source/java/org/alfresco/repo/web/scripts/facet/AbstractSolrFacetConfigAdminWebScript.java b/source/java/org/alfresco/repo/web/scripts/facet/AbstractSolrFacetConfigAdminWebScript.java index d01cbfa702..79b722188a 100644 --- a/source/java/org/alfresco/repo/web/scripts/facet/AbstractSolrFacetConfigAdminWebScript.java +++ b/source/java/org/alfresco/repo/web/scripts/facet/AbstractSolrFacetConfigAdminWebScript.java @@ -249,6 +249,40 @@ public abstract class AbstractSolrFacetConfigAdminWebScript extends DeclarativeW } return typeQName; } - + + /** + * Retrieves the named parameter as an integer, if the parameter is not present the default value is returned. + * + * @param req The WebScript request + * @param paramName The name of parameter to look for. + * @param defaultValue The default value that should be returned if parameter is not present in request or is negative. + * @return The request parameter or default value + * @throws WebScriptException if the named parameter cannot be converted to int (HTTP rsp 400). + */ + protected int getNonNegativeIntParameter(WebScriptRequest req, String paramName, int defaultValue) + { + final String paramString = req.getParameter(paramName); + + final int result; + + if (paramString != null) + { + try + { + final int paramInt = Integer.valueOf(paramString); + + if (paramInt < 0) { result = defaultValue; } + else { result = paramInt; } + } + catch (NumberFormatException e) + { + throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); + } + } + else { result = defaultValue; } + + return result; + } + abstract protected Map unprotectedExecuteImpl(WebScriptRequest req, Status status, Cache cache); } diff --git a/source/java/org/alfresco/repo/web/scripts/facet/FacetablePropertiesGet.java b/source/java/org/alfresco/repo/web/scripts/facet/FacetablePropertiesGet.java index f2b7599f30..9cb7d4d6a5 100644 --- a/source/java/org/alfresco/repo/web/scripts/facet/FacetablePropertiesGet.java +++ b/source/java/org/alfresco/repo/web/scripts/facet/FacetablePropertiesGet.java @@ -24,13 +24,14 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import java.util.SortedSet; import org.alfresco.repo.search.impl.solr.facet.SolrFacetService.FacetablePropertyData; import org.alfresco.service.namespace.NamespaceException; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.util.ModelUtil; +import org.alfresco.util.ScriptPagingDetails; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.extensions.webscripts.Cache; @@ -49,8 +50,12 @@ public class FacetablePropertiesGet extends AbstractSolrFacetConfigAdminWebScrip public static final Log logger = LogFactory.getLog(FacetablePropertiesGet.class); public static final String PROPERTIES_KEY = "properties"; + private static final String MAX_ITEMS = "maxItems"; + private static final String SKIP_COUNT = "skipCount"; + private static final int DEFAULT_MAX_ITEMS_PER_PAGE = 50; + private static final String TEMPLATE_VAR_CLASSNAME = "classname"; - private static final String QUERY_PARAM_NAMESPACE = "nsp"; + private static final String QUERY_PARAM_NAMESPACE = "nsp"; private NamespaceService namespaceService; @@ -79,7 +84,7 @@ public class FacetablePropertiesGet extends AbstractSolrFacetConfigAdminWebScrip final Map model = new HashMap<>(); - final Set facetableProperties; + final SortedSet facetableProperties; if (contentClassQName == null) { facetableProperties = facetService.getFacetableProperties(); @@ -107,14 +112,21 @@ public class FacetablePropertiesGet extends AbstractSolrFacetConfigAdminWebScrip }); } - Set filteredFacetableProperties = filter(facetableProperties, filters); - model.put(PROPERTIES_KEY, filteredFacetableProperties); + List filteredFacetableProperties = filter(facetableProperties, filters); if (logger.isDebugEnabled()) { logger.debug("Retrieved " + facetableProperties.size() + " available facets; filtered to " + filteredFacetableProperties.size()); } + // Create paging + ScriptPagingDetails paging = new ScriptPagingDetails( + getNonNegativeIntParameter(req, MAX_ITEMS, DEFAULT_MAX_ITEMS_PER_PAGE), + getNonNegativeIntParameter(req, SKIP_COUNT, 0)); + + model.put(PROPERTIES_KEY, ModelUtil.page(filteredFacetableProperties, paging)); + model.put("paging", ModelUtil.buildPaging(paging)); + return model; } @@ -125,12 +137,12 @@ public class FacetablePropertiesGet extends AbstractSolrFacetConfigAdminWebScrip } /** - * This method returns a new Set instance containing only those {@link FacetablePropertyData data} that + * This method returns a new List instance containing only those {@link FacetablePropertyData data} that * satisfy all {@link ResultFilter filters}. */ - private Set filter(Set propsData, List filters) + private List filter(Collection propsData, List filters) { - Set filteredResult = new TreeSet<>(); + List filteredResult = new ArrayList<>(); for (FacetablePropertyData prop : propsData) {