RM-6941 added slf4j and junit test [ags]

This commit is contained in:
bdwiwedi
2021-08-10 00:46:16 +05:30
parent 7014074609
commit 17efe0cb23
12 changed files with 498 additions and 544 deletions

View File

@@ -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 node is frozen or has frozen children rm.action.node.frozen.error-message=Unable to perform action {0} because node is frozen or has frozen children.

View File

@@ -80,6 +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="freezeService" ref="freezeService"/>
<property name="batchSize" value="${rm.dispositionlifecycletrigger.batchsize}"/> <property name="batchSize" value="${rm.dispositionlifecycletrigger.batchsize}"/>
</bean> </bean>

View File

@@ -112,7 +112,6 @@
<property name="filePlanService" ref="FilePlanService" /> <property name="filePlanService" ref="FilePlanService" />
<property name="recordFolderService" ref="RecordFolderService"/> <property name="recordFolderService" ref="RecordFolderService"/>
<property name="recordService" ref="RecordService"/> <property name="recordService" ref="RecordService"/>
<property name="freezeService" ref="FreezeService"/>
<property name="transactionService" ref="transactionService" /> <property name="transactionService" ref="transactionService" />
</bean> </bean>
@@ -699,11 +698,10 @@
<!-- list of disposition actions to automatically execute when eligible --> <!-- list of disposition actions to automatically execute when eligible -->
<property name="retentionActions"> <property name="retentionActions">
<list> <list>
<value>cutoff</value>
<value>retain</value> <value>retain</value>
</list> </list>
</property> </property>
<property name="dispositionService" ref="dispositionService"/> <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">
@@ -908,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">

View File

@@ -35,59 +35,72 @@ 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.module.org_alfresco_module_rm.disposition.DispositionService;
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;
import org.springframework.beans.factory.annotation.Autowired;
/** /**
* Records Management Action Service Implementation * Records Management Action Service Implementation
* *
* @author Roy Wetherall * @author Roy Wetherall
*/ */
public class RecordsManagementActionServiceImpl implements RecordsManagementActionService @Slf4j
{ 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"; private static final String MSG_NODE_FROZEN = "rm.action.node.frozen.error-message";
/** Logger */
private static final 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);
private Map<String, RecordsManagementActionCondition> rmConditions = new HashMap<>(13); private Map<String, RecordsManagementActionCondition> rmConditions = new HashMap<>(13);
private Map<String, RecordsManagementAction> dispositionActions = new HashMap<>(5); private Map<String, RecordsManagementAction> dispositionActions = new HashMap<>(5);
/** Policy component */ /**
* Policy component
*/
private PolicyComponent policyComponent; private PolicyComponent policyComponent;
/** Node service */ /**
* Node service
*/
private NodeService nodeService; private NodeService nodeService;
/** Policy delegates */ /**
* Policy delegates
*/
private ClassPolicyDelegate<BeforeRMActionExecution> beforeRMActionExecutionDelegate; private ClassPolicyDelegate<BeforeRMActionExecution> beforeRMActionExecutionDelegate;
private ClassPolicyDelegate<OnRMActionExecution> onRMActionExecutionDelegate; private ClassPolicyDelegate<OnRMActionExecution> onRMActionExecutionDelegate;
private DispositionService dispositionService; /**
* Freeze Service
*/
private FreezeService freezeService;
public void setDispositionService(DispositionService dispositionService) { /**
this.dispositionService = dispositionService; * @param freezeService freeze service
*/
public void setFreezeService(FreezeService freezeService) {
this.freezeService = freezeService;
} }
/**
/** list of disposition actions to automatically execute */ * list of retention actions to automatically execute
*/
private List<String> retentionActions; private List<String> retentionActions;
public void setRetentionActions(List<String> retentionActions) { public void setRetentionActions(List<String> retentionActions) {
@@ -97,16 +110,14 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* @return Policy component * @return Policy component
*/ */
protected PolicyComponent getPolicyComponent() protected PolicyComponent getPolicyComponent() {
{
return this.policyComponent; return this.policyComponent;
} }
/** /**
* @return Node Service * @return Node Service
*/ */
protected NodeService getNodeService() protected NodeService getNodeService() {
{
return this.nodeService; return this.nodeService;
} }
@@ -115,26 +126,23 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
* *
* @param policyComponent policy component * @param policyComponent policy component
*/ */
public void setPolicyComponent(PolicyComponent policyComponent) public void setPolicyComponent(PolicyComponent policyComponent) {
{
this.policyComponent = policyComponent; this.policyComponent = policyComponent;
} }
/** /**
* Set the node service * Set the node service
* *
* @param nodeService node service * @param nodeService node service
*/ */
public void setNodeService(NodeService nodeService) public void setNodeService(NodeService nodeService) {
{
this.nodeService = nodeService; this.nodeService = nodeService;
} }
/** /**
* Initialise RM action service * Initialise RM action service
*/ */
public void init() public void init() {
{
// Register the various policies // Register the various policies
beforeRMActionExecutionDelegate = getPolicyComponent().registerClassPolicy(BeforeRMActionExecution.class); beforeRMActionExecutionDelegate = getPolicyComponent().registerClassPolicy(BeforeRMActionExecution.class);
onRMActionExecutionDelegate = getPolicyComponent().registerClassPolicy(OnRMActionExecution.class); onRMActionExecutionDelegate = getPolicyComponent().registerClassPolicy(OnRMActionExecution.class);
@@ -143,23 +151,18 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#register(org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#register(org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction)
*/ */
public void register(RecordsManagementAction rmAction) public void register(RecordsManagementAction rmAction) {
{ if (!rmActions.containsKey(rmAction.getName())) {
if (!rmActions.containsKey(rmAction.getName()))
{
rmActions.put(rmAction.getName(), rmAction); rmActions.put(rmAction.getName(), rmAction);
if (rmAction.isDispositionAction()) if (rmAction.isDispositionAction()) {
{
dispositionActions.put(rmAction.getName(), rmAction); dispositionActions.put(rmAction.getName(), rmAction);
} }
} }
} }
public void register(RecordsManagementActionCondition rmCondition) public void register(RecordsManagementActionCondition rmCondition) {
{ if (!rmConditions.containsKey(rmCondition.getBeanName())) {
if (!rmConditions.containsKey(rmCondition.getBeanName()))
{
rmConditions.put(rmCondition.getBeanName(), rmCondition); rmConditions.put(rmCondition.getBeanName(), rmCondition);
} }
} }
@@ -167,12 +170,11 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* Invoke beforeRMActionExecution policy * Invoke beforeRMActionExecution policy
* *
* @param nodeRef node reference * @param nodeRef node reference
* @param name action name * @param name action name
* @param parameters action parameters * @param parameters action parameters
*/ */
protected void invokeBeforeRMActionExecution(NodeRef nodeRef, String name, Map<String, Serializable> parameters) protected void invokeBeforeRMActionExecution(NodeRef nodeRef, String name, Map<String, Serializable> parameters) {
{
// get qnames to invoke against // get qnames to invoke against
Set<QName> qnames = PoliciesUtil.getTypeAndAspectQNames(getNodeService(), nodeRef); Set<QName> qnames = PoliciesUtil.getTypeAndAspectQNames(getNodeService(), nodeRef);
// execute policy for node type and aspects // execute policy for node type and aspects
@@ -183,12 +185,11 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* Invoke onRMActionExecution policy * Invoke onRMActionExecution policy
* *
* @param nodeRef node reference * @param nodeRef node reference
* @param name action name * @param name action name
* @param parameters action parameters * @param parameters action parameters
*/ */
protected void invokeOnRMActionExecution(NodeRef nodeRef, String name, Map<String, Serializable> parameters) protected void invokeOnRMActionExecution(NodeRef nodeRef, String name, Map<String, Serializable> parameters) {
{
// get qnames to invoke against // get qnames to invoke against
Set<QName> qnames = PoliciesUtil.getTypeAndAspectQNames(getNodeService(), nodeRef); Set<QName> qnames = PoliciesUtil.getTypeAndAspectQNames(getNodeService(), nodeRef);
// execute policy for node type and aspects // execute policy for node type and aspects
@@ -199,8 +200,7 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getRecordsManagementActions() * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getRecordsManagementActions()
*/ */
public List<RecordsManagementAction> getRecordsManagementActions() public List<RecordsManagementAction> getRecordsManagementActions() {
{
List<RecordsManagementAction> result = new ArrayList<>(this.rmActions.size()); List<RecordsManagementAction> result = new ArrayList<>(this.rmActions.size());
result.addAll(this.rmActions.values()); result.addAll(this.rmActions.values());
return Collections.unmodifiableList(result); return Collections.unmodifiableList(result);
@@ -210,8 +210,7 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getRecordsManagementActionConditions() * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getRecordsManagementActionConditions()
*/ */
@Override @Override
public List<RecordsManagementActionCondition> getRecordsManagementActionConditions() public List<RecordsManagementActionCondition> getRecordsManagementActionConditions() {
{
List<RecordsManagementActionCondition> result = new ArrayList<>(rmConditions.size()); List<RecordsManagementActionCondition> result = new ArrayList<>(rmConditions.size());
result.addAll(rmConditions.values()); result.addAll(rmConditions.values());
return Collections.unmodifiableList(result); return Collections.unmodifiableList(result);
@@ -224,12 +223,10 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
* @return List of records management action * @return List of records management action
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public List<RecordsManagementAction> getDispositionActions(NodeRef nodeRef) public List<RecordsManagementAction> getDispositionActions(NodeRef nodeRef) {
{
List<RecordsManagementAction> result = new ArrayList<>(this.rmActions.size()); List<RecordsManagementAction> result = new ArrayList<>(this.rmActions.size());
for (RecordsManagementAction action : this.rmActions.values()) for (RecordsManagementAction action : this.rmActions.values()) {
{
// TODO check the permissions on the action ... // TODO check the permissions on the action ...
} }
@@ -239,8 +236,7 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getDispositionActions() * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getDispositionActions()
*/ */
public List<RecordsManagementAction> getDispositionActions() public List<RecordsManagementAction> getDispositionActions() {
{
List<RecordsManagementAction> result = new ArrayList<>(dispositionActions.size()); List<RecordsManagementAction> result = new ArrayList<>(dispositionActions.size());
result.addAll(dispositionActions.values()); result.addAll(dispositionActions.values());
return Collections.unmodifiableList(result); return Collections.unmodifiableList(result);
@@ -249,65 +245,50 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getDispositionAction(java.lang.String) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getDispositionAction(java.lang.String)
*/ */
public RecordsManagementAction getDispositionAction(String name) public RecordsManagementAction getDispositionAction(String name) {
{
return dispositionActions.get(name); return dispositionActions.get(name);
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getRecordsManagementAction(java.lang.String) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#getRecordsManagementAction(java.lang.String)
*/ */
public RecordsManagementAction getRecordsManagementAction(String name) public RecordsManagementAction getRecordsManagementAction(String name) {
{
return this.rmActions.get(name); return this.rmActions.get(name);
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
*/ */
public RecordsManagementActionResult executeRecordsManagementAction(NodeRef nodeRef, String name) public RecordsManagementActionResult executeRecordsManagementAction(NodeRef nodeRef, String name) {
{
return executeRecordsManagementAction(nodeRef, name, null); return executeRecordsManagementAction(nodeRef, name, null);
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(java.util.List, java.lang.String) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(java.util.List, java.lang.String)
*/ */
public Map<NodeRef, RecordsManagementActionResult> executeRecordsManagementAction(List<NodeRef> nodeRefs, String name) public Map<NodeRef, RecordsManagementActionResult> executeRecordsManagementAction(List<NodeRef> nodeRefs, String name) {
{
return executeRecordsManagementAction(nodeRefs, name, null); return executeRecordsManagementAction(nodeRefs, name, null);
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map)
*/ */
public RecordsManagementActionResult executeRecordsManagementAction(NodeRef nodeRef, String name, Map<String, Serializable> parameters) public RecordsManagementActionResult executeRecordsManagementAction(NodeRef nodeRef, String name, Map<String, Serializable> parameters) {
{ log.debug("Executing record management action on " + nodeRef);
if (logger.isDebugEnabled()) log.debug(" actionName = " + name);
{ log.debug(" parameters = " + parameters);
logger.debug("Executing record management action on " + nodeRef);
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);
{
logger.warn(msg);
}
throw new AlfrescoRuntimeException(msg); throw new AlfrescoRuntimeException(msg);
} }
if (dispositionService.isFrozenOrHasFrozenChildren(nodeRef) && retentionActions.contains(name.toLowerCase())) { if (freezeService.isFrozenOrHasFrozenChildren(nodeRef) && retentionActions.contains(name.toLowerCase())) {
String msg = I18NUtil.getMessage(MSG_NODE_FROZEN, rmAction.getName()); String msg = I18NUtil.getMessage(MSG_NODE_FROZEN, name);
if (logger.isDebugEnabled()) log.debug(msg);
{
logger.debug(msg);
}
throw new AlfrescoRuntimeException(msg); throw new AlfrescoRuntimeException(msg);
} }
@@ -315,8 +296,7 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
// Execute action // Execute action
invokeBeforeRMActionExecution(nodeRef, name, parameters); invokeBeforeRMActionExecution(nodeRef, name, parameters);
RecordsManagementActionResult result = rmAction.execute(nodeRef, parameters); RecordsManagementActionResult result = rmAction.execute(nodeRef, parameters);
if (getNodeService().exists(nodeRef)) if (getNodeService().exists(nodeRef)) {
{
invokeOnRMActionExecution(nodeRef, name, parameters); invokeOnRMActionExecution(nodeRef, name, parameters);
} }
@@ -326,22 +306,15 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(java.lang.String, java.util.Map) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(java.lang.String, java.util.Map)
*/ */
public RecordsManagementActionResult executeRecordsManagementAction(String name, Map<String, Serializable> parameters) public RecordsManagementActionResult executeRecordsManagementAction(String name, Map<String, Serializable> parameters) {
{
RecordsManagementAction rmAction = rmActions.get(name); RecordsManagementAction rmAction = rmActions.get(name);
NodeRef implicitTargetNode = rmAction.getImplicitTargetNodeRef(); NodeRef implicitTargetNode = rmAction.getImplicitTargetNodeRef();
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
{
return this.executeRecordsManagementAction(implicitTargetNode, name, parameters); return this.executeRecordsManagementAction(implicitTargetNode, name, parameters);
} }
} }
@@ -349,12 +322,10 @@ public class RecordsManagementActionServiceImpl implements RecordsManagementActi
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(java.util.List, java.lang.String, java.util.Map) * @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService#executeRecordsManagementAction(java.util.List, java.lang.String, java.util.Map)
*/ */
public Map<NodeRef, RecordsManagementActionResult> executeRecordsManagementAction(List<NodeRef> nodeRefs, String name, Map<String, Serializable> parameters) public Map<NodeRef, RecordsManagementActionResult> executeRecordsManagementAction(List<NodeRef> nodeRefs, String name, Map<String, Serializable> parameters) {
{
// Execute the action on each node in the list // Execute the action on each node in the list
Map<NodeRef, RecordsManagementActionResult> results = new HashMap<>(nodeRefs.size()); Map<NodeRef, RecordsManagementActionResult> results = new HashMap<>(nodeRefs.size());
for (NodeRef nodeRef : nodeRefs) for (NodeRef nodeRef : nodeRefs) {
{
RecordsManagementActionResult result = executeRecordsManagementAction(nodeRef, name, parameters); RecordsManagementActionResult result = executeRecordsManagementAction(nodeRef, name, parameters);
results.put(nodeRef, result); results.put(nodeRef, result);
} }

View File

@@ -289,11 +289,4 @@ public interface DispositionService
*/ */
void recalculateNextDispositionStep(NodeRef record); void recalculateNextDispositionStep(NodeRef record);
/**
* 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);
} }

View File

@@ -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;
@@ -116,9 +115,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
/** Record Service */ /** Record Service */
private RecordService recordService; private RecordService recordService;
/** Freeze Service */
private FreezeService freezeService;
/** Transaction service */ /** Transaction service */
private TransactionService transactionService; private TransactionService transactionService;
@@ -191,14 +187,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
this.recordService = recordService; this.recordService = recordService;
} }
/**
* @param freezeService freeze service
*/
public void setFreezeService(FreezeService freezeService)
{
this.freezeService = freezeService;
}
/** /**
* @param transactionService transaction service * @param transactionService transaction service
*/ */
@@ -1469,23 +1457,4 @@ public class DispositionServiceImpl extends ServiceBaseImpl
newDispositionActionName, newDispositionActionDateAsOf, WriteMode.DATE_AND_NAME); newDispositionActionName, newDispositionActionDateAsOf, WriteMode.DATE_AND_NAME);
} }
/**
* 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 freezeService.isFrozen(nodeRef) || freezeService.hasFrozenChildren(nodeRef);
}
else if (recordService.isRecord(nodeRef))
{
return freezeService.isFrozen(nodeRef);
}
return Boolean.FALSE;
}
} }

View File

@@ -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);
} }

View File

@@ -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;
@@ -62,48 +64,73 @@ import org.springframework.extensions.surf.util.I18NUtil;
* @author Tuna Aksoy * @author Tuna Aksoy
* @since 2.1 * @since 2.1
*/ */
public class FreezeServiceImpl extends ServiceBaseImpl public class FreezeServiceImpl extends ServiceBaseImpl
implements FreezeService, implements FreezeService,
RecordsManagementModel RecordsManagementModel {
{ /**
/** I18N */ * I18N
*/
private static final String MSG_HOLD_NAME = "rm.hold.name"; private static final String MSG_HOLD_NAME = "rm.hold.name";
/** File Plan Service */ /**
* File Plan Service
*/
private FilePlanService filePlanService; private FilePlanService filePlanService;
/** 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
*/ */
protected FilePlanService getFilePlanService() protected FilePlanService getFilePlanService() {
{
return this.filePlanService; return this.filePlanService;
} }
/** /**
* @return Hold service * @return Hold service
*/ */
protected HoldService getHoldService() protected HoldService getHoldService() {
{
return this.holdService; return this.holdService;
} }
/** /**
* @param filePlanService file plan service * @param filePlanService file plan service
*/ */
public void setFilePlanService(FilePlanService filePlanService) public void setFilePlanService(FilePlanService filePlanService) {
{
this.filePlanService = filePlanService; this.filePlanService = filePlanService;
} }
/** /**
* @param holdService hold service * @param holdService hold service
*/ */
public void setHoldService(HoldService holdService) public void setHoldService(HoldService holdService) {
{
this.holdService = holdService; this.holdService = holdService;
} }
@@ -111,8 +138,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#isFrozen(org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#isFrozen(org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
public boolean isFrozen(NodeRef nodeRef) public boolean isFrozen(NodeRef nodeRef) {
{
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
return nodeService.hasAspect(nodeRef, ASPECT_FROZEN); return nodeService.hasAspect(nodeRef, ASPECT_FROZEN);
@@ -127,19 +153,17 @@ public class FreezeServiceImpl extends ServiceBaseImpl
*/ */
@Override @Override
@Deprecated @Deprecated
public Set<NodeRef> getFrozen(NodeRef hold) public Set<NodeRef> getFrozen(NodeRef hold) {
{
return new HashSet<>(getHoldService().getHeld(hold)); return new HashSet<>(getHoldService().getHeld(hold));
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(java.lang.String, * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(java.lang.String,
* org.alfresco.service.cmr.repository.NodeRef) * org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
@Deprecated @Deprecated
public NodeRef freeze(String reason, NodeRef nodeRef) public NodeRef freeze(String reason, NodeRef nodeRef) {
{
NodeRef hold = createHold(nodeRef, reason); NodeRef hold = createHold(nodeRef, reason);
getHoldService().addToHold(hold, nodeRef); getHoldService().addToHold(hold, nodeRef);
return hold; return hold;
@@ -147,12 +171,11 @@ public class FreezeServiceImpl extends ServiceBaseImpl
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(org.alfresco.service.cmr.repository.NodeRef, * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(org.alfresco.service.cmr.repository.NodeRef,
* org.alfresco.service.cmr.repository.NodeRef) * org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
@Deprecated @Deprecated
public void freeze(NodeRef hold, NodeRef nodeRef) public void freeze(NodeRef hold, NodeRef nodeRef) {
{
ParameterCheck.mandatory("hold", hold); ParameterCheck.mandatory("hold", hold);
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
@@ -161,15 +184,13 @@ public class FreezeServiceImpl extends ServiceBaseImpl
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(java.lang.String, * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(java.lang.String,
* java.util.Set) * java.util.Set)
*/ */
@Override @Override
@Deprecated @Deprecated
public NodeRef freeze(String reason, Set<NodeRef> nodeRefs) public NodeRef freeze(String reason, Set<NodeRef> nodeRefs) {
{
NodeRef hold = null; NodeRef hold = null;
if (!nodeRefs.isEmpty()) if (!nodeRefs.isEmpty()) {
{
final List<NodeRef> list = new ArrayList<>(nodeRefs); final List<NodeRef> list = new ArrayList<>(nodeRefs);
hold = createHold(list.get(0), reason); hold = createHold(list.get(0), reason);
getHoldService().addToHold(hold, list); getHoldService().addToHold(hold, list);
@@ -179,17 +200,15 @@ public class FreezeServiceImpl extends ServiceBaseImpl
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(org.alfresco.service.cmr.repository.NodeRef, * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#freeze(org.alfresco.service.cmr.repository.NodeRef,
* java.util.Set) * java.util.Set)
*/ */
@Override @Override
@Deprecated @Deprecated
public void freeze(NodeRef hold, Set<NodeRef> nodeRefs) public void freeze(NodeRef hold, Set<NodeRef> nodeRefs) {
{
ParameterCheck.mandatory("hold", hold); ParameterCheck.mandatory("hold", hold);
ParameterCheck.mandatoryCollection("nodeRefs", nodeRefs); ParameterCheck.mandatoryCollection("nodeRefs", nodeRefs);
for (NodeRef nodeRef : nodeRefs) for (NodeRef nodeRef : nodeRefs) {
{
freeze(hold, nodeRef); freeze(hold, nodeRef);
} }
} }
@@ -199,11 +218,9 @@ public class FreezeServiceImpl extends ServiceBaseImpl
*/ */
@Override @Override
@Deprecated @Deprecated
public void unFreeze(NodeRef nodeRef) public void unFreeze(NodeRef nodeRef) {
{
List<NodeRef> holds = getHoldService().heldBy(nodeRef, true); List<NodeRef> holds = getHoldService().heldBy(nodeRef, true);
for (NodeRef hold : holds) for (NodeRef hold : holds) {
{
getHoldService().removeFromHold(hold, nodeRef); getHoldService().removeFromHold(hold, nodeRef);
} }
} }
@@ -213,12 +230,10 @@ public class FreezeServiceImpl extends ServiceBaseImpl
*/ */
@Override @Override
@Deprecated @Deprecated
public void unFreeze(Set<NodeRef> nodeRefs) public void unFreeze(Set<NodeRef> nodeRefs) {
{
ParameterCheck.mandatoryCollection("nodeRefs", nodeRefs); ParameterCheck.mandatoryCollection("nodeRefs", nodeRefs);
for (NodeRef nodeRef : nodeRefs) for (NodeRef nodeRef : nodeRefs) {
{
unFreeze(nodeRef); unFreeze(nodeRef);
} }
} }
@@ -228,8 +243,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
*/ */
@Override @Override
@Deprecated @Deprecated
public void relinquish(NodeRef hold) public void relinquish(NodeRef hold) {
{
getHoldService().deleteHold(hold); getHoldService().deleteHold(hold);
} }
@@ -238,19 +252,17 @@ public class FreezeServiceImpl extends ServiceBaseImpl
*/ */
@Override @Override
@Deprecated @Deprecated
public String getReason(NodeRef hold) public String getReason(NodeRef hold) {
{
return getHoldService().getHoldReason(hold); return getHoldService().getHoldReason(hold);
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#updateReason(org.alfresco.service.cmr.repository.NodeRef, * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#updateReason(org.alfresco.service.cmr.repository.NodeRef,
* java.lang.String) * java.lang.String)
*/ */
@Override @Override
@Deprecated @Deprecated
public void updateReason(NodeRef hold, String reason) public void updateReason(NodeRef hold, String reason) {
{
getHoldService().setHoldReason(hold, reason); getHoldService().setHoldReason(hold, reason);
} }
@@ -258,8 +270,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
* @see org.alfresco.module.org_alfresco_module_rm.hold.HoldService#getHolds(NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.hold.HoldService#getHolds(NodeRef)
*/ */
@Override @Override
public Set<NodeRef> getHolds(NodeRef filePlan) public Set<NodeRef> getHolds(NodeRef filePlan) {
{
ParameterCheck.mandatory("filePlan", filePlan); ParameterCheck.mandatory("filePlan", filePlan);
return new HashSet<>(getHoldService().getHolds(filePlan)); return new HashSet<>(getHoldService().getHolds(filePlan));
@@ -269,60 +280,48 @@ public class FreezeServiceImpl extends ServiceBaseImpl
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#hasFrozenChildren(org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#hasFrozenChildren(org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
public boolean hasFrozenChildren(final NodeRef nodeRef) public boolean hasFrozenChildren(final NodeRef nodeRef) {
{
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
boolean result = false; boolean result = false;
// check that we are dealing with a record folder or a collaboration folder // check that we are dealing with a record folder or a collaboration folder
if (isRecordFolder(nodeRef) || if (isRecordFolder(nodeRef) ||
(instanceOf(nodeRef, TYPE_FOLDER) && !nodeService.hasAspect(nodeRef, ASPECT_SITE_CONTAINER))) (instanceOf(nodeRef, TYPE_FOLDER) && !nodeService.hasAspect(nodeRef, ASPECT_SITE_CONTAINER))) {
{
int heldCount = 0; int heldCount = 0;
if (nodeService.hasAspect(nodeRef, ASPECT_HELD_CHILDREN)) if (nodeService.hasAspect(nodeRef, ASPECT_HELD_CHILDREN)) {
{ heldCount = (Integer) getInternalNodeService().getProperty(nodeRef, PROP_HELD_CHILDREN_COUNT);
heldCount = (Integer)getInternalNodeService().getProperty(nodeRef, PROP_HELD_CHILDREN_COUNT); } else {
} final TransactionService transactionService = (TransactionService) applicationContext.getBean("transactionService");
else
{
final TransactionService transactionService = (TransactionService)applicationContext.getBean("transactionService");
heldCount = AuthenticationUtil.runAsSystem(new RunAsWork<Integer>() heldCount = AuthenticationUtil.runAsSystem(new RunAsWork<Integer>() {
{
@Override @Override
public Integer doWork() public Integer doWork() {
{ return transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Integer>() {
return transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Integer>() public Integer execute() throws Throwable {
{ int heldCount = 0;
public Integer execute() throws Throwable
{
int heldCount = 0;
// NOTE: this process remains to 'patch' older systems to improve performance next time around // NOTE: this process remains to 'patch' older systems to improve performance next time around
List<ChildAssociationRef> childAssocs = getInternalNodeService().getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, null); List<ChildAssociationRef> childAssocs = getInternalNodeService().getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, null);
if (childAssocs != null && !childAssocs.isEmpty()) if (childAssocs != null && !childAssocs.isEmpty()) {
{ for (ChildAssociationRef childAssociationRef : childAssocs) {
for (ChildAssociationRef childAssociationRef : childAssocs) final NodeRef childRef = childAssociationRef.getChildRef();
{ if (childAssociationRef.isPrimary() && isFrozen(childRef)) {
final NodeRef childRef = childAssociationRef.getChildRef(); heldCount++;
if (childAssociationRef.isPrimary() && isFrozen(childRef)) }
{ }
heldCount ++; }
}
}
}
// add aspect and set count // add aspect and set count
Map<QName, Serializable> props = new HashMap<>(1); Map<QName, Serializable> props = new HashMap<>(1);
props.put(PROP_HELD_CHILDREN_COUNT, heldCount); props.put(PROP_HELD_CHILDREN_COUNT, heldCount);
getInternalNodeService().addAspect(nodeRef, ASPECT_HELD_CHILDREN, props); getInternalNodeService().addAspect(nodeRef, ASPECT_HELD_CHILDREN, props);
return heldCount; return heldCount;
} }
}, },
false, true); false, true);
} }
}); });
} }
@@ -338,14 +337,14 @@ public class FreezeServiceImpl extends ServiceBaseImpl
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#getFreezeDate(org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#getFreezeDate(org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
public Date getFreezeDate(NodeRef nodeRef) public Date getFreezeDate(NodeRef nodeRef) {
{
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
if (isFrozen(nodeRef)) if (isFrozen(nodeRef)) {
{
Serializable property = nodeService.getProperty(nodeRef, PROP_FROZEN_AT); Serializable property = nodeService.getProperty(nodeRef, PROP_FROZEN_AT);
if (property != null) { return (Date) property; } if (property != null) {
return (Date) property;
}
} }
return null; return null;
@@ -355,14 +354,14 @@ public class FreezeServiceImpl extends ServiceBaseImpl
* @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#getFreezeInitiator(org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#getFreezeInitiator(org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
public String getFreezeInitiator(NodeRef nodeRef) public String getFreezeInitiator(NodeRef nodeRef) {
{
ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("nodeRef", nodeRef);
if (isFrozen(nodeRef)) if (isFrozen(nodeRef)) {
{
Serializable property = nodeService.getProperty(nodeRef, PROP_FROZEN_BY); Serializable property = nodeService.getProperty(nodeRef, PROP_FROZEN_BY);
if (property != null) { return (String) property; } if (property != null) {
return (String) property;
}
} }
return null; return null;
@@ -376,11 +375,10 @@ public class FreezeServiceImpl extends ServiceBaseImpl
* Creates a hold using the given nodeRef and reason * Creates a hold using the given nodeRef and reason
* *
* @param nodeRef the nodeRef which will be frozen * @param nodeRef the nodeRef which will be frozen
* @param reason the reason why the record will be frozen * @param reason the reason why the record will be frozen
* @return NodeRef of the created hold * @return NodeRef of the created hold
*/ */
private NodeRef createHold(NodeRef nodeRef, String reason) private NodeRef createHold(NodeRef nodeRef, String reason) {
{
// get the hold container // get the hold container
final NodeRef filePlan = getFilePlanService().getFilePlan(nodeRef); final NodeRef filePlan = getFilePlanService().getFilePlan(nodeRef);
NodeRef holdContainer = getFilePlanService().getHoldContainer(filePlan); NodeRef holdContainer = getFilePlanService().getHoldContainer(filePlan);
@@ -392,4 +390,20 @@ 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;
}
} }

View File

@@ -33,8 +33,11 @@ import java.io.Serializable;
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.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;
@@ -44,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
@@ -54,69 +57,88 @@ import org.apache.commons.logging.LogFactory;
* @author mrogers * @author mrogers
* @author Roy Wetherall * @author Roy Wetherall
*/ */
public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecuter @Slf4j
{ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecuter {
/** logger */ /**
private static final 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;
/** query string */ /**
* query string
*/
private String query; private String query;
/** records management action service */ /**
* records management action service
*/
private RecordsManagementActionService recordsManagementActionService; private RecordsManagementActionService recordsManagementActionService;
/** node service */ /**
* node service
*/
private NodeService nodeService; private NodeService nodeService;
/** search service */ /**
* search service
*/
private SearchService searchService; private SearchService searchService;
/** person service */ /**
* person service
*/
private PersonService personService; private PersonService personService;
/**
* Freeze Service
*/
private FreezeService freezeService;
/**
* @param freezeService freeze service
*/
public void setFreezeService(FreezeService freezeService) {
this.freezeService = freezeService;
}
/** /**
* List of disposition actions to automatically execute when eligible. * List of disposition actions to automatically execute when eligible.
* *
* @param dispositionActions disposition actions * @param dispositionActions disposition actions
*/ */
public void setDispositionActions(List<String> dispositionActions) public void setDispositionActions(List<String> dispositionActions) {
{
this.dispositionActions = dispositionActions; this.dispositionActions = dispositionActions;
} }
public void setBatchSize(int batchSize) public void setBatchSize(int batchSize) {
{
this.batchSize = batchSize; this.batchSize = batchSize;
} }
/** /**
* @param recordsManagementActionService records management action service * @param recordsManagementActionService records management action service
*/ */
public void setRecordsManagementActionService(RecordsManagementActionService recordsManagementActionService) public void setRecordsManagementActionService(RecordsManagementActionService recordsManagementActionService) {
{
this.recordsManagementActionService = recordsManagementActionService; this.recordsManagementActionService = recordsManagementActionService;
} }
/** /**
* @param nodeService node service * @param nodeService node service
*/ */
public void setNodeService(NodeService nodeService) public void setNodeService(NodeService nodeService) {
{
this.nodeService = nodeService; this.nodeService = nodeService;
} }
/** /**
* @param searchService search service * @param searchService search service
*/ */
public void setSearchService(SearchService searchService) public void setSearchService(SearchService searchService) {
{
this.searchService = searchService; this.searchService = searchService;
} }
@@ -125,24 +147,18 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
* *
* @return job query string * @return job query string
*/ */
protected String getQuery() protected String getQuery() {
{ if (query == null) {
if (query == null)
{
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("TYPE:\"rma:dispositionAction\" AND "); sb.append("TYPE:\"rma:dispositionAction\" AND ");
sb.append("(@rma\\:dispositionAction:("); sb.append("(@rma\\:dispositionAction:(");
boolean bFirst = true; boolean bFirst = true;
for (String dispositionAction : dispositionActions) for (String dispositionAction : dispositionActions) {
{ if (bFirst) {
if (bFirst)
{
bFirst = false; bFirst = false;
} } else {
else
{
sb.append(" OR "); sb.append(" OR ");
} }
@@ -166,36 +182,26 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
* @see org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJobExecuter#execute() * @see org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJobExecuter#execute()
*/ */
@Override @Override
public void executeImpl() public void executeImpl() {
{ try {
try log.debug("Job Starting");
{
logger.debug("Job Starting");
if (dispositionActions == null || dispositionActions.isEmpty()) if (dispositionActions == null || dispositionActions.isEmpty()) {
{ log.debug("Job Finished as disposition action is empty");
logger.debug("Job Finished as disposition action is empty");
return; return;
} }
boolean hasMore = true; boolean hasMore = true;
int skipCount = 0; int skipCount = 0;
if (batchSize < 1) if (batchSize < 1) {
{ log.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
if (logger.isDebugEnabled())
{
logger.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
}
batchSize = DEFAULT_BATCH_SIZE; batchSize = DEFAULT_BATCH_SIZE;
} }
if (logger.isTraceEnabled())
{
logger.trace("Using batch size of " + batchSize);
}
while (hasMore) log.trace("Using batch size of " + batchSize);
{
while (hasMore) {
SearchParameters params = new SearchParameters(); SearchParameters params = new SearchParameters();
params.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); params.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO); params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
@@ -210,25 +216,16 @@ 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()) {
{
executeAction(resultNodes); executeAction(resultNodes);
} }
} }
logger.debug("Job Finished"); log.debug("Job Finished");
} } catch (AlfrescoRuntimeException exception) {
catch (AlfrescoRuntimeException exception) log.debug(exception.getMessage());
{
if (logger.isDebugEnabled())
{
logger.debug(exception);
}
} }
} }
@@ -237,48 +234,41 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
* *
* @param actionNodes - the disposition actions to execute * @param actionNodes - the disposition actions to execute
*/ */
private void executeAction(final List<NodeRef> actionNodes) private void executeAction(final List<NodeRef> actionNodes) {
{
RetryingTransactionCallback<Boolean> processTranCB = () -> { RetryingTransactionCallback<Boolean> processTranCB = () -> {
for (NodeRef actionNode : actionNodes) for (NodeRef actionNode : actionNodes) {
{ if (!nodeService.exists(actionNode)) {
if (!nodeService.exists(actionNode))
{
continue; continue;
} }
final String dispAction = (String) nodeService.getProperty(actionNode, PROP_DISPOSITION_ACTION); final String dispAction = (String) nodeService.getProperty(actionNode, PROP_DISPOSITION_ACTION);
// Run disposition action // Run disposition action
if (dispAction == null || !dispositionActions.contains(dispAction)) if (dispAction == null || !dispositionActions.contains(dispAction)) {
{
continue; continue;
} }
ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode); ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
if (!parent.getTypeQName().equals(ASSOC_NEXT_DISPOSITION_ACTION)) if (!parent.getTypeQName().equals(ASSOC_NEXT_DISPOSITION_ACTION)) {
{
continue; continue;
} }
Map<String, Serializable> props = Map.of(PARAM_NO_ERROR_CHECK, false); Map<String, Serializable> props = Map.of(PARAM_NO_ERROR_CHECK, false);
try if (freezeService.isFrozenOrHasFrozenChildren(parent.getParentRef())) {
{ log.debug(I18NUtil.getMessage(MSG_NODE_FROZEN, dispAction));
continue;
}
try {
// execute disposition action // execute disposition action
recordsManagementActionService recordsManagementActionService
.executeRecordsManagementAction(parent.getParentRef(), dispAction, props); .executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
log.debug("Processed action: " + dispAction + "on" + parent);
} catch (AlfrescoRuntimeException exception) {
log.debug(exception.getMessage());
if (logger.isDebugEnabled())
{
logger.debug("Processed action: " + dispAction + "on" + parent);
}
}
catch (AlfrescoRuntimeException exception)
{
if (logger.isDebugEnabled())
{
logger.debug(exception);
}
} }
} }
return Boolean.TRUE; return Boolean.TRUE;
@@ -286,13 +276,11 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
retryingTransactionHelper.doInTransaction(processTranCB, false, true); retryingTransactionHelper.doInTransaction(processTranCB, false, true);
} }
public PersonService getPersonService() public PersonService getPersonService() {
{
return personService; return personService;
} }
public void setPersonService(PersonService personService) public void setPersonService(PersonService personService) {
{
this.personService = personService; this.personService = personService;
} }
} }

View File

@@ -41,232 +41,236 @@ import org.alfresco.service.cmr.repository.NodeRef;
* @author Tuna Aksoy * @author Tuna Aksoy
* @since 2.1 * @since 2.1
*/ */
public class FreezeServiceImplTest extends BaseRMTestCase public class FreezeServiceImplTest extends BaseRMTestCase {
{
private List<NodeRef> holdAssocs; private List<NodeRef> holdAssocs;
@Override @Override
protected boolean isRecordTest() protected boolean isRecordTest() {
{
return true; return true;
} }
/** /**
* Test freeze service methods. * Test freeze service methods.
* *
* @deprecated as of 2.2 * @deprecated as of 2.2
*/ */
public void testFreezeService() throws Exception public void testFreezeService() throws Exception {
{
doTestInTransaction(new Test<Void>() doTestInTransaction(new Test<Void>() {
{ @Override
@Override public Void run() throws Exception {
public Void run() throws Exception assertTrue(recordService.isRecord(recordOne));
{ assertTrue(recordService.isRecord(recordTwo));
assertTrue(recordService.isRecord(recordOne)); assertTrue(recordService.isRecord(recordThree));
assertTrue(recordService.isRecord(recordTwo)); assertTrue(recordService.isRecord(recordFour));
assertTrue(recordService.isRecord(recordThree)); assertTrue(filePlanService.isFilePlanComponent(recordOne));
assertTrue(recordService.isRecord(recordFour)); assertTrue(filePlanService.isFilePlanComponent(recordTwo));
assertTrue(filePlanService.isFilePlanComponent(recordOne)); assertTrue(filePlanService.isFilePlanComponent(recordThree));
assertTrue(filePlanService.isFilePlanComponent(recordTwo)); assertTrue(filePlanService.isFilePlanComponent(recordFour));
assertTrue(filePlanService.isFilePlanComponent(recordThree));
assertTrue(filePlanService.isFilePlanComponent(recordFour));
// Freeze a record // Freeze a record
NodeRef hold101 = holdService.createHold(filePlan, "freezename 101", "FreezeReason", null); NodeRef hold101 = holdService.createHold(filePlan, "freezename 101", "FreezeReason", null);
assertNotNull(hold101); assertNotNull(hold101);
holdService.addToHold(hold101, recordOne); holdService.addToHold(hold101, recordOne);
//assertTrue(freezeService.hasFrozenChildren(rmFolder)); //assertTrue(freezeService.hasFrozenChildren(rmFolder));
// Check the hold exists // Check the hold exists
holdAssocs = holdService.getHolds(filePlan); holdAssocs = holdService.getHolds(filePlan);
assertNotNull(holdAssocs); assertNotNull(holdAssocs);
assertEquals(1, holdAssocs.size()); assertEquals(1, holdAssocs.size());
NodeRef holdNodeRef = holdAssocs.iterator().next(); NodeRef holdNodeRef = holdAssocs.iterator().next();
assertEquals(holdNodeRef, hold101); assertEquals(holdNodeRef, hold101);
assertTrue(holdService.isHold(holdNodeRef)); assertTrue(holdService.isHold(holdNodeRef));
assertEquals("FreezeReason", holdService.getHoldReason(holdNodeRef)); assertEquals("FreezeReason", holdService.getHoldReason(holdNodeRef));
List<NodeRef> frozenNodes = holdService.getHeld(holdNodeRef); List<NodeRef> frozenNodes = holdService.getHeld(holdNodeRef);
assertNotNull(frozenNodes); assertNotNull(frozenNodes);
assertEquals(1, frozenNodes.size()); assertEquals(1, frozenNodes.size());
// Check the nodes are frozen // Check the nodes are frozen
assertTrue(freezeService.isFrozen(recordOne)); assertTrue(freezeService.isFrozen(recordOne));
assertNotNull(freezeService.getFreezeDate(recordOne)); assertNotNull(freezeService.getFreezeDate(recordOne));
assertNotNull(freezeService.getFreezeInitiator(recordOne)); assertNotNull(freezeService.getFreezeInitiator(recordOne));
assertFalse(freezeService.isFrozen(recordTwo)); assertFalse(freezeService.isFrozen(recordTwo));
assertFalse(freezeService.isFrozen(recordThree)); assertFalse(freezeService.isFrozen(recordThree));
// Update the freeze reason // Update the freeze reason
holdService.setHoldReason(holdNodeRef, "NewFreezeReason"); holdService.setHoldReason(holdNodeRef, "NewFreezeReason");
// Check the hold has been updated // Check the hold has been updated
assertEquals("NewFreezeReason", holdService.getHoldReason(holdNodeRef)); assertEquals("NewFreezeReason", holdService.getHoldReason(holdNodeRef));
// Freeze a number of records // Freeze a number of records
List<NodeRef> records = new ArrayList<>(); List<NodeRef> records = new ArrayList<>();
records.add(recordOne); records.add(recordOne);
records.add(recordTwo); records.add(recordTwo);
records.add(recordThree); records.add(recordThree);
NodeRef newHold = holdService.createHold(filePlan, "Hold 102", "Freeze a set of nodes", null); NodeRef newHold = holdService.createHold(filePlan, "Hold 102", "Freeze a set of nodes", null);
holdService.addToHold(newHold, records); holdService.addToHold(newHold, records);
assertNotNull(newHold); assertNotNull(newHold);
assertTrue(holdService.isHold(newHold)); assertTrue(holdService.isHold(newHold));
// Check the holds exist // Check the holds exist
holdAssocs = holdService.getHolds(filePlan); holdAssocs = holdService.getHolds(filePlan);
assertNotNull(holdAssocs); assertNotNull(holdAssocs);
assertEquals(2, holdAssocs.size()); assertEquals(2, holdAssocs.size());
for (NodeRef hold : holdAssocs) for (NodeRef hold : holdAssocs) {
{ String reason = holdService.getHoldReason(hold);
String reason = holdService.getHoldReason(hold); if (reason.equals("Freeze a set of nodes")) {
if (reason.equals("Freeze a set of nodes")) assertEquals(newHold, hold);
{ frozenNodes = holdService.getHeld(hold);
assertEquals(newHold, hold); assertNotNull(frozenNodes);
frozenNodes = holdService.getHeld(hold); assertEquals(3, frozenNodes.size());
assertNotNull(frozenNodes); } else if (reason.equals("NewFreezeReason")) {
assertEquals(3, frozenNodes.size()); frozenNodes = holdService.getHeld(hold);
} assertNotNull(frozenNodes);
else if (reason.equals("NewFreezeReason")) assertEquals(1, frozenNodes.size());
{ } else {
frozenNodes = holdService.getHeld(hold); throw new AlfrescoRuntimeException("The reason '" + reason + "' was not found in the existing holds.");
assertNotNull(frozenNodes); }
assertEquals(1, frozenNodes.size()); }
}
else // Check the nodes are frozen
{ final List<NodeRef> testRecords = Arrays.asList(new NodeRef[]{recordOne, recordTwo, recordThree});
throw new AlfrescoRuntimeException("The reason '" + reason + "' was not found in the existing holds."); for (NodeRef nr : testRecords) {
} assertTrue(freezeService.isFrozen(nr));
assertNotNull(freezeService.getFreezeDate(nr));
assertNotNull(freezeService.getFreezeInitiator(nr));
}
// Unfreeze a node
holdService.removeFromAllHolds(recordThree);
// Check the holds
holdAssocs = holdService.getHolds(filePlan);
assertNotNull(holdAssocs);
assertEquals(2, holdAssocs.size());
for (NodeRef hold : holdAssocs) {
String reason = holdService.getHoldReason(hold);
if (reason.equals("Freeze a set of nodes")) {
frozenNodes = holdService.getHeld(hold);
assertNotNull(frozenNodes);
assertEquals(2, frozenNodes.size());
} else if (reason.equals("NewFreezeReason")) {
frozenNodes = holdService.getHeld(hold);
assertNotNull(frozenNodes);
assertEquals(1, frozenNodes.size());
} else {
throw new AlfrescoRuntimeException("The reason '" + reason + "' was not found in the existing holds.");
}
}
// Check the nodes are frozen
assertTrue(freezeService.isFrozen(recordOne));
assertNotNull(freezeService.getFreezeDate(recordOne));
assertNotNull(freezeService.getFreezeInitiator(recordOne));
assertTrue(freezeService.isFrozen(recordTwo));
assertNotNull(freezeService.getFreezeDate(recordTwo));
assertNotNull(freezeService.getFreezeInitiator(recordTwo));
assertFalse(freezeService.isFrozen(recordThree));
assertFalse(freezeService.isFrozen(recordFour));
return null;
} }
});
// Check the nodes are frozen
final List<NodeRef> testRecords = Arrays.asList(new NodeRef[]{recordOne, recordTwo, recordThree});
for (NodeRef nr : testRecords)
{
assertTrue(freezeService.isFrozen(nr));
assertNotNull(freezeService.getFreezeDate(nr));
assertNotNull(freezeService.getFreezeInitiator(nr));
}
// Unfreeze a node
holdService.removeFromAllHolds(recordThree);
// Check the holds
holdAssocs = holdService.getHolds(filePlan);
assertNotNull(holdAssocs);
assertEquals(2, holdAssocs.size());
for (NodeRef hold : holdAssocs)
{
String reason = holdService.getHoldReason(hold);
if (reason.equals("Freeze a set of nodes"))
{
frozenNodes = holdService.getHeld(hold);
assertNotNull(frozenNodes);
assertEquals(2, frozenNodes.size());
}
else if (reason.equals("NewFreezeReason"))
{
frozenNodes = holdService.getHeld(hold);
assertNotNull(frozenNodes);
assertEquals(1, frozenNodes.size());
}
else
{
throw new AlfrescoRuntimeException("The reason '" + reason + "' was not found in the existing holds.");
}
}
// Check the nodes are frozen
assertTrue(freezeService.isFrozen(recordOne));
assertNotNull(freezeService.getFreezeDate(recordOne));
assertNotNull(freezeService.getFreezeInitiator(recordOne));
assertTrue(freezeService.isFrozen(recordTwo));
assertNotNull(freezeService.getFreezeDate(recordTwo));
assertNotNull(freezeService.getFreezeInitiator(recordTwo));
assertFalse(freezeService.isFrozen(recordThree));
assertFalse(freezeService.isFrozen(recordFour));
return null;
}
});
//Splitting transaction to fix onCreateNodePolicy issue where there was a node not found exception //Splitting transaction to fix onCreateNodePolicy issue where there was a node not found exception
doTestInTransaction(new Test<Void>() doTestInTransaction(new Test<Void>() {
{ @Override
@Override public Void run() throws Exception {
public Void run() throws Exception // Relinquish the first hold
{ NodeRef holdNodeRef = holdAssocs.iterator().next();
// Relinquish the first hold holdService.deleteHold(holdNodeRef);
NodeRef holdNodeRef = holdAssocs.iterator().next();
holdService.deleteHold(holdNodeRef);
// Check the existing hold // Check the existing hold
holdAssocs = holdService.getHolds(filePlan); holdAssocs = holdService.getHolds(filePlan);
assertNotNull(holdAssocs); assertNotNull(holdAssocs);
assertEquals(1, holdAssocs.size()); assertEquals(1, holdAssocs.size());
// Relinquish the second hold // Relinquish the second hold
holdNodeRef = holdAssocs.iterator().next(); holdNodeRef = holdAssocs.iterator().next();
holdService.removeFromAllHolds(holdService.getHeld(holdNodeRef)); holdService.removeFromAllHolds(holdService.getHeld(holdNodeRef));
// hold is not automatically removed // hold is not automatically removed
holdAssocs = holdService.getHolds(filePlan); holdAssocs = holdService.getHolds(filePlan);
assertEquals(1, holdAssocs.size()); assertEquals(1, holdAssocs.size());
// delete hold
holdService.deleteHold(holdNodeRef);
holdAssocs = holdService.getHolds(filePlan); // delete hold
assertEquals(0, holdAssocs.size()); holdService.deleteHold(holdNodeRef);
// Check the nodes are unfrozen holdAssocs = holdService.getHolds(filePlan);
assertFalse(freezeService.isFrozen(recordOne)); assertEquals(0, holdAssocs.size());
assertFalse(freezeService.isFrozen(recordTwo));
assertFalse(freezeService.isFrozen(recordThree));
assertFalse(freezeService.isFrozen(recordFour));
//assertFalse(freezeService.hasFrozenChildren(rmFolder));
// Test freezing nodes, adding them to an existing hold // Check the nodes are unfrozen
NodeRef hold = holdService.createHold(filePlan, "hold 1", "AnotherFreezeReason", "description"); assertFalse(freezeService.isFrozen(recordOne));
holdService.addToHold(hold, recordFour); assertFalse(freezeService.isFrozen(recordTwo));
holdService.addToHold(hold, recordOne); assertFalse(freezeService.isFrozen(recordThree));
List<NodeRef> nodes = new ArrayList<>(); assertFalse(freezeService.isFrozen(recordFour));
nodes.add(recordTwo); //assertFalse(freezeService.hasFrozenChildren(rmFolder));
nodes.add(recordThree);
holdService.addToHold(hold, nodes);
//assertTrue(freezeService.hasFrozenChildren(rmFolder));
// Check the hold
holdAssocs = holdService.getHolds(filePlan);
assertNotNull(holdAssocs);
assertEquals(1, holdAssocs.size());
return null;
}
});
//Splitting transaction to fix onCreateNodePolicy issue where there was a node not found exception
doTestInTransaction(new Test<Void>()
{
@Override
public Void run() throws Exception
{
// Relinquish the first hold
holdService.deleteHold(holdAssocs.iterator().next());
// Check the nodes are unfrozen // Test freezing nodes, adding them to an existing hold
assertFalse(freezeService.isFrozen(recordOne)); NodeRef hold = holdService.createHold(filePlan, "hold 1", "AnotherFreezeReason", "description");
assertFalse(freezeService.isFrozen(recordTwo)); holdService.addToHold(hold, recordFour);
assertFalse(freezeService.isFrozen(recordThree)); holdService.addToHold(hold, recordOne);
assertFalse(freezeService.isFrozen(recordFour)); List<NodeRef> nodes = new ArrayList<>();
// assertFalse(freezeService.hasFrozenChildren(rmFolder)); nodes.add(recordTwo);
nodes.add(recordThree);
holdService.addToHold(hold, nodes);
//assertTrue(freezeService.hasFrozenChildren(rmFolder));
// Check the hold
holdAssocs = holdService.getHolds(filePlan);
assertNotNull(holdAssocs);
assertEquals(1, holdAssocs.size());
return null;
}
});
//Splitting transaction to fix onCreateNodePolicy issue where there was a node not found exception
doTestInTransaction(new Test<Void>() {
@Override
public Void run() throws Exception {
// Relinquish the first hold
holdService.deleteHold(holdAssocs.iterator().next());
return null; // Check the nodes are unfrozen
} assertFalse(freezeService.isFrozen(recordOne));
}); assertFalse(freezeService.isFrozen(recordTwo));
} assertFalse(freezeService.isFrozen(recordThree));
assertFalse(freezeService.isFrozen(recordFour));
// assertFalse(freezeService.hasFrozenChildren(rmFolder));
return null;
}
});
doTestInTransaction(new Test<Void>() {
@Override
public Void run() throws Exception {
NodeRef hold101 = holdService.createHold(filePlan, "freezename 101", "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 101", "FreezeReason", null);
// Freeze a record inside a record folder
assertNotNull(hold101);
holdService.addToHold(hold101, recordThree);
assertTrue(recordService.isRecord(rmFolder));
assertTrue(freezeService.isFrozenOrHasFrozenChildren(rmFolder));
return null;
}
});
}
} }

5
amps/module-info.java Normal file
View File

@@ -0,0 +1,5 @@
module simple.lombok {
requires static lombok;
requires java.logging;
}

View File

@@ -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>