diff --git a/source/java/org/alfresco/repo/blog/BlogPostInfoImpl.java b/source/java/org/alfresco/repo/blog/BlogPostInfoImpl.java new file mode 100644 index 0000000000..495fe021a7 --- /dev/null +++ b/source/java/org/alfresco/repo/blog/BlogPostInfoImpl.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.blog; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.permissions.PermissionCheckValue; +import org.alfresco.service.cmr.blog.BlogPostInfo; +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * An implementation of a {@link BlogPostInfo} + * + * @author Nick Burch (based on the existing webscript conrollers in the REST API) + * @since 4.0 + */ + public class BlogPostInfoImpl implements BlogPostInfo + { + private final NodeRef nodeRef; + private final String systemName; + + public BlogPostInfoImpl(NodeRef nodeRef, String systemName) + { + this.nodeRef = nodeRef; + this.systemName = systemName; + } + + /** + * Gets the NodeRef representing this blog-post. + */ + @Override + public NodeRef getNodeRef() + { + return nodeRef; + } + + @Override + public NodeRef getContainerNodeRef() + { + //return containerNodeRef; // TODO + return null; + } + + /** + * Gets the {@link ContentModel#PROP_NAME cm:name} of the blog post. + * @return + */ + @Override + public String getSystemName() + { + return systemName; + } + + /** + * @return the Title of the blog post. + */ + public String getTitle() + { + // TODO + return null; + } + } \ No newline at end of file diff --git a/source/java/org/alfresco/repo/blog/BlogServiceImpl.java b/source/java/org/alfresco/repo/blog/BlogServiceImpl.java index ec71b5a258..98c0aafa1d 100644 --- a/source/java/org/alfresco/repo/blog/BlogServiceImpl.java +++ b/source/java/org/alfresco/repo/blog/BlogServiceImpl.java @@ -37,6 +37,7 @@ import org.alfresco.repo.blog.cannedqueries.GetBlogPostsCannedQueryFactory; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.search.impl.lucene.LuceneUtils; import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.service.cmr.blog.BlogPostInfo; import org.alfresco.service.cmr.blog.BlogService; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; @@ -145,7 +146,16 @@ public class BlogServiceImpl implements BlogService return nodeService.getProperty(blogPostNode, ContentModel.PROP_PUBLISHED) == null; } + @Override + public BlogPostInfo createBlogPost(String siteShortName, String blogTitle, + String blogContent, boolean isDraft) + { + // TODO Implement + return null; + } + + @Override public BlogPostInfo createBlogPost(NodeRef blogContainerNode, String blogTitle, String blogContent, boolean isDraft) { @@ -177,9 +187,39 @@ public class BlogServiceImpl implements BlogService setOrUpdateReleasedAndUpdatedDates(postNode.getChildRef()); } - return new BlogPostInfo(postNode.getChildRef(), nodeName); + return new BlogPostInfoImpl(postNode.getChildRef(), nodeName); } + + @Override + public BlogPostInfo updateBlogPost(BlogPostInfo post) { + if (post.getNodeRef() == null) + { + throw new IllegalArgumentException("Can't update a post that was never persisted, call create instead"); + } + + // TODO Implement + return null; + } + + @Override + public void deleteBlogPost(BlogPostInfo post) { + if (post.getNodeRef() == null) + { + throw new IllegalArgumentException("Can't delete a post that was never persisted"); + } + + nodeService.deleteNode(post.getNodeRef()); + } + + @Override + public PagingResults getDrafts(String siteShortName, + String username, PagingRequest pagingReq) + { + // TODO Implement + return null; + } + @Override public PagingResults getDrafts(NodeRef blogContainerNode, String username, PagingRequest pagingReq) { @@ -194,6 +234,15 @@ public class BlogServiceImpl implements BlogService CannedQueryResults results = cq.execute(); return results; } + + @Override + public PagingResults getPublishedExternally( + String siteShortName, PagingRequest pagingReq) + { + // TODO Implement + return null; + } + @Override public PagingResults getPublishedExternally(NodeRef blogContainerNode, PagingRequest pagingReq) { @@ -209,6 +258,14 @@ public class BlogServiceImpl implements BlogService return results; } + @Override + public PagingResults getPublished(String siteShortName, + Date fromDate, Date toDate, String byUser, PagingRequest pagingReq) + { + // TODO Implement + return null; + } + @Override public PagingResults getPublished(NodeRef blogContainerNode, Date fromDate, Date toDate, String byUser, PagingRequest pagingReq) { @@ -280,6 +337,14 @@ public class BlogServiceImpl implements BlogService } } + @Override + public PagingResults findBlogPosts(String siteShortName, + RangedDateProperty dateRange, String tag, PagingRequest pagingReq) + { + // TODO Implement + return null; + } + @Override public PagingResults findBlogPosts(NodeRef blogContainerNode, RangedDateProperty dateRange, String tag, PagingRequest pagingReq) { @@ -321,7 +386,7 @@ public class BlogServiceImpl implements BlogService List blogPostInfos = new ArrayList(nodeRefs.size()); for (NodeRef nodeRef : nodeRefs) { - blogPostInfos.add(new BlogPostInfo(nodeRef, (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME))); + blogPostInfos.add(new BlogPostInfoImpl(nodeRef, (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME))); } return blogPostInfos; } diff --git a/source/java/org/alfresco/repo/blog/BlogServiceImplTest.java b/source/java/org/alfresco/repo/blog/BlogServiceImplTest.java index ac3e4340dd..da453d54b0 100644 --- a/source/java/org/alfresco/repo/blog/BlogServiceImplTest.java +++ b/source/java/org/alfresco/repo/blog/BlogServiceImplTest.java @@ -40,8 +40,8 @@ import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.service.cmr.blog.BlogPostInfo; import org.alfresco.service.cmr.blog.BlogService; -import org.alfresco.service.cmr.blog.BlogService.BlogPostInfo; import org.alfresco.service.cmr.blog.BlogService.RangedDateProperty; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/AbstractBlogPostsCannedQueryFactory.java b/source/java/org/alfresco/repo/blog/cannedqueries/AbstractBlogPostsCannedQueryFactory.java index e6827be18b..2cf783a9eb 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/AbstractBlogPostsCannedQueryFactory.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/AbstractBlogPostsCannedQueryFactory.java @@ -26,7 +26,7 @@ import org.alfresco.model.ContentModel; import org.alfresco.query.CannedQuerySortDetails; import org.alfresco.query.CannedQuerySortDetails.SortOrder; import org.alfresco.repo.query.AbstractQNameAwareCannedQueryFactory; -import org.alfresco.service.cmr.blog.BlogService.BlogPostInfo; +import org.alfresco.service.cmr.blog.BlogPostInfo; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java index eafb285ae0..79b2861767 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQuery.java @@ -27,12 +27,13 @@ import java.util.List; import org.alfresco.query.CannedQuery; import org.alfresco.query.CannedQueryParameters; import org.alfresco.query.CannedQuerySortDetails.SortOrder; +import org.alfresco.repo.blog.BlogPostInfoImpl; import org.alfresco.repo.blog.cannedqueries.AbstractBlogPostsCannedQueryFactory.BlogEntityComparator; import org.alfresco.repo.domain.query.CannedQueryDAO; import org.alfresco.repo.security.permissions.impl.acegi.AbstractCannedQueryPermissions; import org.alfresco.repo.security.permissions.impl.acegi.MethodSecurityBean; +import org.alfresco.service.cmr.blog.BlogPostInfo; import org.alfresco.service.cmr.blog.BlogService; -import org.alfresco.service.cmr.blog.BlogService.BlogPostInfo; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.namespace.QName; @@ -156,7 +157,7 @@ public class DraftsAndPublishedBlogPostsCannedQuery extends AbstractCannedQueryP List blogPostInfos = new ArrayList(filtered.size()); for (BlogEntity result : filtered) { - blogPostInfos.add(new BlogPostInfo(result.getNodeRef(), result.getName())); + blogPostInfos.add(new BlogPostInfoImpl(result.getNodeRef(), result.getName())); } if (start != null) diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java index fec4ee0e89..103c0bf768 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/DraftsAndPublishedBlogPostsCannedQueryFactory.java @@ -29,7 +29,7 @@ import org.alfresco.query.CannedQueryPageDetails; import org.alfresco.query.CannedQueryParameters; import org.alfresco.query.CannedQuerySortDetails; import org.alfresco.query.PagingRequest; -import org.alfresco.service.cmr.blog.BlogService.BlogPostInfo; +import org.alfresco.service.cmr.blog.BlogPostInfo; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQuery.java b/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQuery.java index 3ed4c34e65..f5c7c75f39 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQuery.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQuery.java @@ -27,13 +27,14 @@ import java.util.List; import org.alfresco.query.CannedQuery; import org.alfresco.query.CannedQueryParameters; import org.alfresco.query.CannedQuerySortDetails.SortOrder; +import org.alfresco.repo.blog.BlogPostInfoImpl; import org.alfresco.repo.blog.cannedqueries.AbstractBlogPostsCannedQueryFactory.BlogEntityComparator; import org.alfresco.repo.domain.node.AuditablePropertiesEntity; import org.alfresco.repo.domain.query.CannedQueryDAO; import org.alfresco.repo.security.permissions.impl.acegi.AbstractCannedQueryPermissions; import org.alfresco.repo.security.permissions.impl.acegi.MethodSecurityBean; +import org.alfresco.service.cmr.blog.BlogPostInfo; import org.alfresco.service.cmr.blog.BlogService; -import org.alfresco.service.cmr.blog.BlogService.BlogPostInfo; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; @@ -153,7 +154,7 @@ public class GetBlogPostsCannedQuery extends AbstractCannedQueryPermissions blogPostInfos = new ArrayList(filtered.size()); for (BlogEntity result : filtered) { - blogPostInfos.add(new BlogPostInfo(result.getNodeRef(), result.getName())); + blogPostInfos.add(new BlogPostInfoImpl(result.getNodeRef(), result.getName())); } if (start != null) diff --git a/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQueryFactory.java b/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQueryFactory.java index 9dd713f75a..35c7f78156 100644 --- a/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQueryFactory.java +++ b/source/java/org/alfresco/repo/blog/cannedqueries/GetBlogPostsCannedQueryFactory.java @@ -29,8 +29,8 @@ import org.alfresco.query.CannedQueryParameters; import org.alfresco.query.CannedQuerySortDetails; import org.alfresco.query.PagingRequest; import org.alfresco.query.CannedQuerySortDetails.SortOrder; +import org.alfresco.service.cmr.blog.BlogPostInfo; import org.alfresco.service.cmr.blog.BlogService; -import org.alfresco.service.cmr.blog.BlogService.BlogPostInfo; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.util.ParameterCheck; diff --git a/source/java/org/alfresco/service/cmr/blog/BlogPostInfo.java b/source/java/org/alfresco/service/cmr/blog/BlogPostInfo.java new file mode 100644 index 0000000000..853a14859a --- /dev/null +++ b/source/java/org/alfresco/service/cmr/blog/BlogPostInfo.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2005-2011 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.service.cmr.blog; + +import java.io.Serializable; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.permissions.PermissionCheckValue; +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * This class represents a blog post in a blog. + * + * @author Neil Mc Erlean + * @since 4.0 + */ + public interface BlogPostInfo extends Serializable, PermissionCheckValue + { + /** + * Gets the NodeRef representing this blog-post. + */ + NodeRef getNodeRef(); + + /** + * @return the NodeRef of the container this belongs to (Site or Otherwise) + */ + NodeRef getContainerNodeRef(); + + /** + * Gets the {@link ContentModel#PROP_NAME cm:name} of the blog post. + */ + String getSystemName(); + + /** + * @return the Title of the blog post. + */ + String getTitle(); + + // TODO Remaining fields + } \ No newline at end of file diff --git a/source/java/org/alfresco/service/cmr/blog/BlogService.java b/source/java/org/alfresco/service/cmr/blog/BlogService.java index 72d4070dc5..b55c1447c9 100644 --- a/source/java/org/alfresco/service/cmr/blog/BlogService.java +++ b/source/java/org/alfresco/service/cmr/blog/BlogService.java @@ -24,7 +24,6 @@ import org.alfresco.model.ContentModel; import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; import org.alfresco.repo.blog.BlogIntegrationService; -import org.alfresco.repo.security.permissions.PermissionCheckValue; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.site.SiteService; @@ -42,6 +41,20 @@ import org.alfresco.service.namespace.QName; */ public interface BlogService { + /** + * Creates a new blog post in the specified site + * + * @param siteShortName the name of the site to add the post to. + * @param blogTitle the title of the blog post. + * @param blogContent text/html content of the blog post. + * @param isDraft true if the blog post is a draft post, else false. + * + * @return The {@link BlogPostInfo} of the newly created blog post. + * + * @see SiteService#getContainer(String, String) to retrieve the blogContainerNode + */ + BlogPostInfo createBlogPost(String siteShortName, String blogTitle, String blogContent, boolean isDraft); + /** * Creates a new blog post within the specified container node. * @@ -56,6 +69,31 @@ public interface BlogService */ BlogPostInfo createBlogPost(NodeRef blogContainerNode, String blogTitle, String blogContent, boolean isDraft); + /** + * Updates an existing {@link BlogPostInfo} in the repository. + * + * @return The updated {@link BlogPostInfo} + */ + BlogPostInfo updateBlogPost(BlogPostInfo post); + + /** + * Deletes an existing {@link BlogPostInfo} from the repository. + */ + void deleteBlogPost(BlogPostInfo post); + + /** + * Gets the draft blog posts created by the specified user. + * + * @param siteShortName the name of the site to add the post to. + * @param username to limit results to blogs with this cm:creator. null means all users. + * @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 getDrafts(String siteShortName, String username, PagingRequest pagingReq); + /** * Gets the draft blog posts created by the specified user. * @@ -69,6 +107,22 @@ public interface BlogService */ PagingResults getDrafts(NodeRef blogContainerNode, String username, PagingRequest pagingReq); + /** + * Gets the (internally, Alfresco-) published blog posts. + * + * @param siteShortName the name of the site to add the post to. + * @param fromDate an inclusive date limit for the results (more recent than). + * @param toDate an inclusive date limit for the results (before). + * @param byUser if not null limits results to posts by the specified user. + * if null results will be by all users. + * @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 getPublished(String siteShortName, Date fromDate, Date toDate, String byUser, PagingRequest pagingReq); + /** * Gets the (internally, Alfresco-) published blog posts. * @@ -85,6 +139,18 @@ public interface BlogService */ PagingResults getPublished(NodeRef blogContainerNode, Date fromDate, Date toDate, String byUser, PagingRequest pagingReq); + /** + * Gets blog posts published externally (i.e. to an external blog hosting site). + * + * @param siteShortName the name of the site to add the post to. + * @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 getPublishedExternally(String siteShortName, PagingRequest pagingReq); + /** * Gets blog posts published externally (i.e. to an external blog hosting site). * @@ -113,6 +179,22 @@ public interface BlogService */ PagingResults getMyDraftsAndAllPublished(NodeRef blogContainerNode, Date fromDate, Date toDate, PagingRequest pagingReq); + /** + * Finds blog posts by the specified user tagged with the given tag string. This method allows date ranges to be applied to any valid + * {@link DataTypeDefinition#DATE} or {@link DataTypeDefinition#DATETIME} property. Examples include {@link ContentModel#PROP_CREATED} or + * {@link ContentModel#PROP_PUBLISHED}. + * + * @param siteShortName the name of the site to add the post to. + * @param dateRange a {@link RangedDateProperty} parameter object. Can be null. + * @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 findBlogPosts(String siteShortName, RangedDateProperty dateRange, String tag, PagingRequest pagingReq); + /** * Finds blog posts by the specified user tagged with the given tag string. This method allows date ranges to be applied to any valid * {@link DataTypeDefinition#DATE} or {@link DataTypeDefinition#DATETIME} property. Examples include {@link ContentModel#PROP_CREATED} or @@ -134,44 +216,11 @@ public interface BlogService * * @param blogPostNode a NodeRef representing a blog-post. * @return true if it is a draft post, else false. + * + * @deprecated Add this to the BlogPostInfo shortly */ boolean isDraftBlogPost(NodeRef blogPostNode); - /** - * A simple data object for storage of blog-related data. - * - * @author Neil Mc Erlean - * @since 4.0 - */ - public class BlogPostInfo implements PermissionCheckValue - { - private final NodeRef nodeRef; - private final String name; - - public BlogPostInfo(NodeRef nodeRef, String name) - { - this.nodeRef = nodeRef; - this.name = name; - } - /** - * Gets the NodeRef representing this blog-post. - */ - @Override - public NodeRef getNodeRef() - { - return nodeRef; - } - - /** - * Gets the {@link ContentModel#PROP_NAME cm:name} of the blog post. - * @return - */ - public String getName() - { - return name; - } - } - /** * A simple data object for expressing a date range search parameter. */