Changed a bit the methods to be more readable.

This commit is contained in:
roxana
2016-10-07 10:45:49 +03:00
parent db231f62db
commit 6b916b977f

View File

@@ -21,19 +21,15 @@ package org.alfresco.module.org_alfresco_module_rm.disposition;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSelectionStrategy.DispositionableNodeRefComparator;
import org.alfresco.module.org_alfresco_module_rm.disposition.property.DispositionProperty; import org.alfresco.module.org_alfresco_module_rm.disposition.property.DispositionProperty;
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;
@@ -75,6 +71,8 @@ public class DispositionServiceImpl extends ServiceBaseImpl
/** Logger */ /** Logger */
private static Log logger = LogFactory.getLog(DispositionServiceImpl.class); private static Log logger = LogFactory.getLog(DispositionServiceImpl.class);
public enum WriteMode {ReadOnly, DateOnly, DateAndName};
/** Behaviour filter */ /** Behaviour filter */
private BehaviourFilter behaviourFilter; private BehaviourFilter behaviourFilter;
@@ -275,44 +273,42 @@ public class DispositionServiceImpl extends ServiceBaseImpl
public DispositionSchedule getDispositionSchedule(final NodeRef nodeRef) public DispositionSchedule getDispositionSchedule(final NodeRef nodeRef)
{ {
DispositionSchedule ds = null; DispositionSchedule ds = null;
NodeRef diNodeRef = null; NodeRef dsNodeRef = null;
if (isRecord(nodeRef)) if (isRecord(nodeRef))
{ {
// Get the record folders for the record final NextActionFromDisposition dsNextAction = getDispositionActionByNameForRecord(nodeRef);
List<NodeRef> recordFolders = recordFolderService.getRecordFolders(nodeRef);
DispositionAction nextDispositionAction = getNextDispositionAction(nodeRef); if (!dsNextAction.getWriteMode().equals(WriteMode.ReadOnly))
{
final NodeRef action = dsNextAction.getNextActionNodeRef();
final String dispositionActionName = dsNextAction.getNextActionName();
final Date dispositionActionDate = dsNextAction.getNextActionDateAsOf();
// the record is not created yet or it doesn't have DS AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
if (nextDispositionAction == null)
{ {
// calculate nextAction to be the longest first action step @Override
DispositionScheduleAndNextAction dsNodeRef = getNextDispositionActionFromParents(recordFolders); public Void doWork()
if (dsNodeRef != null)
{ {
nextDispositionAction = dsNodeRef.getNextAction(); nodeService.setProperty(action, PROP_DISPOSITION_AS_OF, dispositionActionDate);
diNodeRef = dsNodeRef.getDispositionNodeRef(); if (dsNextAction.getWriteMode().equals(WriteMode.DateAndName))
{
nodeService.setProperty(action, PROP_DISPOSITION_ACTION_NAME, dispositionActionName);
} }
}
else
{
diNodeRef = setRecordNextDispositionActionLatestDate(nodeRef, recordFolders, nextDispositionAction);
}
if (nextDispositionAction == null)
{
return null; return null;
} }
});
}
dsNodeRef = dsNextAction.getDispositionNodeRef();
} }
else else
{ {
// Get the disposition instructions for the node reference provided // Get the disposition instructions for the node reference provided
diNodeRef = getDispositionScheduleImpl(nodeRef); dsNodeRef = getDispositionScheduleImpl(nodeRef);
} }
if (diNodeRef != null) if (dsNodeRef != null)
{ {
ds = new DispositionScheduleImpl(serviceRegistry, nodeService, diNodeRef); ds = new DispositionScheduleImpl(serviceRegistry, nodeService, dsNodeRef);
} }
return ds; return ds;
@@ -1082,7 +1078,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl
} }
} }
} }
return null;// throw exception? poate nu are actiuni cu numele dat ca param return null;
} }
/** /**
@@ -1133,16 +1129,47 @@ public class DispositionServiceImpl extends ServiceBaseImpl
}); });
} }
class DispositionScheduleAndNextAction class NextActionFromDisposition
{ {
public NextActionFromDisposition(NodeRef dispositionNodeRef, NodeRef nextActionNodeRef,
String nextActionName, Date nextActionDateAsOf, WriteMode writeMode)
{
super();
this.dispositionNodeRef = dispositionNodeRef;
this.nextActionNodeRef = nextActionNodeRef;
this.nextActionName = nextActionName;
this.nextActionDateAsOf = nextActionDateAsOf;
this.writeMode = writeMode;
}
private NodeRef dispositionNodeRef; private NodeRef dispositionNodeRef;
private DispositionAction nextAction; private NodeRef nextActionNodeRef;
public DispositionScheduleAndNextAction(NodeRef dispositionNodeRef, DispositionAction nextAction) private String nextActionName;
private Date nextActionDateAsOf;
private WriteMode writeMode;
public WriteMode getWriteMode()
{ {
this.dispositionNodeRef = dispositionNodeRef; return writeMode;
this.nextAction = nextAction; }
public void setWriteMode(WriteMode writeMode)
{
this.writeMode = writeMode;
}
public NodeRef getNextActionNodeRef()
{
return nextActionNodeRef;
}
public void setNextActionNodeRef(NodeRef nextActionNodeRef)
{
this.nextActionNodeRef = nextActionNodeRef;
} }
public NodeRef getDispositionNodeRef() public NodeRef getDispositionNodeRef()
@@ -1155,75 +1182,44 @@ public class DispositionServiceImpl extends ServiceBaseImpl
this.dispositionNodeRef = dispositionNodeRef; this.dispositionNodeRef = dispositionNodeRef;
} }
public DispositionAction getNextAction() public String getNextActionName()
{ {
return nextAction; return nextActionName;
} }
public void setNextAction(DispositionAction nextAction) public void setNextActionName(String nextActionName)
{ {
this.nextAction = nextAction; this.nextActionName = nextActionName;
} }
public Date getNextActionDateAsOf()
{
return nextActionDateAsOf;
}
public void setNextActionDateAsOf(Date nextActionDateAsOf)
{
this.nextActionDateAsOf = nextActionDateAsOf;
}
} }
/** /**
* Get the longest period for the given action * Calculate next disposition action for a record
* *
* @param recordNodeRef * @param record
* @param recordFolders * @return next disposition action (name, date) and the disposition associated
* @param nextDispositionAction
* @return
*/ */
private NodeRef setRecordNextDispositionActionLatestDate(final NodeRef recordNodeRef, List<NodeRef> recordFolders, DispositionAction nextDispositionAction)
{
String recordnextDispositionActionName = nextDispositionAction.getName();
Date recordNextDispositionActionDate = nextDispositionAction.getAsOfDate();
Date nextDispositionActionDate = null;
NodeRef dispositionNodeRef = null;
for (NodeRef folder : recordFolders) protected NextActionFromDisposition getDispositionActionByNameForRecord(NodeRef record)
{ {
NodeRef dsNodeRef = getDispositionScheduleImpl(folder); List<NodeRef> recordFolders = recordFolderService.getRecordFolders(record);
if (dsNodeRef != null) DispositionAction nextDispositionAction = getNextDispositionAction(record);
{
Date dispActionDate = getDispositionActionDate(dsNodeRef, recordnextDispositionActionName);
if (nextDispositionActionDate == null || nextDispositionActionDate.before(dispActionDate))
{
nextDispositionActionDate = dispActionDate;
dispositionNodeRef = dsNodeRef;
}
}
}
// set only on record creation or when linking
if (!nextDispositionActionDate.equals(recordNextDispositionActionDate) && recordNextDispositionActionDate.before(nextDispositionActionDate))
{
final Date nextDADate = nextDispositionActionDate;
AuthenticationUtil.runAsSystem(new RunAsWork<Void>() if (nextDispositionAction == null)
{
@Override
public Void doWork()
{
nodeService.setProperty(recordNodeRef, PROP_DISPOSITION_AS_OF, nextDADate);
return null;
}
});
}
return dispositionNodeRef;
}
/**
* Calculate next disposition action for a record with the given parents
*
* @param recordFolders parent folders
* @return next disposition action and the disposition associated
*/
private DispositionScheduleAndNextAction getNextDispositionActionFromParents(List<NodeRef> recordFolders)
{ {
NodeRef newAction = null; NodeRef newAction = null;
String newDispositionActionName = null; String newDispositionActionName = null;
Date newDispositionActionDate = null; Date newDispositionActionDateAsOf = null;
NodeRef dispositionNodeRef = null; NodeRef dispositionNodeRef = null;
for (NodeRef folder : recordFolders) for (NodeRef folder : recordFolders)
{ {
@@ -1240,35 +1236,68 @@ public class DispositionServiceImpl extends ServiceBaseImpl
{ {
newAction = firstAction; newAction = firstAction;
newDispositionActionName = (String)nodeService.getProperty(newAction, PROP_DISPOSITION_ACTION_NAME); newDispositionActionName = (String)nodeService.getProperty(newAction, PROP_DISPOSITION_ACTION_NAME);
newDispositionActionDate = getDispositionActionDate(folderDS, newDispositionActionName); newDispositionActionDateAsOf = getDispositionActionDate(folderDS, newDispositionActionName);
dispositionNodeRef = folderDS;
} }
else if (firstDispositionAction.getAsOfDate() != null && newDispositionActionDate.before(firstDispositionAction.getAsOfDate())) else if (firstDispositionAction.getAsOfDate() != null && newDispositionActionDateAsOf.before(firstDispositionAction.getAsOfDate()))
{ {
newDispositionActionName = (String)nodeService.getProperty(firstAction, PROP_DISPOSITION_ACTION_NAME); newDispositionActionName = (String)nodeService.getProperty(firstAction, PROP_DISPOSITION_ACTION_NAME);
newDispositionActionDate = firstDispositionAction.getAsOfDate(); newDispositionActionDateAsOf = firstDispositionAction.getAsOfDate();
}
dispositionNodeRef = folderDS; dispositionNodeRef = folderDS;
} }
} }
} }
if (newDispositionActionName != null && newDispositionActionDateAsOf != null
&& dispositionNodeRef != null && newAction != null)
{
return new NextActionFromDisposition(dispositionNodeRef, newAction,
newDispositionActionName, newDispositionActionDateAsOf, WriteMode.DateAndName);
} }
if (newAction != null) { else
final NodeRef action = newAction;
final String dispositionActionName = newDispositionActionName;
final Date dispositionActionDate = newDispositionActionDate;
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
{ {
@Override
public Void doWork()
{
nodeService.setProperty(action, PROP_DISPOSITION_ACTION_NAME, dispositionActionName);
nodeService.setProperty(action, PROP_DISPOSITION_AS_OF, dispositionActionDate);
return null; return null;
} }
});
DispositionAction dsAction = new DispositionActionImpl(serviceRegistry, action);
return new DispositionScheduleAndNextAction(dispositionNodeRef, dsAction);
} }
else
{
// get the longest period for the given action name
String recordNextDispositionActionName = nextDispositionAction.getName();
Date recordNextDispositionActionDate = nextDispositionAction.getAsOfDate();
Date nextDispositionActionDate = null;
NodeRef dispositionNodeRef = null;
for (NodeRef folder : recordFolders)
{
NodeRef dsNodeRef = getDispositionScheduleImpl(folder);
if (dsNodeRef != null)
{
Date dispActionDate = getDispositionActionDate(dsNodeRef, recordNextDispositionActionName);
if (nextDispositionActionDate == null || nextDispositionActionDate.before(dispActionDate))
{
nextDispositionActionDate = dispActionDate;
dispositionNodeRef = dsNodeRef;
}
}
}
if (nextDispositionActionDate != null && dispositionNodeRef != null)
{
WriteMode mode = null;
if (!nextDispositionActionDate.equals(recordNextDispositionActionDate)
&& recordNextDispositionActionDate.before(nextDispositionActionDate))
{
mode = WriteMode.DateOnly;
}
else
{
mode = WriteMode.ReadOnly;
}
return new NextActionFromDisposition(dispositionNodeRef, nextDispositionAction.getNodeRef(),
recordNextDispositionActionName, nextDispositionActionDate, mode);
}
else
{
return null; return null;
} }
}
}
} }