diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml index 29f3291417..f1bd9ed043 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml @@ -78,6 +78,7 @@ class="org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordCopyBehaviours" init-method="init"> + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/behaviour/RecordCopyBehaviours.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/behaviour/RecordCopyBehaviours.java index b6b7585c79..db54aa0ee2 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/behaviour/RecordCopyBehaviours.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/behaviour/RecordCopyBehaviours.java @@ -18,7 +18,6 @@ */ package org.alfresco.module.org_alfresco_module_rm.model.behaviour; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -26,11 +25,12 @@ import java.util.Map; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry; import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService; +import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; -import org.alfresco.repo.copy.AbstractCopyBehaviourCallback; import org.alfresco.repo.copy.CopyBehaviourCallback; import org.alfresco.repo.copy.CopyDetails; import org.alfresco.repo.copy.DoNothingCopyBehaviourCallback; +import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.policy.Behaviour.NotificationFrequency; @@ -51,6 +51,9 @@ public class RecordCopyBehaviours implements RecordsManagementModel /** The policy component */ private PolicyComponent policyComponent; + /** The Behaviour Filter */ + private BehaviourFilter behaviourFilter; + /** The rm service registry */ private RecordsManagementServiceRegistry rmServiceRegistry; @@ -67,6 +70,16 @@ public class RecordCopyBehaviours implements RecordsManagementModel this.policyComponent = policyComponent; } + /** + * Set the behaviour Filter + * + * @param behaviourFilter + */ + public void setBehaviourFilter(BehaviourFilter behaviourFilter) + { + this.behaviourFilter = behaviourFilter; + } + /** * Set the rm service registry. * @@ -98,7 +111,19 @@ public class RecordCopyBehaviours implements RecordsManagementModel this.policyComponent.bindClassBehaviour( QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"), ASPECT_RECORD_COMPONENT_ID, - new JavaBehaviour(this, "getIdCallback")); + new JavaBehaviour(this, "getDoNothingCopyCallback")); + + //On Copy we need a new ID + this.policyComponent.bindClassBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, "onCopyComplete"), + ASPECT_RECORD_COMPONENT_ID, + new JavaBehaviour(this, "generateId", NotificationFrequency.TRANSACTION_COMMIT)); + + //Don't copy the Aspect Record -- it should be regenerated + this.policyComponent.bindClassBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"), + ASPECT_RECORD, + new JavaBehaviour(this, "getDoNothingCopyCallback")); // Move behaviour this.policyComponent.bindClassBehaviour( @@ -108,7 +133,7 @@ public class RecordCopyBehaviours implements RecordsManagementModel this.policyComponent.bindClassBehaviour( QName.createQName(NamespaceService.ALFRESCO_URI, "onMoveNode"), RecordsManagementModel.TYPE_RECORD_FOLDER, - new JavaBehaviour(this, "onMoveRecordFolderNode", NotificationFrequency.FIRST_EVENT)); + new JavaBehaviour(this, "onMoveRecordFolderNode", NotificationFrequency.FIRST_EVENT)); } /** @@ -219,33 +244,28 @@ public class RecordCopyBehaviours implements RecordsManagementModel return new DoNothingCopyBehaviourCallback(); } - public CopyBehaviourCallback getIdCallback(QName classRef, CopyDetails copyDetails) + /** + * Generate and set a new ID for copy of a record + * + * @param classRef + * @param sourceNodeRef + * @param targetNodeRef + * @param copyToNewNode + * @param copyMap + */ + @SuppressWarnings("rawtypes") + public void generateId(QName classRef, NodeRef sourceNodeRef, NodeRef targetNodeRef, boolean copyToNewNode, Map copyMap) { - return new AbstractCopyBehaviourCallback() - { - public ChildAssocCopyAction getChildAssociationCopyAction( - QName classQName, - CopyDetails copyDetails, - CopyChildAssociationDetails childAssocCopyDetails) - { - return null; - } - - public Map getCopyProperties( - QName classQName, - CopyDetails copyDetails, - Map properties) - { - properties.put(PROP_IDENTIFIER, properties.get(PROP_IDENTIFIER) + "1"); - return properties; - } - - public boolean getMustCopy(QName classQName, CopyDetails copyDetails) - { - return true; - } - - }; + final IdentifierService rmIdentifierService = rmServiceRegistry.getIdentifierService(); + final NodeService nodeService = rmServiceRegistry.getNodeService(); + + //Generate the id for the copy + String id = rmIdentifierService.generateIdentifier(nodeService.getType(nodeService.getPrimaryParent(targetNodeRef).getParentRef()), (nodeService.getPrimaryParent(targetNodeRef).getParentRef())); + + //We need to allow the id to be overwritten disable the policy protecting changes to the id + behaviourFilter.disableBehaviour(targetNodeRef, ASPECT_RECORD_COMPONENT_ID); + nodeService.setProperty(targetNodeRef, PROP_IDENTIFIER, id); + behaviourFilter.enableBehaviour(targetNodeRef, ASPECT_RECORD_COMPONENT_ID); } /**