RM-2526 Treat null as the largest date possible.

If a disposition step has an "as of" date of null then it requires human
interaction. Consequently there is no length of time we can wait before the
step triggers - so we treat it as the latest step if there are multiple
disposition schedules.
This commit is contained in:
Tom Page
2016-10-17 15:27:43 +01:00
parent 3ea86fa148
commit 531f10c458

View File

@@ -39,6 +39,7 @@ 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;
import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
import org.alfresco.repo.dictionary.types.period.Immediately;
import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.policy.annotation.Behaviour; import org.alfresco.repo.policy.annotation.Behaviour;
import org.alfresco.repo.policy.annotation.BehaviourBean; import org.alfresco.repo.policy.annotation.BehaviourBean;
@@ -71,10 +72,19 @@ public class DispositionServiceImpl extends ServiceBaseImpl
/** Logger */ /** Logger */
private static final Logger LOGGER = LoggerFactory.getLogger(DispositionServiceImpl.class); private static final Logger LOGGER = LoggerFactory.getLogger(DispositionServiceImpl.class);
private static final String PERIOD_IMMEDIATELY = "immediately";
/** Transaction mode for setting next action */ /** Transaction mode for setting next action */
public enum WriteMode {READ_ONLY, DATE_ONLY, DATE_AND_NAME}; public enum WriteMode
{
/** Do not update any data. */
READ_ONLY,
/** Only set the "disposition as of" date. */
DATE_ONLY,
/**
* Set the "disposition as of" date and the name of the next action. This only happens during the creation of a
* disposition schedule impl node under a record or folder.
*/
DATE_AND_NAME
};
/** Behaviour filter */ /** Behaviour filter */
private BehaviourFilter behaviourFilter; private BehaviourFilter behaviourFilter;
@@ -708,7 +718,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl
} }
else else
{ {
if (period.getPeriodType().equals(PERIOD_IMMEDIATELY)) if (period.getPeriodType().equals(Immediately.PERIOD_TYPE))
{ {
contextDate = (Date)nodeService.getProperty(nodeRef, ContentModel.PROP_CREATED); contextDate = (Date)nodeService.getProperty(nodeRef, ContentModel.PROP_CREATED);
} }
@@ -1123,19 +1133,27 @@ public class DispositionServiceImpl extends ServiceBaseImpl
{ {
String recordNextDispositionActionName = nextDispositionAction.getName(); String recordNextDispositionActionName = nextDispositionAction.getName();
Date recordNextDispositionActionDate = nextDispositionAction.getAsOfDate(); Date recordNextDispositionActionDate = nextDispositionAction.getAsOfDate();
Date nextDispositionActionDate = null; // We're looking for the latest date, so initially start with a very early one.
Date nextDispositionActionDate = new Date(Long.MIN_VALUE);
NodeRef dispositionNodeRef = null; NodeRef dispositionNodeRef = null;
// Find the latest "disposition as of" date from all the schedules this record is subject to.
for (NodeRef folder : recordFolders) for (NodeRef folder : recordFolders)
{ {
NodeRef dsNodeRef = getDispositionScheduleImpl(folder); NodeRef dsNodeRef = getDispositionScheduleImpl(folder);
if (dsNodeRef != null) if (dsNodeRef != null)
{ {
Date dispActionDate = getDispositionActionDate(record, dsNodeRef, recordNextDispositionActionName); Date dispActionDate = getDispositionActionDate(record, dsNodeRef, recordNextDispositionActionName);
if (nextDispositionActionDate == null || nextDispositionActionDate.before(dispActionDate)) if (dispActionDate == null || (nextDispositionActionDate != null
&& nextDispositionActionDate.before(dispActionDate)))
{ {
nextDispositionActionDate = dispActionDate; nextDispositionActionDate = dispActionDate;
dispositionNodeRef = dsNodeRef; dispositionNodeRef = dsNodeRef;
if (dispActionDate == null)
{
// Treat null as the latest date possible (so stop searching further).
break;
}
} }
} }
} }
@@ -1143,36 +1161,39 @@ public class DispositionServiceImpl extends ServiceBaseImpl
{ {
return null; return null;
} }
WriteMode mode = null; WriteMode mode = determineWriteMode(recordNextDispositionActionDate, nextDispositionActionDate);
if (recordNextDispositionActionDate != null)
{
if ((nextDispositionActionDate == null)
|| (!nextDispositionActionDate.equals(recordNextDispositionActionDate)
&& recordNextDispositionActionDate.before(nextDispositionActionDate)))
{
mode = WriteMode.DATE_ONLY;
}
else
{
mode = WriteMode.READ_ONLY;
}
}
else
{
if (nextDispositionActionDate != null)
{
mode = WriteMode.DATE_ONLY;
}
else
{
mode = WriteMode.READ_ONLY;
}
}
return new NextActionFromDisposition(dispositionNodeRef, nextDispositionAction.getNodeRef(), return new NextActionFromDisposition(dispositionNodeRef, nextDispositionAction.getNodeRef(),
recordNextDispositionActionName, nextDispositionActionDate, mode); recordNextDispositionActionName, nextDispositionActionDate, mode);
} }
/**
* Determine what should be updated for an existing disposition schedule impl. We only update the date if the
* existing date is earlier than the calculated one.
*
* @param recordNextDispositionActionDate The next action date found on the record node (or folder node).
* @param nextDispositionActionDate The next action date calculated from the current disposition schedule(s)
* affecting the node.
* @return READ_ONLY if nothing should be updated, or DATE_ONLY if the date needs updating.
*/
private WriteMode determineWriteMode(Date recordNextDispositionActionDate, Date nextDispositionActionDate)
{
// Treat null dates as being the latest possible date.
Date maxDate = new Date(Long.MAX_VALUE);
Date recordDate = (recordNextDispositionActionDate != null ? recordNextDispositionActionDate : maxDate);
Date calculatedDate = (nextDispositionActionDate != null ? recordNextDispositionActionDate : maxDate);
// We only need to update the date if the current one is too early.
if (recordDate.before(calculatedDate))
{
return WriteMode.DATE_ONLY;
}
else
{
return WriteMode.READ_ONLY;
}
}
/** /**
* Calculate first disposition action when the record doesn't have one * Calculate first disposition action when the record doesn't have one
* @param recordFolders * @param recordFolders
@@ -1182,7 +1203,8 @@ public class DispositionServiceImpl extends ServiceBaseImpl
{ {
NodeRef newAction = null; NodeRef newAction = null;
String newDispositionActionName = null; String newDispositionActionName = null;
Date newDispositionActionDateAsOf = null; // We're looking for the latest date, so start with a very early one.
Date newDispositionActionDateAsOf = new Date(Long.MIN_VALUE);
NodeRef dispositionNodeRef = null; NodeRef dispositionNodeRef = null;
for (NodeRef folder : recordFolders) for (NodeRef folder : recordFolders)
{ {
@@ -1195,6 +1217,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl
if (dispositionActionDefinitions != null && dispositionActionDefinitions.size() > 0) if (dispositionActionDefinitions != null && dispositionActionDefinitions.size() > 0)
{ {
DispositionActionDefinition firstDispositionActionDef = dispositionActionDefinitions.get(0); DispositionActionDefinition firstDispositionActionDef = dispositionActionDefinitions.get(0);
dispositionNodeRef = folderDS;
if (newAction == null) if (newAction == null)
{ {
@@ -1203,20 +1226,25 @@ public class DispositionServiceImpl extends ServiceBaseImpl
newDispositionActionName = (String)nodeService.getProperty(newAction, PROP_DISPOSITION_ACTION_NAME); newDispositionActionName = (String)nodeService.getProperty(newAction, PROP_DISPOSITION_ACTION_NAME);
newDispositionActionDateAsOf = firstDispositionAction.getAsOfDate(); newDispositionActionDateAsOf = firstDispositionAction.getAsOfDate();
} }
else if (firstDispositionActionDef.getPeriod() != null) { else if (firstDispositionActionDef.getPeriod() != null)
{
Date firstActionDate = calculateAsOfDate(record, firstDispositionActionDef, true); Date firstActionDate = calculateAsOfDate(record, firstDispositionActionDef, true);
if (newDispositionActionDateAsOf.before(firstActionDate)) if (firstActionDate == null || (newDispositionActionDateAsOf != null
&& newDispositionActionDateAsOf.before(firstActionDate)))
{ {
newDispositionActionName =firstDispositionActionDef.getName(); newDispositionActionName = firstDispositionActionDef.getName();
newDispositionActionDateAsOf = firstActionDate; newDispositionActionDateAsOf = firstActionDate;
if (firstActionDate == null)
{
// Treat null as the latest date possible, so there's no point searching further.
break;
}
} }
} }
dispositionNodeRef = folderDS; }
} }
} }
} if (newDispositionActionName == null || dispositionNodeRef == null || newAction == null)
if (newDispositionActionName == null
|| dispositionNodeRef == null || newAction == null)
{ {
return null; return null;
} }