mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
ALF-9153 Start on unit tests for the new Discussions Service
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29715 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -10,8 +10,9 @@
|
|||||||
<import resource="classpath*:alfresco/portlets-context.xml"/>
|
<import resource="classpath*:alfresco/portlets-context.xml"/>
|
||||||
<import resource="classpath:alfresco/blog-context.xml"/>
|
<import resource="classpath:alfresco/blog-context.xml"/>
|
||||||
<import resource="classpath:alfresco/calendar-services-context.xml"/>
|
<import resource="classpath:alfresco/calendar-services-context.xml"/>
|
||||||
<import resource="classpath:alfresco/links-services-context.xml"/>
|
|
||||||
<import resource="classpath:alfresco/comment-services-context.xml"/>
|
<import resource="classpath:alfresco/comment-services-context.xml"/>
|
||||||
|
<import resource="classpath:alfresco/discussions-services-context.xml"/>
|
||||||
|
<import resource="classpath:alfresco/links-services-context.xml"/>
|
||||||
<import resource="classpath:alfresco/rating-services-context.xml"/>
|
<import resource="classpath:alfresco/rating-services-context.xml"/>
|
||||||
<import resource="classpath:alfresco/rendition-services-context.xml"/>
|
<import resource="classpath:alfresco/rendition-services-context.xml"/>
|
||||||
<import resource="classpath:alfresco/replication-services-context.xml"/>
|
<import resource="classpath:alfresco/replication-services-context.xml"/>
|
||||||
|
65
config/alfresco/discussions-services-context.xml
Normal file
65
config/alfresco/discussions-services-context.xml
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
|
||||||
|
|
||||||
|
<beans>
|
||||||
|
|
||||||
|
<!-- Discussions Service -->
|
||||||
|
<bean id="DiscussionService" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||||
|
<property name="proxyInterfaces">
|
||||||
|
<value>org.alfresco.service.cmr.discussion.DiscussionService</value>
|
||||||
|
</property>
|
||||||
|
<property name="target">
|
||||||
|
<ref bean="discussionService" />
|
||||||
|
</property>
|
||||||
|
<property name="interceptorNames">
|
||||||
|
<list>
|
||||||
|
<idref local="DiscussionService_transaction" />
|
||||||
|
<idref bean="AuditMethodInterceptor" />
|
||||||
|
<idref bean="exceptionTranslator" />
|
||||||
|
<idref bean="DiscussionService_security" />
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<!-- Discussions service transaction bean -->
|
||||||
|
<bean id="DiscussionService_transaction"
|
||||||
|
class="org.springframework.transaction.interceptor.TransactionInterceptor">
|
||||||
|
<property name="transactionManager">
|
||||||
|
<ref bean="transactionManager" />
|
||||||
|
</property>
|
||||||
|
<property name="transactionAttributes">
|
||||||
|
<props>
|
||||||
|
<prop key="*">${server.transaction.mode.default}</prop>
|
||||||
|
</props>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<!-- List of Discussion Canned queries -->
|
||||||
|
<bean id="discussionCannedQueryRegistry" class="org.alfresco.util.registry.NamedObjectRegistry">
|
||||||
|
<property name="storageType" value="org.alfresco.query.CannedQueryFactory"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<!-- The regular GetChildren Auditable Canned Query Factory -->
|
||||||
|
<!--
|
||||||
|
<bean name="discussionGetChildrenCannedQueryFactory" class="org.alfresco.repo.node.getchildren.GetChildrenAuditableCannedQueryFactory">
|
||||||
|
<property name="registry" ref="discussionCannedQueryRegistry"/>
|
||||||
|
<property name="tenantService" ref="tenantService"/>
|
||||||
|
<property name="nodeDAO" ref="nodeDAO"/>
|
||||||
|
<property name="qnameDAO" ref="qnameDAO"/>
|
||||||
|
<property name="cannedQueryDAO" ref="cannedQueryDAO"/>
|
||||||
|
<property name="methodSecurity" ref="DiscussionService_security_listPosts"/>
|
||||||
|
</bean>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Discussion Service base bean -->
|
||||||
|
<bean id="discussionService" class="org.alfresco.repo.discussion.DiscussionServiceImpl">
|
||||||
|
<property name="nodeService" ref="NodeService"/>
|
||||||
|
<property name="siteService" ref="SiteService"/>
|
||||||
|
<property name="contentService" ref="ContentService"/>
|
||||||
|
<property name="taggingService" ref="TaggingService"/>
|
||||||
|
<property name="fileFolderService" ref="FileFolderService"/>
|
||||||
|
<property name="transactionService" ref="transactionService" />
|
||||||
|
<property name="cannedQueryRegistry" ref="wikiCannedQueryRegistry" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
</beans>
|
@@ -1057,6 +1057,33 @@
|
|||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ========================= -->
|
||||||
|
<!-- The Discussions Services -->
|
||||||
|
<!-- ========================= -->
|
||||||
|
|
||||||
|
<!-- The discussion service itself does not require any security restrictions, -->
|
||||||
|
<!-- they are imposed by the node and site services it uses to do its work. -->
|
||||||
|
<bean id="DiscussionService_security" class="org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor" />
|
||||||
|
|
||||||
|
<!-- The canned queries that the discussion services use do however need to check -->
|
||||||
|
<bean id="DiscussionService_CannedQuery_security" class="org.alfresco.repo.security.permissions.impl.acegi.MethodSecurityInterceptor">
|
||||||
|
<property name="authenticationManager"><ref bean="authenticationManager"/></property>
|
||||||
|
<property name="accessDecisionManager"><ref local="accessDecisionManager"/></property>
|
||||||
|
<property name="afterInvocationManager"><ref local="afterInvocationManager"/></property>
|
||||||
|
<property name="objectDefinitionSource">
|
||||||
|
<value>
|
||||||
|
org.alfresco.service.cmr.discussion.DiscussionService.listPosts=ACL_ALLOW,AFTER_ACL_NODE.sys:base.ReadProperties
|
||||||
|
</value>
|
||||||
|
</property>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<bean id="DiscussionService_security_listPosts" class="org.alfresco.repo.security.permissions.impl.acegi.MethodSecurityBean">
|
||||||
|
<property name="methodSecurityInterceptor" ref="DiscussionService_CannedQuery_security" />
|
||||||
|
<property name="service" value="org.alfresco.service.cmr.discussion.DiscussionService" />
|
||||||
|
<property name="methodName" value="listPosts" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
|
||||||
<!-- ======================== -->
|
<!-- ======================== -->
|
||||||
<!-- Repository Admin Service -->
|
<!-- Repository Admin Service -->
|
||||||
<!-- ======================== -->
|
<!-- ======================== -->
|
||||||
|
@@ -298,18 +298,31 @@ public class DiscussionServiceImpl implements DiscussionService
|
|||||||
throw new IllegalArgumentException("Can't create posts for a topic that was never persisted!");
|
throw new IllegalArgumentException("Can't create posts for a topic that was never persisted!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Are we going to be the primary post?
|
||||||
|
boolean isPrimary = false;
|
||||||
|
if(getPrimaryPost(topic) == null)
|
||||||
|
{
|
||||||
|
isPrimary = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Decide on the name. If this is the first post in a topic,
|
// Decide on the name. If this is the first post in a topic,
|
||||||
// it should share the topic's name, otherwise needs a new one
|
// it should share the topic's name, otherwise needs a new one
|
||||||
String name = generateName();
|
String name = generateName();
|
||||||
if(getPrimaryPost(topic) == null)
|
if(isPrimary)
|
||||||
{
|
{
|
||||||
name = topic.getSystemName();
|
name = topic.getSystemName();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the properties for the node
|
// Create the properties for the node
|
||||||
Map<QName, Serializable> props = new HashMap<QName, Serializable>();
|
Map<QName, Serializable> props = new HashMap<QName, Serializable>();
|
||||||
props.put(ContentModel.PROP_NAME, name);
|
props.put(ContentModel.PROP_NAME, name);
|
||||||
props.put(ContentModel.PROP_TITLE, topic.getTitle());
|
|
||||||
|
// Do we want a title? By default, primary posts share a title
|
||||||
|
// with the topic, but replies are title-free
|
||||||
|
if(isPrimary)
|
||||||
|
{
|
||||||
|
props.put(ContentModel.PROP_TITLE, topic.getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
// Build the node
|
// Build the node
|
||||||
NodeRef nodeRef = nodeService.createNode(
|
NodeRef nodeRef = nodeService.createNode(
|
||||||
@@ -329,6 +342,31 @@ public class DiscussionServiceImpl implements DiscussionService
|
|||||||
// Build it that way, so creator and created date come through
|
// Build it that way, so creator and created date come through
|
||||||
return buildPost(nodeRef, topic, name, contents);
|
return buildPost(nodeRef, topic, name, contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PostInfo createReply(PostInfo parentPost, String contents)
|
||||||
|
{
|
||||||
|
// Sanity check what we were given
|
||||||
|
if(parentPost.getNodeRef() == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Can't reply to a post that was never persisted");
|
||||||
|
}
|
||||||
|
if(parentPost.getTopic() == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Can't reply to a post with no attached topic");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Have the post created
|
||||||
|
PostInfo reply = createPost(parentPost.getTopic(), contents);
|
||||||
|
|
||||||
|
// Now make it a reply
|
||||||
|
nodeService.createAssociation(
|
||||||
|
reply.getNodeRef(), parentPost.getNodeRef(), ContentModel.ASSOC_REFERENCES
|
||||||
|
);
|
||||||
|
|
||||||
|
// All done
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -467,7 +505,7 @@ public class DiscussionServiceImpl implements DiscussionService
|
|||||||
PostInfo post = getPost(topic, topic.getSystemName());
|
PostInfo post = getPost(topic, topic.getSystemName());
|
||||||
if(post != null)
|
if(post != null)
|
||||||
{
|
{
|
||||||
return null;
|
return post;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cater for the explorer case, we want the first child
|
// Cater for the explorer case, we want the first child
|
||||||
@@ -484,6 +522,35 @@ public class DiscussionServiceImpl implements DiscussionService
|
|||||||
return buildPost(postNodeRef, topic, postName, null);
|
return buildPost(postNodeRef, topic, postName, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PagingResults<TopicInfo> listTopics(String siteShortName,
|
||||||
|
PagingRequest paging) {
|
||||||
|
NodeRef container = getSiteWikiContainer(siteShortName, false);
|
||||||
|
if(container == null)
|
||||||
|
{
|
||||||
|
// No topics
|
||||||
|
return new EmptyPagingResults<TopicInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We can now fetch by parent nodeRef
|
||||||
|
return listTopics(container, paging);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PagingResults<TopicInfo> listTopics(NodeRef nodeRef,
|
||||||
|
PagingRequest paging) {
|
||||||
|
// TODO
|
||||||
|
return new EmptyPagingResults<TopicInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PagingResults<PostInfo> listPosts(TopicInfo topic, PagingRequest paging)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
return new EmptyPagingResults<PostInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PagingResults<PostInfo> listPostReplies(PostInfo primaryPost,
|
public PagingResults<PostInfo> listPostReplies(PostInfo primaryPost,
|
||||||
|
@@ -33,13 +33,28 @@ import org.alfresco.service.cmr.repository.NodeRef;
|
|||||||
public interface DiscussionService {
|
public interface DiscussionService {
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link PostInfo} in the given topic,
|
* Creates a new {@link PostInfo} in the given topic,
|
||||||
* specified contents
|
* with the specified contents.
|
||||||
|
* Normally only one post is created this way on a topic,
|
||||||
|
* and the remainder of the posts are created as
|
||||||
|
* replies to the {@link #getPrimaryPost(TopicInfo)}
|
||||||
|
* primary post.
|
||||||
*
|
*
|
||||||
* @return The newly created {@link PostInfo}
|
* @return The newly created {@link PostInfo}
|
||||||
*/
|
*/
|
||||||
@NotAuditable
|
@NotAuditable
|
||||||
PostInfo createPost(TopicInfo topic, String contents);
|
PostInfo createPost(TopicInfo topic, String contents);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link PostInfo} which is a reply to
|
||||||
|
* the specified other post, with the given contents.
|
||||||
|
* The link between the parent post and the reply is
|
||||||
|
* created as part of this.
|
||||||
|
*
|
||||||
|
* @return The newly created {@link PostInfo}
|
||||||
|
*/
|
||||||
|
@NotAuditable
|
||||||
|
PostInfo createReply(PostInfo parentPost, String contents);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link TopicInfo} in the given site
|
* Creates a new {@link TopicInfo} in the given site
|
||||||
*/
|
*/
|
||||||
@@ -113,6 +128,24 @@ public interface DiscussionService {
|
|||||||
TopicInfo getTopic(NodeRef parentNodeRef, String topicName);
|
TopicInfo getTopic(NodeRef parentNodeRef, String topicName);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves all topics in a site
|
||||||
|
*/
|
||||||
|
@NotAuditable
|
||||||
|
PagingResults<TopicInfo> listTopics(String siteShortName, PagingRequest paging);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves all topics attached to the specified Node
|
||||||
|
*/
|
||||||
|
@NotAuditable
|
||||||
|
PagingResults<TopicInfo> listTopics(NodeRef nodeRef, PagingRequest paging);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves all posts in a topic, ordered by creation date
|
||||||
|
*/
|
||||||
|
@NotAuditable
|
||||||
|
PagingResults<PostInfo> listPosts(TopicInfo topic, PagingRequest paging);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves all replies on a Topic
|
* Retrieves all replies on a Topic
|
||||||
*/
|
*/
|
||||||
@@ -126,13 +159,13 @@ public interface DiscussionService {
|
|||||||
PagingResults<PostInfo> listPostReplies(PostInfo primaryPost, int levels, PagingRequest paging);
|
PagingResults<PostInfo> listPostReplies(PostInfo primaryPost, int levels, PagingRequest paging);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves all posts in a site
|
* Retrieves all posts in a site, across all topics
|
||||||
*/
|
*/
|
||||||
@NotAuditable
|
@NotAuditable
|
||||||
PagingResults<PostInfo> listPosts(String siteShortName, PagingRequest paging);
|
PagingResults<PostInfo> listPosts(String siteShortName, PagingRequest paging);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves all posts attached to the specified Node
|
* Retrieves all posts attached to the specified Node, across all topics
|
||||||
*/
|
*/
|
||||||
@NotAuditable
|
@NotAuditable
|
||||||
PagingResults<PostInfo> listPosts(NodeRef nodeRef, PagingRequest paging);
|
PagingResults<PostInfo> listPosts(NodeRef nodeRef, PagingRequest paging);
|
||||||
|
Reference in New Issue
Block a user