RM-6941 Changes related to retain frozen Records (#590)

* changes related to retain frozen Records

* RM-6941 add Log entries [ags][skip repo]

* RM-6941 Remove final from the variable declaration

Co-authored-by: bdwiwedi <brij.dwiwedi@globallogic.com>
This commit is contained in:
Manpreet Oberoi
2021-07-20 18:08:25 +05:30
committed by GitHub
parent 9cb719e853
commit 6eb18af654
6 changed files with 149 additions and 116 deletions

View File

@@ -80,6 +80,9 @@
<property name="searchService" ref="searchService" />
<property name="personService" ref="personService" />
<property name="recordsManagementActionService" ref="recordsManagementActionService" />
<property name="recordFolderService" ref="RecordFolderService" />
<property name="recordService" ref="RecordService" />
<property name="freezeService" ref="FreezeService" />
<property name="batchSize" value="${rm.dispositionlifecycletrigger.batchsize}"/>
</bean>

View File

@@ -112,7 +112,6 @@
<property name="filePlanService" ref="FilePlanService" />
<property name="recordFolderService" ref="RecordFolderService"/>
<property name="recordService" ref="RecordService"/>
<property name="freezeService" ref="FreezeService"/>
<property name="transactionService" ref="transactionService" />
</bean>

View File

@@ -117,9 +117,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
/** Record Service */
private RecordService recordService;
/** Freeze Service */
private FreezeService freezeService;
/** Transaction service */
private TransactionService transactionService;
@@ -192,14 +189,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
this.recordService = recordService;
}
/**
* @param freezeService freeze service
*/
public void setFreezeService(FreezeService freezeService)
{
this.freezeService = freezeService;
}
/**
* @param transactionService transaction service
*/
@@ -1191,7 +1180,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl
if (FilePlanComponentKind.RECORD_FOLDER.equals(filePlanService.getFilePlanComponentKind(nodeRef)) ||
FilePlanComponentKind.RECORD.equals(filePlanService.getFilePlanComponentKind(nodeRef)))
{
if (!isDisposableItemCutoff(nodeRef) && !isFrozenOrHasFrozenChildren(nodeRef))
if (!isDisposableItemCutoff(nodeRef))
{
if (recordFolderService.isRecordFolder(nodeRef))
{
@@ -1283,32 +1272,6 @@ public class DispositionServiceImpl extends ServiceBaseImpl
}
}
/**
* 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)
{
boolean result = false;
if (recordFolderService.isRecordFolder(nodeRef))
{
result = freezeService.isFrozen(nodeRef) || freezeService.hasFrozenChildren(nodeRef);
}
else if (recordService.isRecord(nodeRef))
{
result = freezeService.isFrozen(nodeRef);
}
else
{
throw new AlfrescoRuntimeException("The nodeRef '" + nodeRef + "' is neither a record nor a record folder.");
}
return result;
}
/**
* Helper method to apply the cut off
*

View File

@@ -27,15 +27,18 @@
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 java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
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.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -82,6 +85,15 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
/** person service */
private PersonService personService;
/** freeze service */
private FreezeService freezeService;
/** record service */
private RecordService recordService;
/** record folder service */
private RecordFolderService recordFolderService;
/**
* List of disposition actions to automatically execute when eligible.
*
@@ -121,6 +133,30 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
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.
*
@@ -166,14 +202,19 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
/**
* @see org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJobExecuter#execute()
*/
@Override
public void executeImpl()
{
try
{
logger.debug("Job Starting");
if (dispositionActions != null && !dispositionActions.isEmpty())
if (dispositionActions == null || dispositionActions.isEmpty())
{
logger.debug("Job Finished as disposition action is empty");
return;
}
boolean hasMore = true;
int skipCount = 0;
@@ -217,7 +258,6 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
executeAction(resultNodes);
}
}
}
logger.debug("Job Finished");
}
catch (AlfrescoRuntimeException exception)
@@ -239,19 +279,34 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
RetryingTransactionCallback<Boolean> processTranCB = () -> {
for (NodeRef actionNode : actionNodes)
{
if (nodeService.exists(actionNode))
if (!nodeService.exists(actionNode))
{
final String dispAction = (String) nodeService
.getProperty(actionNode, RecordsManagementModel.PROP_DISPOSITION_ACTION);
continue;
}
final String dispAction = (String) nodeService.getProperty(actionNode, PROP_DISPOSITION_ACTION);
// Run disposition action
if (dispAction != null && dispositionActions.contains(dispAction))
if (dispAction == null || !dispositionActions.contains(dispAction))
{
continue;
}
ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
if (parent.getTypeQName().equals(RecordsManagementModel.ASSOC_NEXT_DISPOSITION_ACTION))
if (!parent.getTypeQName().equals(ASSOC_NEXT_DISPOSITION_ACTION))
{
Map<String, Serializable> props = new HashMap<>(1);
props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE);
continue;
}
Map<String, Serializable> props = Map.of(PARAM_NO_ERROR_CHECK, false);
if (isFrozenOrHasFrozenChildren(parent.getParentRef()))
{
if (logger.isDebugEnabled()) {
logger.debug("unable to perform action " + dispAction +
" because node is frozen or has frozen children");
}
continue;
}
try
{
@@ -272,14 +327,30 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
}
}
}
}
}
}
return Boolean.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()
{
return personService;

View File

@@ -69,15 +69,9 @@ public abstract class RecordsManagementJobExecuter implements RecordsManagementM
// jobs not allowed to execute unless bootstrap is complete
if (!repositoryState.isBootstrapping())
{
retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
{
@Override
public Void execute()
{
retryingTransactionHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
executeImpl();
return null;
}
}, false, true);
}
}

View File

@@ -235,6 +235,9 @@ public class DispositionLifecycleJobExecuterUnitTest extends BaseUnitTest
doReturn(CUTOFF).when(mockedNodeService).getProperty(node1, RecordsManagementModel.PROP_DISPOSITION_ACTION);
doReturn(RETAIN).when(mockedNodeService).getProperty(node2, RecordsManagementModel.PROP_DISPOSITION_ACTION);
doReturn(parentAssoc).when(mockedNodeService).getPrimaryParent(any(NodeRef.class));
doReturn(false).when(mockedRecordFolderService).isRecordFolder(parentAssoc.getParentRef());
doReturn(true).when(mockedRecordService).isRecord(parentAssoc.getParentRef());
doReturn(false).when(mockedFreezeService).isFrozen(parentAssoc.getParentRef());
when(mockedResultSet.getNodeRefs())
.thenReturn(buildList(node1))