From 76dd365a4b8b5f3b4f6f9c8dbdd4c24d4ee17ebf Mon Sep 17 00:00:00 2001 From: Andrew Hind Date: Thu, 15 Sep 2011 18:38:20 +0000 Subject: [PATCH] Fix for ALF-10231: SOLR: CMIS infolder and inTree fail as the noderef can not be turned into a PATH .... - added ANCESTOR tracking to SOLR (as there is no wya to turn a node ref into a PATH) - tested using the open cmis workbench using IN_FOLDER and in_TREE git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@30557 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repository/solr/solr.lib.ftl | 11 +++++ .../web/scripts/solr/NodesMetaDataGet.java | 41 +++++++++++++++++++ 2 files changed, 52 insertions(+) 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; + } } }