diff --git a/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java b/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java index fbbcc79adb..a984184402 100644 --- a/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java +++ b/source/java/org/alfresco/cmis/search/CMISQueryServiceImpl.java @@ -31,10 +31,13 @@ import org.alfresco.cmis.CMISResultSet; import org.alfresco.cmis.CMISScope; import org.alfresco.cmis.CMISServices; import org.alfresco.cmis.CMISQueryOptions.CMISQueryMode; +import org.alfresco.repo.search.impl.lucene.PagingLuceneResultSet; import org.alfresco.repo.search.impl.querymodel.Query; import org.alfresco.repo.search.impl.querymodel.QueryEngine; import org.alfresco.repo.search.impl.querymodel.QueryEngineResults; +import org.alfresco.repo.security.permissions.impl.acegi.FilteringResultSet; import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.search.LimitBy; import org.alfresco.service.cmr.search.ResultSet; @@ -133,7 +136,7 @@ public class CMISQueryServiceImpl implements CMISQueryService ResultSet current = map.get(group); for (String selector : group) { - wrapped.put(selector, current); + wrapped.put(selector, filterNotExistingNodes(current)); } } LimitBy limitBy = null; @@ -144,6 +147,32 @@ public class CMISQueryServiceImpl implements CMISQueryService CMISResultSet cmis = new CMISResultSetImpl(wrapped, options, limitBy, nodeService, query, cmisDictionaryService, alfrescoDictionaryService); return cmis; } + + /* MNT-8804 filter ResultSet for nodes with corrupted indexes */ + private ResultSet filterNotExistingNodes(ResultSet resultSet) + { + if (resultSet instanceof PagingLuceneResultSet) + { + ResultSet wrapped = ((PagingLuceneResultSet)resultSet).getWrapped(); + + if (wrapped instanceof FilteringResultSet) + { + FilteringResultSet filteringResultSet = (FilteringResultSet)wrapped; + + for (int i = 0; i < filteringResultSet.length(); i++) + { + NodeRef nodeRef = filteringResultSet.getNodeRef(i); + /* filter node if it does not exist */ + if (!nodeService.exists(nodeRef)) + { + filteringResultSet.setIncluded(i, false); + } + } + } + } + + return resultSet; + } /* * (non-Javadoc) diff --git a/source/java/org/alfresco/opencmis/search/CMISQueryServiceImpl.java b/source/java/org/alfresco/opencmis/search/CMISQueryServiceImpl.java index edbe7befa1..4e62e2e1d7 100644 --- a/source/java/org/alfresco/opencmis/search/CMISQueryServiceImpl.java +++ b/source/java/org/alfresco/opencmis/search/CMISQueryServiceImpl.java @@ -24,10 +24,13 @@ import java.util.Set; import org.alfresco.opencmis.dictionary.CMISDictionaryService; import org.alfresco.opencmis.search.CMISQueryOptions.CMISQueryMode; +import org.alfresco.repo.search.impl.lucene.PagingLuceneResultSet; import org.alfresco.repo.search.impl.querymodel.Query; import org.alfresco.repo.search.impl.querymodel.QueryEngine; import org.alfresco.repo.search.impl.querymodel.QueryEngineResults; +import org.alfresco.repo.security.permissions.impl.acegi.FilteringResultSet; import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.search.LimitBy; @@ -110,7 +113,7 @@ public class CMISQueryServiceImpl implements CMISQueryService ResultSet current = map.get(group); for (String selector : group) { - wrapped.put(selector, current); + wrapped.put(selector, filterNotExistingNodes(current)); } } LimitBy limitBy = null; @@ -123,6 +126,32 @@ public class CMISQueryServiceImpl implements CMISQueryService alfrescoDictionaryService); return cmis; } + + /* MNT-8804 filter ResultSet for nodes with corrupted indexes */ + private ResultSet filterNotExistingNodes(ResultSet resultSet) + { + if (resultSet instanceof PagingLuceneResultSet) + { + ResultSet wrapped = ((PagingLuceneResultSet)resultSet).getWrapped(); + + if (wrapped instanceof FilteringResultSet) + { + FilteringResultSet filteringResultSet = (FilteringResultSet)wrapped; + + for (int i = 0; i < filteringResultSet.length(); i++) + { + NodeRef nodeRef = filteringResultSet.getNodeRef(i); + /* filter node if it does not exist */ + if (!nodeService.exists(nodeRef)) + { + filteringResultSet.setIncluded(i, false); + } + } + } + } + + return resultSet; + } public CMISResultSet query(String query, StoreRef storeRef) { diff --git a/source/java/org/alfresco/repo/security/permissions/impl/acegi/FilteringResultSet.java b/source/java/org/alfresco/repo/security/permissions/impl/acegi/FilteringResultSet.java index 23368d12e7..cb08a69ff2 100644 --- a/source/java/org/alfresco/repo/security/permissions/impl/acegi/FilteringResultSet.java +++ b/source/java/org/alfresco/repo/security/permissions/impl/acegi/FilteringResultSet.java @@ -64,7 +64,7 @@ public class FilteringResultSet extends ACLEntryAfterInvocationProvider implemen return unfiltered; } - /* package */void setIncluded(int i, boolean excluded) + public void setIncluded(int i, boolean excluded) { inclusionMask.set(i, excluded); }