mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
Fix/rm 6941 retention action on frozen nodes (#640)
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 Changes for retention action on frozen nodes [ags]
* RM-6941 added slf4j and junit test [ags]
* RM-6941 added slf4j and junit test [ags]
* RM-6941 added slf4j and junit test [ags]
* RM-6941 added slf4j and junit test [ags]
* RM-6941 added slf4j and test [ags]
* RM-6941 added slf4j and test [ags]
* RM-6941 added slf4j and test [ags]
* RM-6941 added slf4j and test [ags]
* RM-6941 added slf4j and test [ags]
* RM-6941 code change for test case [ags]
* RM-6941 code change for test case [ags]
* RM-6941 code change for test case [ags]
* RM-6941 change lombok dependency scope to compile [ags]
* Revert "RM-6941 change lombok dependency scope to compile [ags]"
This reverts commit 4cee68e8
* RM-6941 change lombok dependency scope to compile [ags]
* RM-6941 revert change lombok dependency scope to compile [ags]
* RM-6941 revert change lombok dependency scope to compile [ags]
This commit is contained in:
@@ -67,7 +67,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.testng.annotations.AfterClass;
|
import org.testng.annotations.AfterClass;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
import static org.apache.commons.httpclient.HttpStatus.SC_INTERNAL_SERVER_ERROR;
|
||||||
/**
|
/**
|
||||||
* API tests to check actions on frozen content
|
* API tests to check actions on frozen content
|
||||||
*
|
*
|
||||||
@@ -309,11 +309,11 @@ public class PreventActionsOnFrozenContentTests extends BaseRMRestTest
|
|||||||
|
|
||||||
STEP("Execute the retain action");
|
STEP("Execute the retain action");
|
||||||
rmRolesAndActionsAPI.executeAction(getAdminUser().getUsername(), getAdminUser().getPassword(), record.getName(),
|
rmRolesAndActionsAPI.executeAction(getAdminUser().getUsername(), getAdminUser().getPassword(), record.getName(),
|
||||||
RM_ACTIONS.END_RETENTION);
|
RM_ACTIONS.END_RETENTION, null, SC_INTERNAL_SERVER_ERROR);
|
||||||
|
|
||||||
STEP("Check the record search disposition properties");
|
STEP("Check the record search disposition properties");
|
||||||
Record recordUpdated = getRestAPIFactory().getRecordsAPI().getRecord(record.getId());
|
Record recordUpdated = getRestAPIFactory().getRecordsAPI().getRecord(record.getId());
|
||||||
assertTrue(recordUpdated.getProperties().getRecordSearchDispositionActionName().contains(RM_ACTIONS.DESTROY.getAction()));
|
assertTrue(recordUpdated.getProperties().getRecordSearchDispositionActionName().contains(RM_ACTIONS.END_RETENTION.getAction()));
|
||||||
assertTrue(recordUpdated.getProperties().getRecordSearchDispositionPeriod().contains("immediately"));
|
assertTrue(recordUpdated.getProperties().getRecordSearchDispositionPeriod().contains("immediately"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,4 +45,4 @@ rm.action.create.transfer.container.child-error-message=You can't create items i
|
|||||||
rm.action.create.transfer.child-error-message=You can't create items in Transfer Folders.
|
rm.action.create.transfer.child-error-message=You can't create items in Transfer Folders.
|
||||||
rm.action.create.record.folder.child-error-message=You can only create records in record folders and this was a {0}.
|
rm.action.create.record.folder.child-error-message=You can only create records in record folders and this was a {0}.
|
||||||
rm.action.transfer-non-editable=You can't edit transfer folder or container metadata.
|
rm.action.transfer-non-editable=You can't edit transfer folder or container metadata.
|
||||||
|
rm.action.node.frozen.error-message=Unable to perform action {0} because the node is frozen or has frozen children.
|
||||||
|
@@ -80,9 +80,7 @@
|
|||||||
<property name="searchService" ref="searchService" />
|
<property name="searchService" ref="searchService" />
|
||||||
<property name="personService" ref="personService" />
|
<property name="personService" ref="personService" />
|
||||||
<property name="recordsManagementActionService" ref="recordsManagementActionService" />
|
<property name="recordsManagementActionService" ref="recordsManagementActionService" />
|
||||||
<property name="recordFolderService" ref="RecordFolderService" />
|
<property name="freezeService" ref="freezeService"/>
|
||||||
<property name="recordService" ref="RecordService" />
|
|
||||||
<property name="freezeService" ref="FreezeService" />
|
|
||||||
<property name="batchSize" value="${rm.dispositionlifecycletrigger.batchsize}"/>
|
<property name="batchSize" value="${rm.dispositionlifecycletrigger.batchsize}"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
@@ -695,6 +695,13 @@
|
|||||||
init-method="init" depends-on="org_alfresco_module_rm_resourceBundles">
|
init-method="init" depends-on="org_alfresco_module_rm_resourceBundles">
|
||||||
<property name="policyComponent" ref="policyComponent"/>
|
<property name="policyComponent" ref="policyComponent"/>
|
||||||
<property name="nodeService" ref="nodeService"/>
|
<property name="nodeService" ref="nodeService"/>
|
||||||
|
<!-- list of disposition actions to automatically execute when eligible -->
|
||||||
|
<property name="retentionActions">
|
||||||
|
<list>
|
||||||
|
<value>retain</value>
|
||||||
|
</list>
|
||||||
|
</property>
|
||||||
|
<property name="freezeService" ref="freezeService"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="RecordsManagementActionService" class="org.springframework.aop.framework.ProxyFactoryBean">
|
<bean id="RecordsManagementActionService" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||||
@@ -899,6 +906,8 @@
|
|||||||
<bean id="freezeService" class="org.alfresco.module.org_alfresco_module_rm.freeze.FreezeServiceImpl" parent="baseService">
|
<bean id="freezeService" class="org.alfresco.module.org_alfresco_module_rm.freeze.FreezeServiceImpl" parent="baseService">
|
||||||
<property name="filePlanService" ref="FilePlanService" />
|
<property name="filePlanService" ref="FilePlanService" />
|
||||||
<property name="holdService" ref="HoldService" />
|
<property name="holdService" ref="HoldService" />
|
||||||
|
<property name="recordFolderService" ref="RecordFolderService"/>
|
||||||
|
<property name="recordService" ref="RecordService"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="FreezeService" class="org.springframework.aop.framework.ProxyFactoryBean">
|
<bean id="FreezeService" class="org.springframework.aop.framework.ProxyFactoryBean">
|
||||||
@@ -944,6 +953,7 @@
|
|||||||
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.hasFrozenChildren=RM_ALLOW
|
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.hasFrozenChildren=RM_ALLOW
|
||||||
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.getFreezeDate=RM_ALLOW
|
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.getFreezeDate=RM_ALLOW
|
||||||
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.getFreezeInitiator=RM_ALLOW
|
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.getFreezeInitiator=RM_ALLOW
|
||||||
|
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.isFrozenOrHasFrozenChildren=RM_ALLOW
|
||||||
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.*=RM_DENY
|
org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService.*=RM_DENY
|
||||||
]]>
|
]]>
|
||||||
</value>
|
</value>
|
||||||
|
@@ -141,6 +141,11 @@
|
|||||||
<artifactId>spring-test</artifactId>
|
<artifactId>spring-test</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@@ -35,17 +35,17 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.BeforeRMActionExecution;
|
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.BeforeRMActionExecution;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.OnRMActionExecution;
|
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.OnRMActionExecution;
|
||||||
|
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.util.PoliciesUtil;
|
import org.alfresco.module.org_alfresco_module_rm.util.PoliciesUtil;
|
||||||
import org.alfresco.repo.policy.ClassPolicyDelegate;
|
import org.alfresco.repo.policy.ClassPolicyDelegate;
|
||||||
import org.alfresco.repo.policy.PolicyComponent;
|
import org.alfresco.repo.policy.PolicyComponent;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.springframework.extensions.surf.util.I18NUtil;
|
import org.springframework.extensions.surf.util.I18NUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,14 +53,13 @@ import org.springframework.extensions.surf.util.I18NUtil;
|
|||||||
*
|
*
|
||||||
* @author Roy Wetherall
|
* @author Roy Wetherall
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
public class RecordsManagementActionServiceImpl implements RecordsManagementActionService
|
public class RecordsManagementActionServiceImpl implements RecordsManagementActionService
|
||||||
{
|
{
|
||||||
/** I18N */
|
/** I18N */
|
||||||
private static final String MSG_NOT_DEFINED = "rm.action.not-defined";
|
private static final String MSG_NOT_DEFINED = "rm.action.not-defined";
|
||||||
private static final String MSG_NO_IMPLICIT_NODEREF = "rm.action.no-implicit-noderef";
|
private static final String MSG_NO_IMPLICIT_NODEREF = "rm.action.no-implicit-noderef";
|
||||||
|
private static final String MSG_NODE_FROZEN = "rm.action.node.frozen.error-message";
|
||||||
/** Logger */
|
|
||||||
private static Log logger = LogFactory.getLog(RecordsManagementActionServiceImpl.class);
|
|
||||||
|
|
||||||
/** Registered records management actions */
|
/** Registered records management actions */
|
||||||
private Map<String, RecordsManagementAction> rmActions = new HashMap<>(13);
|
private Map<String, RecordsManagementAction> rmActions = new HashMap<>(13);
|
||||||
@@ -78,6 +77,16 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
|
|||||||
private ClassPolicyDelegate<BeforeRMActionExecution> beforeRMActionExecutionDelegate;
|
private ClassPolicyDelegate<BeforeRMActionExecution> beforeRMActionExecutionDelegate;
|
||||||
private ClassPolicyDelegate<OnRMActionExecution> onRMActionExecutionDelegate;
|
private ClassPolicyDelegate<OnRMActionExecution> onRMActionExecutionDelegate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Freeze Service
|
||||||
|
*/
|
||||||
|
private FreezeService freezeService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* list of retention actions to automatically execute
|
||||||
|
*/
|
||||||
|
private List<String> retentionActions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Policy component
|
* @return Policy component
|
||||||
*/
|
*/
|
||||||
@@ -94,6 +103,19 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
|
|||||||
return this.nodeService;
|
return this.nodeService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param freezeService freeze service
|
||||||
|
*/
|
||||||
|
public void setFreezeService(FreezeService freezeService)
|
||||||
|
{
|
||||||
|
this.freezeService = freezeService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRetentionActions(List<String> retentionActions)
|
||||||
|
{
|
||||||
|
this.retentionActions = retentionActions;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the policy component
|
* Set the policy component
|
||||||
*
|
*
|
||||||
@@ -267,21 +289,23 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
|
|||||||
*/
|
*/
|
||||||
public RecordsManagementActionResult executeRecordsManagementAction(NodeRef nodeRef, String name, Map<String, Serializable> parameters)
|
public RecordsManagementActionResult executeRecordsManagementAction(NodeRef nodeRef, String name, Map<String, Serializable> parameters)
|
||||||
{
|
{
|
||||||
if (logger.isDebugEnabled())
|
log.debug("Executing record management action on " + nodeRef);
|
||||||
{
|
log.debug(" actionName = " + name);
|
||||||
logger.debug("Executing record management action on " + nodeRef);
|
log.debug(" parameters = " + parameters);
|
||||||
logger.debug(" actionName = " + name);
|
|
||||||
logger.debug(" parameters = " + parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
RecordsManagementAction rmAction = this.rmActions.get(name);
|
RecordsManagementAction rmAction = this.rmActions.get(name);
|
||||||
if (rmAction == null)
|
if (rmAction == null)
|
||||||
{
|
{
|
||||||
String msg = I18NUtil.getMessage(MSG_NOT_DEFINED, name);
|
String msg = I18NUtil.getMessage(MSG_NOT_DEFINED, name);
|
||||||
if (logger.isWarnEnabled())
|
log.warn(msg);
|
||||||
{
|
throw new AlfrescoRuntimeException(msg);
|
||||||
logger.warn(msg);
|
}
|
||||||
}
|
|
||||||
|
if (retentionActions.contains(name.toLowerCase()) && freezeService.isFrozenOrHasFrozenChildren(nodeRef))
|
||||||
|
{
|
||||||
|
String msg = I18NUtil.getMessage(MSG_NODE_FROZEN, name);
|
||||||
|
log.debug(msg);
|
||||||
|
|
||||||
throw new AlfrescoRuntimeException(msg);
|
throw new AlfrescoRuntimeException(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,10 +331,7 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
|
|||||||
if (implicitTargetNode == null)
|
if (implicitTargetNode == null)
|
||||||
{
|
{
|
||||||
String msg = I18NUtil.getMessage(MSG_NO_IMPLICIT_NODEREF, name);
|
String msg = I18NUtil.getMessage(MSG_NO_IMPLICIT_NODEREF, name);
|
||||||
if (logger.isWarnEnabled())
|
log.warn(msg);
|
||||||
{
|
|
||||||
logger.warn(msg);
|
|
||||||
}
|
|
||||||
throw new AlfrescoRuntimeException(msg);
|
throw new AlfrescoRuntimeException(msg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -45,7 +45,6 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.property.Dispositi
|
|||||||
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEvent;
|
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEvent;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind;
|
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
|
|
||||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
|
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
|
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
|
||||||
@@ -59,7 +58,6 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
|||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||||
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
||||||
import org.alfresco.repo.transaction.AlfrescoTransactionSupport.TxnReadState;
|
import org.alfresco.repo.transaction.AlfrescoTransactionSupport.TxnReadState;
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||||
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
import org.alfresco.service.cmr.dictionary.DictionaryService;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
|
@@ -150,4 +150,12 @@ public interface FreezeService
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
Set<NodeRef> getHolds(NodeRef filePlan);
|
Set<NodeRef> getHolds(NodeRef filePlan);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check given node or its children are frozen
|
||||||
|
* The node should be record or record folder for retention schedule
|
||||||
|
*
|
||||||
|
* @param nodeRef
|
||||||
|
*/
|
||||||
|
boolean isFrozenOrHasFrozenChildren(NodeRef nodeRef);
|
||||||
}
|
}
|
||||||
|
@@ -43,6 +43,8 @@ import org.alfresco.model.ContentModel;
|
|||||||
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.hold.HoldService;
|
import org.alfresco.module.org_alfresco_module_rm.hold.HoldService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
|
||||||
|
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
|
||||||
|
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
|
import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||||
@@ -75,6 +77,32 @@ public class FreezeServiceImpl extends ServiceBaseImpl
|
|||||||
/** Hold service */
|
/** Hold service */
|
||||||
private HoldService holdService;
|
private HoldService holdService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record Folder Service
|
||||||
|
*/
|
||||||
|
private RecordFolderService recordFolderService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record Service
|
||||||
|
*/
|
||||||
|
private RecordService recordService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param recordFolderService record folder service
|
||||||
|
*/
|
||||||
|
public void setRecordFolderService(RecordFolderService recordFolderService)
|
||||||
|
{
|
||||||
|
this.recordFolderService = recordFolderService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param recordService record service
|
||||||
|
*/
|
||||||
|
public void setRecordService(RecordService recordService)
|
||||||
|
{
|
||||||
|
this.recordService = recordService;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return File plan service
|
* @return File plan service
|
||||||
*/
|
*/
|
||||||
@@ -392,4 +420,24 @@ public class FreezeServiceImpl extends ServiceBaseImpl
|
|||||||
// create hold
|
// create hold
|
||||||
return getHoldService().createHold(filePlan, holdName, reason, null);
|
return getHoldService().createHold(filePlan, holdName, reason, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to determine if a node is frozen or has frozen children
|
||||||
|
*
|
||||||
|
* @param nodeRef Node to be checked
|
||||||
|
* @return <code>true</code> if the node is frozen or has frozen children, <code>false</code> otherwise
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isFrozenOrHasFrozenChildren(NodeRef nodeRef)
|
||||||
|
{
|
||||||
|
if (recordFolderService.isRecordFolder(nodeRef))
|
||||||
|
{
|
||||||
|
return isFrozen(nodeRef) || hasFrozenChildren(nodeRef);
|
||||||
|
}
|
||||||
|
else if (recordService.isRecord(nodeRef))
|
||||||
|
{
|
||||||
|
return isFrozen(nodeRef);
|
||||||
|
}
|
||||||
|
return Boolean.FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -30,15 +30,14 @@ package org.alfresco.module.org_alfresco_module_rm.job;
|
|||||||
import static org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK;
|
import static org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
|
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
|
||||||
|
|
||||||
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
|
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
|
||||||
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
|
|
||||||
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
|
|
||||||
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
@@ -48,8 +47,8 @@ import org.alfresco.service.cmr.search.ResultSet;
|
|||||||
import org.alfresco.service.cmr.search.SearchParameters;
|
import org.alfresco.service.cmr.search.SearchParameters;
|
||||||
import org.alfresco.service.cmr.search.SearchService;
|
import org.alfresco.service.cmr.search.SearchService;
|
||||||
import org.alfresco.service.cmr.security.PersonService;
|
import org.alfresco.service.cmr.security.PersonService;
|
||||||
import org.apache.commons.logging.Log;
|
import org.springframework.extensions.surf.util.I18NUtil;
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Disposition Lifecycle Job Finds all disposition action nodes which are for disposition actions specified Where
|
* The Disposition Lifecycle Job Finds all disposition action nodes which are for disposition actions specified Where
|
||||||
@@ -58,14 +57,14 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
* @author mrogers
|
* @author mrogers
|
||||||
* @author Roy Wetherall
|
* @author Roy Wetherall
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecuter
|
public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecuter
|
||||||
{
|
{
|
||||||
/** logger */
|
|
||||||
private static Log logger = LogFactory.getLog(DispositionLifecycleJobExecuter.class);
|
|
||||||
|
|
||||||
/** batching properties */
|
/** batching properties */
|
||||||
private int batchSize;
|
private int batchSize;
|
||||||
public static final int DEFAULT_BATCH_SIZE = 500;
|
public static final int DEFAULT_BATCH_SIZE = 500;
|
||||||
|
private static final String MSG_NODE_FROZEN = "rm.action.node.frozen.error-message";
|
||||||
|
|
||||||
/** list of disposition actions to automatically execute */
|
/** list of disposition actions to automatically execute */
|
||||||
private List<String> dispositionActions;
|
private List<String> dispositionActions;
|
||||||
@@ -88,11 +87,13 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
/** freeze service */
|
/** freeze service */
|
||||||
private FreezeService freezeService;
|
private FreezeService freezeService;
|
||||||
|
|
||||||
/** record service */
|
/**
|
||||||
private RecordService recordService;
|
* @param freezeService freeze service
|
||||||
|
*/
|
||||||
/** record folder service */
|
public void setFreezeService(FreezeService freezeService)
|
||||||
private RecordFolderService recordFolderService;
|
{
|
||||||
|
this.freezeService = freezeService;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of disposition actions to automatically execute when eligible.
|
* List of disposition actions to automatically execute when eligible.
|
||||||
@@ -133,30 +134,6 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
this.searchService = searchService;
|
this.searchService = searchService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param freezeService freeze service
|
|
||||||
*/
|
|
||||||
public void setFreezeService(FreezeService freezeService)
|
|
||||||
{
|
|
||||||
this.freezeService = freezeService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param recordService record service
|
|
||||||
*/
|
|
||||||
public void setRecordService(RecordService recordService)
|
|
||||||
{
|
|
||||||
this.recordService = recordService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param recordFolderService record folder service
|
|
||||||
*/
|
|
||||||
public void setRecordFolderService(RecordFolderService recordFolderService)
|
|
||||||
{
|
|
||||||
this.recordFolderService = recordFolderService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the search query string.
|
* Get the search query string.
|
||||||
*
|
*
|
||||||
@@ -207,11 +184,11 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
logger.debug("Job Starting");
|
log.debug("Job Starting");
|
||||||
|
|
||||||
if (dispositionActions == null || dispositionActions.isEmpty())
|
if (dispositionActions == null || dispositionActions.isEmpty())
|
||||||
{
|
{
|
||||||
logger.debug("Job Finished as disposition action is empty");
|
log.debug("Job Finished as disposition action is empty");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,16 +197,11 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
|
|
||||||
if (batchSize < 1)
|
if (batchSize < 1)
|
||||||
{
|
{
|
||||||
if (logger.isDebugEnabled())
|
log.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
|
||||||
{
|
|
||||||
logger.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
|
|
||||||
}
|
|
||||||
batchSize = DEFAULT_BATCH_SIZE;
|
batchSize = DEFAULT_BATCH_SIZE;
|
||||||
}
|
}
|
||||||
if (logger.isTraceEnabled())
|
|
||||||
{
|
log.trace("Using batch size of " + batchSize);
|
||||||
logger.trace("Using batch size of " + batchSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (hasMore)
|
while (hasMore)
|
||||||
{
|
{
|
||||||
@@ -247,10 +219,7 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
skipCount += resultNodes.size(); // increase by page size
|
skipCount += resultNodes.size(); // increase by page size
|
||||||
results.close();
|
results.close();
|
||||||
|
|
||||||
if (logger.isDebugEnabled())
|
log.debug("Processing " + resultNodes.size() + " nodes");
|
||||||
{
|
|
||||||
logger.debug("Processing " + resultNodes.size() + " nodes");
|
|
||||||
}
|
|
||||||
|
|
||||||
// process search results
|
// process search results
|
||||||
if (!resultNodes.isEmpty())
|
if (!resultNodes.isEmpty())
|
||||||
@@ -258,14 +227,11 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
executeAction(resultNodes);
|
executeAction(resultNodes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logger.debug("Job Finished");
|
log.debug("Job Finished");
|
||||||
}
|
}
|
||||||
catch (AlfrescoRuntimeException exception)
|
catch (AlfrescoRuntimeException exception)
|
||||||
{
|
{
|
||||||
if (logger.isDebugEnabled())
|
log.debug(exception.getMessage());
|
||||||
{
|
|
||||||
logger.debug(exception);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,12 +265,9 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
}
|
}
|
||||||
Map<String, Serializable> props = Map.of(PARAM_NO_ERROR_CHECK, false);
|
Map<String, Serializable> props = Map.of(PARAM_NO_ERROR_CHECK, false);
|
||||||
|
|
||||||
if (isFrozenOrHasFrozenChildren(parent.getParentRef()))
|
if (freezeService.isFrozenOrHasFrozenChildren(parent.getParentRef()))
|
||||||
{
|
{
|
||||||
if (logger.isDebugEnabled()) {
|
log.debug(I18NUtil.getMessage(MSG_NODE_FROZEN, dispAction));
|
||||||
logger.debug("unable to perform action " + dispAction +
|
|
||||||
" because node is frozen or has frozen children");
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,17 +277,13 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
recordsManagementActionService
|
recordsManagementActionService
|
||||||
.executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
|
.executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
|
||||||
|
|
||||||
if (logger.isDebugEnabled())
|
log.debug("Processed action: " + dispAction + "on" + parent);
|
||||||
{
|
|
||||||
logger.debug("Processed action: " + dispAction + "on" + parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (AlfrescoRuntimeException exception)
|
catch (AlfrescoRuntimeException exception)
|
||||||
{
|
{
|
||||||
if (logger.isDebugEnabled())
|
log.debug(exception.getMessage());
|
||||||
{
|
|
||||||
logger.debug(exception);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
@@ -332,25 +291,6 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
|||||||
retryingTransactionHelper.doInTransaction(processTranCB, false, true);
|
retryingTransactionHelper.doInTransaction(processTranCB, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper method to determine if a node is frozen or has frozen children
|
|
||||||
*
|
|
||||||
* @param nodeRef Node to be checked
|
|
||||||
* @return <code>true</code> if the node is frozen or has frozen children, <code>false</code> otherwise
|
|
||||||
*/
|
|
||||||
private boolean isFrozenOrHasFrozenChildren(NodeRef nodeRef)
|
|
||||||
{
|
|
||||||
if (recordFolderService.isRecordFolder(nodeRef))
|
|
||||||
{
|
|
||||||
return freezeService.isFrozen(nodeRef) || freezeService.hasFrozenChildren(nodeRef);
|
|
||||||
}
|
|
||||||
if (recordService.isRecord(nodeRef))
|
|
||||||
{
|
|
||||||
return freezeService.isFrozen(nodeRef);
|
|
||||||
}
|
|
||||||
throw new AlfrescoRuntimeException("The nodeRef '" + nodeRef + "' is neither a record nor a record folder.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public PersonService getPersonService()
|
public PersonService getPersonService()
|
||||||
{
|
{
|
||||||
return personService;
|
return personService;
|
||||||
|
@@ -265,8 +265,38 @@ public class FreezeServiceImplTest extends BaseRMTestCase
|
|||||||
assertFalse(freezeService.isFrozen(recordFour));
|
assertFalse(freezeService.isFrozen(recordFour));
|
||||||
// assertFalse(freezeService.hasFrozenChildren(rmFolder));
|
// assertFalse(freezeService.hasFrozenChildren(rmFolder));
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
doTestInTransaction(new Test<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void run() throws Exception
|
||||||
|
{
|
||||||
|
NodeRef hold101 = holdService.createHold(filePlan, "freezename 103", "FreezeReason", null);
|
||||||
|
// Freeze a record folder
|
||||||
|
assertNotNull(hold101);
|
||||||
|
holdService.addToHold(hold101, rmFolder);
|
||||||
|
assertTrue(recordFolderService.isRecordFolder(rmFolder));
|
||||||
|
assertTrue(freezeService.isFrozenOrHasFrozenChildren(rmFolder));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
doTestInTransaction(new Test<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void run() throws Exception
|
||||||
|
{
|
||||||
|
NodeRef hold101 = holdService.createHold(filePlan, "freezename 104", "FreezeReason", null);
|
||||||
|
// Freeze a record inside a record folder
|
||||||
|
assertNotNull(hold101);
|
||||||
|
holdService.addToHold(hold101, recordThree);
|
||||||
|
assertTrue(recordService.isRecord(recordThree));
|
||||||
|
assertTrue(freezeService.isFrozenOrHasFrozenChildren(rmFolder));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
5
amps/module-info.java
Normal file
5
amps/module-info.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module simple.lombok {
|
||||||
|
requires static lombok;
|
||||||
|
requires java.logging;
|
||||||
|
|
||||||
|
}
|
1
pom.xml
1
pom.xml
@@ -851,6 +851,7 @@
|
|||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
<version>1.18.20</version>
|
<version>1.18.20</version>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
Reference in New Issue
Block a user