diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/solr/solr.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/solr/solr.lib.ftl index 92d23cdbc7..2801d2d896 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/solr/solr.lib.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/solr/solr.lib.ftl @@ -78,6 +78,17 @@ ] + <#if filter.includePaths??> + <#if nodeMetaData.ancestors??> + <#if (nodeMetaData.ancestors?size > 0)> + , "ancestors": [ + <#list nodeMetaData.ancestors as ancestor> + "${ancestor}"<#if ancestor_has_next>, + + ] + + + <#if filter.includeParentAssociations??> <#if nodeMetaData.parentAssocs??> <#if (nodeMetaData.parentAssocs?size > 0)> diff --git a/source/java/org/alfresco/repo/web/scripts/solr/NodesMetaDataGet.java b/source/java/org/alfresco/repo/web/scripts/solr/NodesMetaDataGet.java index 35bc6fd940..f0d34eeae8 100644 --- a/source/java/org/alfresco/repo/web/scripts/solr/NodesMetaDataGet.java +++ b/source/java/org/alfresco/repo/web/scripts/solr/NodesMetaDataGet.java @@ -22,11 +22,14 @@ import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.repo.search.IndexerException; import org.alfresco.repo.solr.MetaDataResultsFilter; import org.alfresco.repo.solr.NodeMetaData; import org.alfresco.repo.solr.NodeMetaDataParameters; @@ -35,10 +38,12 @@ import org.alfresco.repo.solr.SOLRTrackingComponent.NodeMetaDataQueryCallback; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.Path; +import org.alfresco.service.cmr.repository.Path.Element; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.lucene.document.Field; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -246,6 +251,7 @@ public class NodesMetaDataGet extends DeclarativeWebScript private List childIds; private String owner; private Long txnId; + private Set ancestors; public FreemarkerNodeMetaData(SOLRSerializer solrSerializer, NodeMetaData nodeMetaData) throws IOException, JSONException { @@ -257,13 +263,20 @@ public class NodesMetaDataGet extends DeclarativeWebScript // convert Paths to Strings List paths = new ArrayList(); + HashSet ancestors = new HashSet(); for(Pair pair : nodeMetaData.getPaths()) { JSONObject o = new JSONObject(); o.put("path", solrSerializer.serializeValue(String.class, pair.getFirst())); o.put("qname", solrSerializer.serializeValue(String.class, pair.getSecond())); paths.add(o.toString(3)); + + for (NodeRef ancestor : getAncestors(pair.getFirst())) + { + ancestors.add(ancestor.toString()); + } } + setAncestors(ancestors); setPaths(paths); setChildAssocs(nodeMetaData.getChildAssocs()); @@ -366,6 +379,14 @@ public class NodesMetaDataGet extends DeclarativeWebScript { this.parentAssocsCrc = parentAssocsCrc; } + public void setAncestors(Set ancestors) + { + this.ancestors = ancestors; + } + public Set getAncestors() + { + return ancestors; + } public List getChildIds() { @@ -397,6 +418,26 @@ public class NodesMetaDataGet extends DeclarativeWebScript this.txnId = txnId; } + private ArrayList getAncestors(Path path) + { + ArrayList ancestors = new ArrayList(8); + for (Iterator elit = path.iterator(); elit.hasNext(); /**/) + { + Path.Element element = elit.next(); + if (!(element instanceof Path.ChildAssocElement)) + { + throw new IndexerException("Confused path: " + path); + } + Path.ChildAssocElement cae = (Path.ChildAssocElement) element; + NodeRef parentRef = cae.getRef().getParentRef(); + if(parentRef != null) + { + ancestors.add(0, parentRef); + } + + } + return ancestors; + } } }