diff --git a/config/alfresco/blog-context.xml b/config/alfresco/blog-context.xml index 7f33059085..410d2dc7ae 100644 --- a/config/alfresco/blog-context.xml +++ b/config/alfresco/blog-context.xml @@ -81,6 +81,7 @@ + @@ -117,7 +118,6 @@ - diff --git a/source/java/org/alfresco/repo/blog/BlogService.java b/source/java/org/alfresco/repo/blog/BlogService.java index 1caca65c8b..7a8155aa15 100644 --- a/source/java/org/alfresco/repo/blog/BlogService.java +++ b/source/java/org/alfresco/repo/blog/BlogService.java @@ -102,7 +102,6 @@ public interface BlogService * @param blogContainerNode the container node for blog posts (under the site). * @param fromDate an inclusive date limit for the results (more recent than). * @param toDate an inclusive date limit for the results (before). - * @param tag if specified, only returns posts tagged with this tag. * @param pagingReq an object defining the paging parameters for the result set. * * @return a {@link PagingResults} object containing some or all of the results (subject to paging). @@ -111,9 +110,21 @@ public interface BlogService * * @deprecated This method is a domain-specific query used by the Blog REST API and is not considered suitable for general use. */ - PagingResults getMyDraftsAndAllPublished(NodeRef blogContainerNode, Date fromDate, Date toDate, - String tag, PagingRequest pagingReq); + PagingResults getMyDraftsAndAllPublished(NodeRef blogContainerNode, Date fromDate, Date toDate, PagingRequest pagingReq); + /** + * Finds blog posts by the specified user tagged with the given tag string. + * + * @param blogContainerNode the container node for blog posts (under the site). + * @param tag tag string. + * @param pagingReq an object defining the paging parameters for the result set. + * + * @return a {@link PagingResults} object containing some or all of the results (subject to paging). + * + * @see SiteService#getContainer(String, String) to retrieve the blogContainerNode + */ + PagingResults findTaggedBlogPosts(NodeRef blogContainerNode, String tag, PagingRequest pagingReq); + /** * Returns true if the specified blog-post node is a 'draft' blog post. * diff --git a/source/java/org/alfresco/repo/blog/BlogServiceImpl.java b/source/java/org/alfresco/repo/blog/BlogServiceImpl.java index 7a23337f7b..598738d014 100644 --- a/source/java/org/alfresco/repo/blog/BlogServiceImpl.java +++ b/source/java/org/alfresco/repo/blog/BlogServiceImpl.java @@ -19,8 +19,10 @@ package org.alfresco.repo.blog; import java.io.Serializable; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; @@ -39,9 +41,14 @@ import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.SearchParameters; +import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.util.ISO9075; +import org.alfresco.util.Pair; import org.alfresco.util.ParameterCheck; import org.alfresco.util.registry.NamedObjectRegistry; @@ -69,6 +76,7 @@ public class BlogServiceImpl implements BlogService private ContentService contentService; private NodeService nodeService; private PermissionService permissionService; + private SearchService searchService; public void setCannedQueryRegistry(NamedObjectRegistry> cannedQueryRegistry) { @@ -110,6 +118,11 @@ public class BlogServiceImpl implements BlogService this.permissionService = permissionService; } + public void setSearchService(SearchService searchService) + { + this.searchService = searchService; + } + @Override public boolean isDraftBlogPost(NodeRef blogPostNode) { @@ -199,7 +212,7 @@ public class BlogServiceImpl implements BlogService * @deprecated */ @Override - public PagingResults getMyDraftsAndAllPublished(NodeRef blogContainerNode, Date createdFrom, Date createdTo, String tag, PagingRequest pagingReq) + public PagingResults getMyDraftsAndAllPublished(NodeRef blogContainerNode, Date createdFrom, Date createdTo, PagingRequest pagingReq) { ParameterCheck.mandatory("blogContainerNode", blogContainerNode); ParameterCheck.mandatory("pagingReq", pagingReq); @@ -207,7 +220,7 @@ public class BlogServiceImpl implements BlogService // get canned query pagingReq.setRequestTotalCountMax(MAX_QUERY_ENTRY_COUNT); String currentUser = AuthenticationUtil.getFullyAuthenticatedUser(); - DraftsAndPublishedBlogPostsCannedQuery cq = (DraftsAndPublishedBlogPostsCannedQuery)draftsAndPublishedBlogPostsCannedQueryFactory.getCannedQuery(blogContainerNode, createdFrom, createdTo, currentUser, tag, pagingReq); + DraftsAndPublishedBlogPostsCannedQuery cq = (DraftsAndPublishedBlogPostsCannedQuery)draftsAndPublishedBlogPostsCannedQueryFactory.getCannedQuery(blogContainerNode, createdFrom, createdTo, currentUser, pagingReq); // execute canned query CannedQueryResults results = cq.execute(); @@ -250,4 +263,70 @@ public class BlogServiceImpl implements BlogService nodeService.setProperty(blogPostNode, ContentModel.PROP_UPDATED, new Date()); } } + + @Override + public PagingResults findTaggedBlogPosts( + NodeRef blogContainerNode, String tag, PagingRequest pagingReq) + { + StringBuilder luceneQuery = new StringBuilder(); + luceneQuery.append("+TYPE:\"").append(ContentModel.TYPE_CONTENT).append("\" ") + .append("+PARENT:\"").append(blogContainerNode.toString()).append("\" ") + .append("+PATH:\"/cm:taggable/cm:").append(ISO9075.encode(tag)).append("/member\""); + + SearchParameters sp = new SearchParameters(); + sp.addStore(blogContainerNode.getStoreRef()); + sp.setLanguage(SearchService.LANGUAGE_LUCENE); + sp.setQuery(luceneQuery.toString()); + sp.addSort(ContentModel.PROP_PUBLISHED.toString(), false); + ResultSet luceneResults = null; + PagingResults results = null; + try + { + luceneResults = searchService.query(sp); + final ResultSet finalLuceneResults = luceneResults; + + results = new PagingResults() + { + + @Override + public List getPage() + { + List nodeRefs = finalLuceneResults.getNodeRefs(); + List blogPostInfos = new ArrayList(nodeRefs.size()); + for (NodeRef nodeRef : nodeRefs) + { + blogPostInfos.add(new BlogPostInfo(nodeRef, (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME))); + } + return blogPostInfos; + } + + @Override + public String getQueryExecutionId() + { + return null; + } + + @Override + public Pair getTotalResultCount() + { + int size = finalLuceneResults.getNodeRefs().size(); + //FIXME Impl + return new Pair(size, size); + } + + @Override + public boolean hasMoreItems() + { + return finalLuceneResults.hasMore(); + } + }; + } + finally + { + if (luceneResults != null) luceneResults.close(); + } + + + return results; + } } diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java index 2ed6233537..6bec70f147 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java @@ -56,17 +56,14 @@ public class DraftsAndPublishedBlogPostsCannedQuery extends AbstractCannedQueryP private static final String QUERY_SELECT_GET_BLOGS = "select_GetBlogsCannedQuery"; private final CannedQueryDAO cannedQueryDAO; - private final TaggingService taggingService; public DraftsAndPublishedBlogPostsCannedQuery( CannedQueryDAO cannedQueryDAO, - TaggingService taggingService, MethodSecurityBean methodSecurity, CannedQueryParameters params) { super(params, methodSecurity); this.cannedQueryDAO = cannedQueryDAO; - this.taggingService = taggingService; } @Override @@ -80,7 +77,6 @@ public class DraftsAndPublishedBlogPostsCannedQuery extends AbstractCannedQueryP DraftsAndPublishedBlogPostsCannedQueryParams paramBean = (DraftsAndPublishedBlogPostsCannedQueryParams) paramBeanObj; String requestedCreator = paramBean.getCmCreator(); - String requestedTag = paramBean.getTag(); Date createdFromDate = paramBean.getCreatedFromDate(); Date createdToDate = paramBean.getCreatedToDate(); @@ -135,13 +131,6 @@ public class DraftsAndPublishedBlogPostsCannedQuery extends AbstractCannedQueryP } } - // TODO review use-case and either remove or push-down - // Only return blog posts tagged with the specified tag string. - if (requestedTag != null && !taggingService.getTags(result.getNode().getNodeRef()).contains(requestedTag)) - { - nextNodeIsAcceptable = false; - } - if (nextNodeIsAcceptable) { filtered.add(result); diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java index 87589ea0b5..ecf904a1aa 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java @@ -30,7 +30,6 @@ import org.alfresco.query.PagingRequest; import org.alfresco.query.CannedQuerySortDetails.SortOrder; import org.alfresco.repo.blog.BlogService.BlogPostInfo; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.tagging.TaggingService; import org.alfresco.util.ParameterCheck; /** @@ -41,24 +40,17 @@ import org.alfresco.util.ParameterCheck; */ public class DraftsAndPublishedBlogPostsCannedQueryFactory extends AbstractBlogPostsCannedQueryFactory { - private TaggingService taggingService; - - public void setTaggingService(TaggingService taggingService) - { - this.taggingService = taggingService; - } - @Override public CannedQuery getCannedQuery(CannedQueryParameters parameters) { final DraftsAndPublishedBlogPostsCannedQuery cq = new DraftsAndPublishedBlogPostsCannedQuery( - cannedQueryDAO, taggingService, + cannedQueryDAO, methodSecurity, parameters); return (CannedQuery) cq; } - public CannedQuery getCannedQuery(NodeRef blogContainerNode, Date fromDate, Date toDate, String byUser, String tag, PagingRequest pagingReq) + public CannedQuery getCannedQuery(NodeRef blogContainerNode, Date fromDate, Date toDate, String byUser, PagingRequest pagingReq) { ParameterCheck.mandatory("blogContainerNode", blogContainerNode); ParameterCheck.mandatory("pagingReq", pagingReq); @@ -72,7 +64,7 @@ public class DraftsAndPublishedBlogPostsCannedQueryFactory extends AbstractBlogP getQNameId(ContentModel.PROP_PUBLISHED), getQNameId(ContentModel.TYPE_CONTENT), byUser, - fromDate, toDate, tag); + fromDate, toDate); CannedQueryPageDetails cqpd = createCQPageDetails(pagingReq); CannedQuerySortDetails cqsd = createCQSortDetails(ContentModel.PROP_PUBLISHED, SortOrder.DESCENDING); diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryParams.java b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryParams.java index 1088c30660..0f24a0e230 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryParams.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryParams.java @@ -31,7 +31,6 @@ public class DraftsAndPublishedBlogPostsCannedQueryParams extends BlogEntity private final String cmCreator; private final Date createdFromDate; private final Date createdToDate; - private final String tag; public DraftsAndPublishedBlogPostsCannedQueryParams(Long blogContainerNodeId, Long nameQNameId, @@ -39,15 +38,13 @@ public class DraftsAndPublishedBlogPostsCannedQueryParams extends BlogEntity Long contentTypeQNameId, String cmCreator, Date createdFromDate, - Date createdToDate, - String tag) + Date createdToDate) { super(blogContainerNodeId, nameQNameId, publishedQNameId, contentTypeQNameId, null, null); this.cmCreator = cmCreator; this.createdFromDate = createdFromDate; this.createdToDate = createdToDate; - this.tag = tag; } public String getCmCreator() @@ -64,9 +61,4 @@ public class DraftsAndPublishedBlogPostsCannedQueryParams extends BlogEntity { return createdToDate; } - - public String getTag() - { - return tag; - } } diff --git a/source/java/org/alfresco/service/ServiceRegistry.java b/source/java/org/alfresco/service/ServiceRegistry.java index 77cfad5749..4f1029a907 100644 --- a/source/java/org/alfresco/service/ServiceRegistry.java +++ b/source/java/org/alfresco/service/ServiceRegistry.java @@ -137,7 +137,7 @@ public interface ServiceRegistry static final QName RENDITION_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RenditionService"); static final QName RATING_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RatingService"); static final QName REPO_ADMIN_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RepoAdminService"); - static final QName NODE_LOCATOR_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "NodeLocatorService"); + static final QName NODE_LOCATOR_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "nodeLocatorService"); // WCM / AVM static final QName AVM_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "AVMService");