diff --git a/source/java/org/alfresco/repo/forum/CommentService.java b/source/java/org/alfresco/repo/forum/CommentService.java
index 73e8b6c0e4..a673e911bf 100644
--- a/source/java/org/alfresco/repo/forum/CommentService.java
+++ b/source/java/org/alfresco/repo/forum/CommentService.java
@@ -38,12 +38,10 @@ public interface CommentService
* {@link ForumModel#ASPECT_DISCUSSABLE fm:discussable} aspect.
*
* @param descendantNodeRef The nodeRef which descends from the f:discussable node.
- * @param expectedNodeType if not null, this is an assertion by calling code that the descendantNodeRef
- * is of the specified type.
* @return the fm:discussable ancestor if there is one, else null
* @throws AlfrescoRuntimeException if the specified expectedNodeType is not correct.
*/
- NodeRef getDiscussableAncestor(NodeRef descendantNodeRef, QName expectedNodeType);
+ NodeRef getDiscussableAncestor(NodeRef descendantNodeRef);
/**
* This method retrieves the {@link ForumModel#TYPE_TOPIC fm:topic} NodeRef which holds the Share comments for
diff --git a/source/java/org/alfresco/repo/forum/CommentServiceImpl.java b/source/java/org/alfresco/repo/forum/CommentServiceImpl.java
index 78a1a67ca9..491cd1247f 100644
--- a/source/java/org/alfresco/repo/forum/CommentServiceImpl.java
+++ b/source/java/org/alfresco/repo/forum/CommentServiceImpl.java
@@ -49,27 +49,38 @@ public class CommentServiceImpl implements CommentService
}
@Override
- public NodeRef getDiscussableAncestor(NodeRef descendantNodeRef, QName expectedNodeType)
+ public NodeRef getDiscussableAncestor(NodeRef descendantNodeRef)
{
- final QName actualNodeType = nodeService.getType(descendantNodeRef);
- if (expectedNodeType != null && !actualNodeType.equals(expectedNodeType))
- {
- StringBuilder msg = new StringBuilder();
- msg.append("Node ").append(descendantNodeRef)
- .append(" is of type ").append(actualNodeType)
- .append(", not ").append(expectedNodeType);
- throw new AlfrescoRuntimeException(msg.toString());
- }
+ // For "Share comments" i.e. fm:post nodes created via the Share commenting UI, the containment structure is as follows:
+ // fm:discussable
+ // - fm:forum
+ // - fm:topic
+ // - fm:post
+ // For other fm:post nodes the ancestor structure may be slightly different. (cf. Share discussions, which don't have 'forum')
+ //
+ // In order to ensure that we only return the discussable ancestor relevant to Share comments, we'll climb the
+ // containment tree in a controlled manner.
+ // We could navigate up looking for the first fm:discussable ancestor, but that might not find the correct node - it could,
+ // for example, find a parent folder which was discussable.
NodeRef result = null;
- for (ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(descendantNodeRef);
- parentAssoc != null && parentAssoc.getParentRef() != null;
- parentAssoc = nodeService.getPrimaryParent(parentAssoc.getParentRef()))
+ if (nodeService.getType(descendantNodeRef).equals(ForumModel.TYPE_POST))
{
- if (nodeService.hasAspect(parentAssoc.getParentRef(), ForumModel.ASPECT_DISCUSSABLE))
+ NodeRef topicNode = nodeService.getPrimaryParent(descendantNodeRef).getParentRef();
+
+ if (nodeService.getType(topicNode).equals(ForumModel.TYPE_TOPIC))
{
- result = parentAssoc.getParentRef();
- break;
+ NodeRef forumNode = nodeService.getPrimaryParent(topicNode).getParentRef();
+
+ if (nodeService.getType(forumNode).equals(ForumModel.TYPE_FORUM))
+ {
+ NodeRef discussableNode = nodeService.getPrimaryParent(forumNode).getParentRef();
+
+ if (nodeService.hasAspect(discussableNode, ForumModel.ASPECT_DISCUSSABLE))
+ {
+ result = discussableNode;
+ }
+ }
}
}
diff --git a/source/java/org/alfresco/repo/forum/ForumPostBehaviours.java b/source/java/org/alfresco/repo/forum/ForumPostBehaviours.java
index b95ff12e35..10d8179d05 100644
--- a/source/java/org/alfresco/repo/forum/ForumPostBehaviours.java
+++ b/source/java/org/alfresco/repo/forum/ForumPostBehaviours.java
@@ -196,7 +196,7 @@ public class ForumPostBehaviours implements NodeServicePolicies.OnCreateNodePoli
{
// We have a new or a deleted comment under a discussable node.
// We need to find the fm:commentsCount ancestor to this comment node and adjust its commentCount
- NodeRef discussableAncestor = commentService.getDiscussableAncestor(fmPostNode, ForumModel.TYPE_POST);
+ NodeRef discussableAncestor = commentService.getDiscussableAncestor(fmPostNode);
if (discussableAncestor != null)
{