From 69f25229d2dbdc256da6fa3676bf21e2765bb64d Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sat, 20 Sep 2014 09:18:56 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.0/Cloud) to HEAD (5.0/Cloud) 84938: Merged PLATFORM1 (5.0/Cloud) to HEAD-BUG-FIX (5.0/Cloud) 83536: Added support for a namespace query parameter (nsp) as part of ACE-2639. Improved the .desc.xml documentation. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@85255 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../facet/facetable-properties.get.desc.xml | 25 ++++++-- .../scripts/facet/FacetablePropertiesGet.java | 59 ++++++++++++++++++- 2 files changed, 77 insertions(+), 7 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 6591b6cb4e..a983d9369f 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,17 +4,34 @@ :/alfresco/api/facet/facetable-properties + http://:/alfresco/api/facet/facetable-properties[?nsp=eg] + http://:/alfresco/api/facet/classes/eg:aspectOrType/facetable-properties Example response from this web script: { - TODO + "data" : { + "properties" : [ + { + "name" : "eg:propName1", + "displayName" : "eg:propName1", + "dataType" : "d:text", + "modelQName" : "eg:examplemodel" + }, + { + "name" : "eg:propName2", + "title" : "Useful Metadata", + "displayName" : "eg:propName2 (Useful Metadata)", + "dataType" : "d:text", + "modelQName" : "eg:examplemodel" + } + ] + } } ]]> - /api/facet/classes/{classname}/facetable-properties - /api/facet/facetable-properties + /api/facet/classes/{classname}/facetable-properties?nsp={namespacePrefix?} + /api/facet/facetable-properties?nsp={namespacePrefix?} argument user required 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 2a370c046e..f2b7599f30 100644 --- a/source/java/org/alfresco/repo/web/scripts/facet/FacetablePropertiesGet.java +++ b/source/java/org/alfresco/repo/web/scripts/facet/FacetablePropertiesGet.java @@ -19,9 +19,13 @@ package org.alfresco.repo.web.scripts.facet; +import java.util.ArrayList; +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 org.alfresco.repo.search.impl.solr.facet.SolrFacetService.FacetablePropertyData; import org.alfresco.service.namespace.NamespaceException; @@ -45,6 +49,9 @@ 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 TEMPLATE_VAR_CLASSNAME = "classname"; + private static final String QUERY_PARAM_NAMESPACE = "nsp"; + private NamespaceService namespaceService; public void setNamespaceService(NamespaceService service) { this.namespaceService = service; } @@ -59,7 +66,7 @@ public class FacetablePropertiesGet extends AbstractSolrFacetConfigAdminWebScrip { // There are multiple defined URIs for this REST endpoint. Some define a "classname" template var. Map templateVars = req.getServiceMatch().getTemplateVars(); - final String contentClassName = templateVars.get("classname"); + final String contentClassName = templateVars.get(TEMPLATE_VAR_CLASSNAME); QName contentClassQName; try @@ -82,13 +89,59 @@ public class FacetablePropertiesGet extends AbstractSolrFacetConfigAdminWebScrip facetableProperties = facetService.getFacetableProperties(contentClassQName); } - model.put(PROPERTIES_KEY, facetableProperties); + // The webscript allows for some further filtering of results: + List filters = new ArrayList<>(); + + // By property QName namespace: + final String namespaceFilter = req.getParameter(QUERY_PARAM_NAMESPACE); + if (namespaceFilter != null) + { + filters.add(new ResultFilter() + { + @Override public boolean filter(FacetablePropertyData facetableProperty) + { + final QName propQName = facetableProperty.getPropertyDefinition().getName(); + Collection prefixes = namespaceService.getPrefixes(propQName.getNamespaceURI()); + return prefixes.contains(namespaceFilter); + } + }); + } + + Set filteredFacetableProperties = filter(facetableProperties, filters); + model.put(PROPERTIES_KEY, filteredFacetableProperties); if (logger.isDebugEnabled()) { - logger.debug("Retrieved " + facetableProperties.size() + " available facets"); + logger.debug("Retrieved " + facetableProperties.size() + " available facets; filtered to " + filteredFacetableProperties.size()); } return model; } + + /** This type defines the (inclusion) filtering of {@link FacetablePropertyData} in the response to this webscript. */ + private static interface ResultFilter + { + public boolean filter(FacetablePropertyData facetableProperty); + } + + /** + * This method returns a new Set instance containing only those {@link FacetablePropertyData data} that + * satisfy all {@link ResultFilter filters}. + */ + private Set filter(Set propsData, List filters) + { + Set filteredResult = new TreeSet<>(); + + for (FacetablePropertyData prop : propsData) + { + boolean passedAllFilters = true; + for (ResultFilter filter : filters) + { + if (!filter.filter(prop)) { passedAllFilters = false; } + } + if (passedAllFilters) { filteredResult.add(prop); } + } + + return filteredResult; + } }