diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index de5519decd..15bc2da71f 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -103,6 +103,7 @@ + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RetainAction.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RetainAction.java index 8116c18715..1820a83421 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RetainAction.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RetainAction.java @@ -38,6 +38,11 @@ import org.alfresco.service.cmr.repository.NodeRef; */ public class RetainAction extends RMDispositionActionExecuterAbstractBase { + /** + * Action name + */ + public static final String NAME = "retain"; + @Override protected void executeRecordFolderLevelDisposition(Action action, NodeRef recordFolder) { diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index e06c808fb5..b7145500ee 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -57,6 +57,9 @@ import org.alfresco.repo.policy.annotation.BehaviourBean; import org.alfresco.repo.policy.annotation.BehaviourKind; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.repo.transaction.AlfrescoTransactionSupport; +import org.alfresco.repo.transaction.AlfrescoTransactionSupport.TxnReadState; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -65,6 +68,7 @@ import org.alfresco.service.cmr.repository.Period; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; +import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.ParameterCheck; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -115,6 +119,9 @@ public class DispositionServiceImpl extends ServiceBaseImpl /** Freeze Service */ private FreezeService freezeService; + /** Transaction service */ + private TransactionService transactionService; + /** Disposition properties */ private Map dispositionProperties = new HashMap(4); @@ -192,6 +199,14 @@ public class DispositionServiceImpl extends ServiceBaseImpl this.freezeService = freezeService; } + /** + * @param transactionService transaction service + */ + public void setTransactionService(TransactionService transactionService) + { + this.transactionService = transactionService; + } + /** * Behavior to initialize the disposition schedule of a newly filed record. * @@ -408,7 +423,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef dsNodeRef = getAssociatedDispositionScheduleImpl(nodeRef); if (dsNodeRef != null) { - // Cerate disposition schedule object + // Create disposition schedule object ds = new DispositionScheduleImpl(serviceRegistry, nodeService, dsNodeRef); } } @@ -700,7 +715,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl * @param dispositionActionDefinition disposition action definition * @param allowContextFromAsOf true if the context date is allowed to be obtained from the disposition "as of" property. */ - private DispositionAction initialiseDispositionAction(NodeRef nodeRef, DispositionActionDefinition dispositionActionDefinition, boolean allowContextFromAsOf) + private DispositionAction initialiseDispositionAction(final NodeRef nodeRef, DispositionActionDefinition dispositionActionDefinition, boolean allowContextFromAsOf) { List childAssocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, ASSOC_NEXT_DISPOSITION_ACTION, 1, true); if (childAssocs != null && childAssocs.size() > 0) @@ -709,7 +724,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl } // Create the properties - Map props = new HashMap(10); + final Map props = new HashMap(10); Date asOfDate = calculateAsOfDate(nodeRef, dispositionActionDefinition, allowContextFromAsOf); @@ -721,14 +736,23 @@ public class DispositionServiceImpl extends ServiceBaseImpl props.put(PROP_DISPOSITION_AS_OF, asOfDate); } - // Create a new disposition action object - NodeRef dispositionActionNodeRef = this.nodeService.createNode( - nodeRef, - ASSOC_NEXT_DISPOSITION_ACTION, - ASSOC_NEXT_DISPOSITION_ACTION, - TYPE_DISPOSITION_ACTION, - props).getChildRef(); - DispositionAction da = new DispositionActionImpl(serviceRegistry, dispositionActionNodeRef); + DispositionAction da; + // check if current transaction is a READ ONLY one and if true create the node in a READ WRITE transaction + if (AlfrescoTransactionSupport.getTransactionReadState().equals(TxnReadState.TXN_READ_ONLY)) + { + da = + transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + public DispositionAction execute() throws Throwable + { + return createDispositionAction(nodeRef, props); + } + }, false, true); + } + else + { + da = createDispositionAction(nodeRef, props); + } // Create the events List events = dispositionActionDefinition.getEvents(); @@ -740,6 +764,24 @@ public class DispositionServiceImpl extends ServiceBaseImpl return da; } + /** Creates a new disposition action object + * + * @param nodeRef node reference + * @param props properties of the disposition action to be created + * @return the disposition action object + */ + private DispositionAction createDispositionAction(final NodeRef nodeRef, Map props) + { + NodeRef dispositionActionNodeRef = nodeService.createNode( + nodeRef, + ASSOC_NEXT_DISPOSITION_ACTION, + ASSOC_NEXT_DISPOSITION_ACTION, + TYPE_DISPOSITION_ACTION, + props).getChildRef(); + + return new DispositionActionImpl(serviceRegistry, dispositionActionNodeRef); + } + /** * Compute the "disposition as of" date (if necessary) for a disposition action and a node. *