diff --git a/source/java/org/alfresco/repo/jscript/Classification.java b/source/java/org/alfresco/repo/jscript/Classification.java index c89b7f45d7..2253d2080e 100644 --- a/source/java/org/alfresco/repo/jscript/Classification.java +++ b/source/java/org/alfresco/repo/jscript/Classification.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.List; import org.alfresco.model.ContentModel; +import org.alfresco.query.PagingRequest; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -138,6 +139,23 @@ public final class Classification extends BaseScopableProcessorExtension return Context.getCurrentContext().newArray(getScope(), cats); } + /** + * Get ordered, filtered and paged root categories in a classification. + * + * @param aspect + * @param filter + * @param maxItems + * @param skipCount (offset) + * @return + */ + public Scriptable getRootCategories(String aspect, String filter, int maxItems, int skipCount) + { + PagingRequest pagingRequest = new PagingRequest(skipCount, maxItems); + List rootCategories = services.getCategoryService().getRootCategories(storeRef, createQName(aspect), pagingRequest, true, filter).getPage(); + Object[] cats = buildCategoryNodes(rootCategories); + return Context.getCurrentContext().newArray(getScope(), cats); + } + /** * Get the category usage count. * diff --git a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java index 66a929f222..1df297a022 100644 --- a/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java +++ b/source/java/org/alfresco/repo/search/impl/lucene/LuceneCategoryServiceImpl.java @@ -370,6 +370,11 @@ public class LuceneCategoryServiceImpl implements CategoryService } public PagingResults getRootCategories(StoreRef storeRef, QName aspectName, PagingRequest pagingRequest, boolean sortByName) + { + return getRootCategories(storeRef, aspectName, pagingRequest, sortByName, null); + } + + public PagingResults getRootCategories(StoreRef storeRef, QName aspectName, PagingRequest pagingRequest, boolean sortByName, String filter) { final List assocs = new LinkedList(); Set nodeRefs = getClassificationNodes(storeRef, aspectName); @@ -382,7 +387,7 @@ public class LuceneCategoryServiceImpl implements CategoryService OUTER: for(NodeRef nodeRef : nodeRefs) { - Collection children = getChildren(nodeRef, Mode.SUB_CATEGORIES, Depth.IMMEDIATE, sortByName, null); + Collection children = getChildren(nodeRef, Mode.SUB_CATEGORIES, Depth.IMMEDIATE, sortByName, filter); for(ChildAssociationRef child : children) { count++; diff --git a/source/java/org/alfresco/service/cmr/search/CategoryService.java b/source/java/org/alfresco/service/cmr/search/CategoryService.java index 4c75c1c422..2a49c28adf 100644 --- a/source/java/org/alfresco/service/cmr/search/CategoryService.java +++ b/source/java/org/alfresco/service/cmr/search/CategoryService.java @@ -116,6 +116,19 @@ public interface CategoryService */ @Auditable(parameters = {"storeRef", "aspectName", "pagingRequest", "sortByName"}) PagingResults getRootCategories(StoreRef storeRef, QName aspectName, PagingRequest pagingRequest, boolean sortByName); + + /** + * Get a paged list of the root categories for an aspect/classification + * + * @param storeRef + * @param aspectName + * @param pagingRequest + * @param sortByName + * @param filter + * @return + */ + @Auditable(parameters = {"storeRef", "aspectName", "pagingRequest", "sortByName", "filter"}) + PagingResults getRootCategories(StoreRef storeRef, QName aspectName, PagingRequest pagingRequest, boolean sortByName, String filter); /** * Get the root categories for an aspect/classification with names that start with filter diff --git a/source/test-java/org/alfresco/repo/search/impl/lucene/ADMLuceneCategoryTest.java b/source/test-java/org/alfresco/repo/search/impl/lucene/ADMLuceneCategoryTest.java index a996db28ab..7a6df0e12d 100644 --- a/source/test-java/org/alfresco/repo/search/impl/lucene/ADMLuceneCategoryTest.java +++ b/source/test-java/org/alfresco/repo/search/impl/lucene/ADMLuceneCategoryTest.java @@ -31,6 +31,7 @@ import javax.transaction.UserTransaction; import junit.framework.TestCase; import org.alfresco.model.ContentModel; +import org.alfresco.query.PagingRequest; import org.alfresco.repo.dictionary.DictionaryDAO; import org.alfresco.repo.dictionary.IndexTokenisationMode; import org.alfresco.repo.dictionary.M2Aspect; @@ -782,6 +783,22 @@ public class ADMLuceneCategoryTest extends TestCase tx.rollback(); + + tx = transactionService.getUserTransaction(); + tx.begin(); + for ( int i=0; i<=5; i++) + { + categoryService.createRootCategory(rootNodeRef.getStoreRef(), QName.createQName(TEST_NAMESPACE, "assetClass"), "FirstTestCategory" + i); + categoryService.createRootCategory(rootNodeRef.getStoreRef(), QName.createQName(TEST_NAMESPACE, "assetClass"), "SecondTestCategory" + i); + } + tx.commit(); + tx = transactionService.getUserTransaction(); + tx.begin(); + PagingRequest pagingRequest = new PagingRequest(10); + assertEquals(10,categoryService.getRootCategories(rootNodeRef.getStoreRef(),QName.createQName(TEST_NAMESPACE, "assetClass"), pagingRequest, true, null).getPage().size()); + assertEquals(6,categoryService.getRootCategories(rootNodeRef.getStoreRef(),QName.createQName(TEST_NAMESPACE, "assetClass"), pagingRequest, true, "FirstTestCategory").getPage().size()); + assertEquals(6,categoryService.getRootCategories(rootNodeRef.getStoreRef(),QName.createQName(TEST_NAMESPACE, "assetClass"), pagingRequest, true, "SecondTestCategory").getPage().size()); + tx.commit(); } /**