mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
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:
@@ -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>
|
||||
|
||||
|
@@ -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>
|
||||
|
||||
|
@@ -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
|
||||
*
|
||||
|
@@ -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,56 +202,60 @@ 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())
|
||||
{
|
||||
boolean hasMore = true;
|
||||
int skipCount = 0;
|
||||
logger.debug("Job Finished as disposition action is empty");
|
||||
return;
|
||||
}
|
||||
|
||||
if (batchSize < 1)
|
||||
boolean hasMore = true;
|
||||
int skipCount = 0;
|
||||
|
||||
if (batchSize < 1)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
|
||||
}
|
||||
batchSize = DEFAULT_BATCH_SIZE;
|
||||
logger.debug("Invalid value for batch size: " + batchSize + " default value used instead.");
|
||||
}
|
||||
if (logger.isTraceEnabled())
|
||||
batchSize = DEFAULT_BATCH_SIZE;
|
||||
}
|
||||
if (logger.isTraceEnabled())
|
||||
{
|
||||
logger.trace("Using batch size of " + batchSize);
|
||||
}
|
||||
|
||||
while (hasMore)
|
||||
{
|
||||
SearchParameters params = new SearchParameters();
|
||||
params.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
|
||||
params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
|
||||
params.setQuery(getQuery());
|
||||
params.setSkipCount(skipCount);
|
||||
params.setMaxItems(batchSize);
|
||||
|
||||
// execute search
|
||||
ResultSet results = searchService.query(params);
|
||||
List<NodeRef> resultNodes = results.getNodeRefs();
|
||||
hasMore = results.hasMore();
|
||||
skipCount += resultNodes.size(); // increase by page size
|
||||
results.close();
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.trace("Using batch size of " + batchSize);
|
||||
logger.debug("Processing " + resultNodes.size() + " nodes");
|
||||
}
|
||||
|
||||
while (hasMore)
|
||||
// process search results
|
||||
if (!resultNodes.isEmpty())
|
||||
{
|
||||
SearchParameters params = new SearchParameters();
|
||||
params.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
|
||||
params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
|
||||
params.setQuery(getQuery());
|
||||
params.setSkipCount(skipCount);
|
||||
params.setMaxItems(batchSize);
|
||||
|
||||
// execute search
|
||||
ResultSet results = searchService.query(params);
|
||||
List<NodeRef> resultNodes = results.getNodeRefs();
|
||||
hasMore = results.hasMore();
|
||||
skipCount += resultNodes.size(); // increase by page size
|
||||
results.close();
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Processing " + resultNodes.size() + " nodes");
|
||||
}
|
||||
|
||||
// process search results
|
||||
if (!resultNodes.isEmpty())
|
||||
{
|
||||
executeAction(resultNodes);
|
||||
}
|
||||
executeAction(resultNodes);
|
||||
}
|
||||
}
|
||||
logger.debug("Job Finished");
|
||||
@@ -239,39 +279,51 @@ 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;
|
||||
}
|
||||
|
||||
// Run disposition action
|
||||
if (dispAction != null && dispositionActions.contains(dispAction))
|
||||
final String dispAction = (String) nodeService.getProperty(actionNode, PROP_DISPOSITION_ACTION);
|
||||
|
||||
// Run disposition action
|
||||
if (dispAction == null || !dispositionActions.contains(dispAction))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
|
||||
if (!parent.getTypeQName().equals(ASSOC_NEXT_DISPOSITION_ACTION))
|
||||
{
|
||||
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
|
||||
{
|
||||
// execute disposition action
|
||||
recordsManagementActionService
|
||||
.executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
ChildAssociationRef parent = nodeService.getPrimaryParent(actionNode);
|
||||
if (parent.getTypeQName().equals(RecordsManagementModel.ASSOC_NEXT_DISPOSITION_ACTION))
|
||||
{
|
||||
Map<String, Serializable> props = new HashMap<>(1);
|
||||
props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE);
|
||||
|
||||
try
|
||||
{
|
||||
// execute disposition action
|
||||
recordsManagementActionService
|
||||
.executeRecordsManagementAction(parent.getParentRef(), dispAction, props);
|
||||
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug("Processed action: " + dispAction + "on" + parent);
|
||||
}
|
||||
}
|
||||
catch (AlfrescoRuntimeException exception)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug(exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
logger.debug("Processed action: " + dispAction + "on" + parent);
|
||||
}
|
||||
}
|
||||
catch (AlfrescoRuntimeException exception)
|
||||
{
|
||||
if (logger.isDebugEnabled())
|
||||
{
|
||||
logger.debug(exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -280,6 +332,25 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute
|
||||
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;
|
||||
|
@@ -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()
|
||||
{
|
||||
executeImpl();
|
||||
|
||||
return null;
|
||||
}
|
||||
retryingTransactionHelper.doInTransaction((RetryingTransactionCallback<Void>) () -> {
|
||||
executeImpl();
|
||||
return null;
|
||||
}, false, true);
|
||||
}
|
||||
}
|
||||
|
@@ -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))
|
||||
|
Reference in New Issue
Block a user