diff --git a/source/java/org/alfresco/repo/forms/processor/NodeHandler.java b/source/java/org/alfresco/repo/forms/processor/NodeHandler.java index 42f0ac0b63..c641fafc93 100644 --- a/source/java/org/alfresco/repo/forms/processor/NodeHandler.java +++ b/source/java/org/alfresco/repo/forms/processor/NodeHandler.java @@ -45,6 +45,7 @@ import org.alfresco.repo.forms.AssociationFieldDefinition.Direction; import org.alfresco.repo.forms.FormData.FieldData; import org.alfresco.repo.forms.PropertyFieldDefinition.FieldConstraint; import org.alfresco.service.cmr.dictionary.AssociationDefinition; +import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition; import org.alfresco.service.cmr.dictionary.Constraint; import org.alfresco.service.cmr.dictionary.ConstraintDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; @@ -114,10 +115,10 @@ public class NodeHandler extends AbstractHandler /** * A regular expression which can be used to match association names. - * These names will look like "assoc:cm:references". - * The pattern can also be used to extract the "cm" and the "name" parts. + * These names will look like "assoc:cm:references_added". + * The pattern can also be used to extract the "cm", the "name" and the suffix parts. */ - protected Pattern associationNamePattern = Pattern.compile(ASSOC_PREFIX + "(.*){1}?:(.*){1}?"); + protected Pattern associationNamePattern = Pattern.compile(ASSOC_PREFIX + "(.*){1}?:(.*){1}?(_[a-zA-Z]+)"); /** * Sets the node service @@ -226,6 +227,8 @@ public class NodeHandler extends AbstractHandler QName type = this.nodeService.getType(nodeRef); Collection aspects = this.getAspectsToInclude(nodeRef); TypeDefinition typeDef = this.dictionaryService.getAnonymousType(type, aspects); + Map assocDefs = typeDef.getAssociations(); + Map childAssocDefs = typeDef.getChildAssociations(); Map propDefs = typeDef.getProperties(); Map propsToPersist = new HashMap(data.getData().size()); @@ -245,7 +248,7 @@ public class NodeHandler extends AbstractHandler } else if (fieldName.startsWith(ASSOC_PREFIX)) { - processAssociationPersist(nodeRef, fieldData, assocsToPersist); + processAssociationPersist(nodeRef, assocDefs, fieldData, assocsToPersist); } else if (logger.isWarnEnabled()) { @@ -626,7 +629,7 @@ public class NodeHandler extends AbstractHandler * @param fieldData Data to persist for the associations * @param assocCommands List of associations to be persisted */ - protected void processAssociationPersist(NodeRef nodeRef, + protected void processAssociationPersist(NodeRef nodeRef, Map assocDefs, FieldData fieldData, List assocCommands) { if (logger.isDebugEnabled()) @@ -636,6 +639,21 @@ public class NodeHandler extends AbstractHandler Matcher m = this.associationNamePattern.matcher(fieldName); if (m.matches()) { + String qNamePrefix = m.group(1); + String localName = m.group(2); + String assocSuffix = m.group(3); + + QName fullQName = QName.createQName(qNamePrefix, localName, namespaceService); + + // ensure that the association being persisted is defined in the model + AssociationDefinition assocDef = assocDefs.get(fullQName); + + if (assocDef == null) + { + // TODO do what? return? + return; + } + String value = (String)fieldData.getValue(); String[] nodeRefs = value.split(","); @@ -645,13 +663,13 @@ public class NodeHandler extends AbstractHandler { if (NodeRef.isNodeRef(nextTargetNode)) { - if (fieldName.endsWith(ASSOC_ADD_SUFFIX)) + if (assocSuffix.equals(ASSOC_ADD_SUFFIX)) { - assocCommands.add(new AddAssocCommand(nodeRef, new NodeRef(nextTargetNode))); + assocCommands.add(new AddAssocCommand(nodeRef, new NodeRef(nextTargetNode), fullQName)); } - else if (fieldName.endsWith(ASSOC_REMOVE_SUFFIX)) + else if (assocSuffix.equals(ASSOC_REMOVE_SUFFIX)) { - assocCommands.add(new RemoveAssocCommand(nodeRef, new NodeRef(nextTargetNode))); + assocCommands.add(new RemoveAssocCommand(nodeRef, new NodeRef(nextTargetNode), fullQName)); } else { @@ -875,11 +893,13 @@ abstract class AbstractAssocCommand { protected final NodeRef sourceNodeRef; protected final NodeRef targetNodeRef; + protected final QName assocQName; - public AbstractAssocCommand(NodeRef sourceNodeRef, NodeRef targetNodeRef) + public AbstractAssocCommand(NodeRef sourceNodeRef, NodeRef targetNodeRef, QName assocQName) { this.sourceNodeRef = sourceNodeRef; this.targetNodeRef = targetNodeRef; + this.assocQName = assocQName; } /** @@ -898,15 +918,15 @@ abstract class AbstractAssocCommand class AddAssocCommand extends AbstractAssocCommand { private static final Log logger = LogFactory.getLog(AddAssocCommand.class); - public AddAssocCommand(NodeRef sourceNodeRef, NodeRef targetNodeRef) + public AddAssocCommand(NodeRef sourceNodeRef, NodeRef targetNodeRef, QName assocQName) { - super(sourceNodeRef, targetNodeRef); + super(sourceNodeRef, targetNodeRef, assocQName); } @Override protected void updateAssociations(NodeService nodeService) { - List existingAssocs = nodeService.getTargetAssocs(sourceNodeRef, ContentModel.ASSOC_REFERENCES); + List existingAssocs = nodeService.getTargetAssocs(sourceNodeRef, assocQName); for (AssociationRef assoc : existingAssocs) { if (assoc.getTargetRef().equals(targetNodeRef)) @@ -918,7 +938,7 @@ class AddAssocCommand extends AbstractAssocCommand return; } } - nodeService.createAssociation(sourceNodeRef, targetNodeRef, ContentModel.ASSOC_REFERENCES); + nodeService.createAssociation(sourceNodeRef, targetNodeRef, assocQName); } } @@ -930,15 +950,15 @@ class AddAssocCommand extends AbstractAssocCommand class RemoveAssocCommand extends AbstractAssocCommand { private static final Log logger = LogFactory.getLog(RemoveAssocCommand.class); - public RemoveAssocCommand(NodeRef sourceNodeRef, NodeRef targetNodeRef) + public RemoveAssocCommand(NodeRef sourceNodeRef, NodeRef targetNodeRef, QName assocQName) { - super(sourceNodeRef, targetNodeRef); + super(sourceNodeRef, targetNodeRef, assocQName); } @Override protected void updateAssociations(NodeService nodeService) { - List existingAssocs = nodeService.getTargetAssocs(sourceNodeRef, ContentModel.ASSOC_REFERENCES); + List existingAssocs = nodeService.getTargetAssocs(sourceNodeRef, assocQName); boolean assocDoesNotExist = true; for (AssociationRef assoc : existingAssocs) { @@ -957,12 +977,12 @@ class RemoveAssocCommand extends AbstractAssocCommand .append(sourceNodeRef) .append("|") .append(targetNodeRef) - .append(ContentModel.ASSOC_REFERENCES); + .append(assocQName); logger.warn(msg.toString()); } return; } - nodeService.removeAssociation(sourceNodeRef, targetNodeRef, ContentModel.ASSOC_REFERENCES); + nodeService.removeAssociation(sourceNodeRef, targetNodeRef, assocQName); } } \ No newline at end of file