Refactored RecordsManagementService and deprecated the methods. The methods have been moved to RecordService, RecordFolderService and DispostionService. The deprecated method calls in the code have been replaced and the bean definitions have been changed accordingly.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@57893 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Tuna Aksoy
2013-11-13 22:34:29 +00:00
parent 7462cd4fa7
commit 4c01bbbb83
99 changed files with 4038 additions and 3931 deletions

View File

@@ -23,303 +23,243 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
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.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.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
/**
* Records management service interface.
*
*
* Allows simple creation, manipulation and querying of records management components.
*
*
* @author Roy Wetherall
*/
public interface RecordsManagementService
{
/********** RM Component methods **********/
/**
* @deprecated as of 2.1, see {@link FilePlanService#isFilePlan(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#isFilePlan(NodeRef)}
*/
@Deprecated
boolean isFilePlanComponent(NodeRef nodeRef);
/**
* @since 2.0
* @deprecated as of 2.1, see {@link FilePlanService#getFilePlanComponentKind(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlanComponentKind(NodeRef)}
*/
@Deprecated
FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef);
/**
* @since 2.0
* @deprecated as of 2.1, see {@link FilePlanService#getFilePlanComponentKindFromType(QName)}
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlanComponentKindFromType(QName)}
*/
@Deprecated
FilePlanComponentKind getFilePlanComponentKindFromType(QName type);
/**
* @deprecated as of 2.1, see {@link FilePlanService#isFilePlanContainer(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#isFilePlanContainer(NodeRef)}
*/
@Deprecated
boolean isRecordsManagementContainer(NodeRef nodeRef);
/**
* @deprecated as of 2.1, see {@link FilePlanService#isFilePlan(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#isFilePlan(NodeRef)}
*/
@Deprecated
boolean isFilePlan(NodeRef nodeRef);
/**
* @deprecated as of 2.1, see {@link FilePlanService#isRecordCategory(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#isRecordCategory(NodeRef)}
*/
@Deprecated
boolean isRecordCategory(NodeRef nodeRef);
boolean isRecordCategory(NodeRef nodeRef);
/**
* Indicates whether the given node is a record folder or not.
*
* @param nodeRef node reference
* @return boolean true if record folder, false otherwise
* @deprecated As of 2.2, see {@link RecordFolderService#isRecordFolder(NodeRef)}
*/
boolean isRecordFolder(NodeRef nodeRef); // record folder service
@Deprecated
boolean isRecordFolder(NodeRef nodeRef);
/**
* Indicates whether the given node is a transfer (container) or not.
*
*
* @param nodeRef node reference
* @return boolean true if transfer, false otherwise
*
*
* @since 2.0
*/
boolean isTransfer(NodeRef nodeRef); // transfer service
/**
* Indicates whether the given node (record or record folder) is a metadata stub or not.
*
* @param nodeRef node reference
* @return boolean true if a metadata stub, false otherwise
*
* @since 2.0
* @deprecated As of 2.2, see {@link RecordService#isMetadataStub(NodeRef)}
*/
boolean isMetadataStub(NodeRef nodeRef); // record service
@Deprecated
boolean isMetadataStub(NodeRef nodeRef);
/**
* Indicates whether the item is cutoff or not.
*
* @param nodeRef node reference
* @return boolean true if the item is cutoff, false otherwise
*
* @since 2.0
* @deprecated As of 2.2, see {@link DispositionService#isCutoff(NodeRef)}
*/
boolean isCutoff(NodeRef nodeRef); // disposition service ??
boolean isCutoff(NodeRef nodeRef);
/**
* @deprecated as of 2.1, see {@link FilePlanService#getNodeRefPath(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#getNodeRefPath(NodeRef)}
*/
@Deprecated
List<NodeRef> getNodeRefPath(NodeRef nodeRef);
/**
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlan(NodeRef)}
*/
@Deprecated
NodeRef getFilePlan(NodeRef nodeRef);
/********** File Plan Methods **********/
/**
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlans()}
*/
@Deprecated
List<NodeRef> getFilePlans();
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName)}
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName)}
*/
@Deprecated
NodeRef createFilePlan(NodeRef parent, String name, QName type);
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName, Map)}
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName, Map)}
*/
@Deprecated
NodeRef createFilePlan(NodeRef parent, String name, QName type, Map<QName, Serializable> properties);
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String)}
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String)}
*/
@Deprecated
NodeRef createFilePlan(NodeRef parent, String name);
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, Map)}
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, Map)}
*/
@Deprecated
NodeRef createFilePlan(NodeRef parent, String name, Map<QName, Serializable> properties);
/********** Record Category Methods **********/
/**
* @deprecated as of 2.1, see {@link FilePlanService#getAllContained(NodeRef, boolean)}
* @deprecated As of 2.1, see {@link FilePlanService#getAllContained(NodeRef, boolean)}
*/
@Deprecated
List<NodeRef> getAllContained(NodeRef recordCategory, boolean deep);
/**
* @deprecated as of 2.1, see {@link FilePlanService#getAllContained(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#getAllContained(NodeRef)}
*/
@Deprecated
List<NodeRef> getAllContained(NodeRef recordCategory);
List<NodeRef> getAllContained(NodeRef recordCategory);
/**
* @deprecated as of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef, boolean)}
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef, boolean)}
*/
@Deprecated
List<NodeRef> getContainedRecordCategories(NodeRef recordCategory, boolean deep);
/**
* @deprecated as of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef)}
*/
@Deprecated
List<NodeRef> getContainedRecordCategories(NodeRef recordCategory);
/**
* @deprecated as of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef, boolean)}
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef, boolean)}
*/
@Deprecated
List<NodeRef> getContainedRecordFolders(NodeRef container, boolean deep);
/**
* @deprecated as of 2.1, see {@link FilePlanService#getContainedRecordFolders(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordFolders(NodeRef)}
*/
@Deprecated
List<NodeRef> getContainedRecordFolders(NodeRef container);
/**
* @deprecated as of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, QName)}
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, QName)}
*/
@Deprecated
NodeRef createRecordCategory(NodeRef parent, String name, QName type);
/**
* @deprecated as of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, QName, Map)}
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, QName, Map)}
*/
@Deprecated
NodeRef createRecordCategory(NodeRef parent, String name, QName type, Map<QName, Serializable> properties);
/**
* @deprecated as of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String)}
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String)}
*/
@Deprecated
NodeRef createRecordCategory(NodeRef parent, String name);
/**
* @deprecated as of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, Map)}
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, Map)}
*/
@Deprecated
NodeRef createRecordCategory(NodeRef parent, String name, Map<QName, Serializable> properties);
/********** Record Folder methods **********/
/**
* Indicates whether the contents of a record folder are all declared.
*
* @param nodeRef node reference (record folder)
* @return boolean true if record folder contents are declared, false otherwise
*/
boolean isRecordFolderDeclared(NodeRef nodeRef);
/**
* Indicates whether a record folder is closed or not.
*
* @param nodeRef node reference (record folder)
* @return boolean true if record folder is closed, false otherwise
*
* @since 2.0
*/
boolean isRecordFolderClosed(NodeRef nodeRef);
// TODO NodeRef getRecordFolderByPath(String path);
// TODO NodeRef getRecordFolderById(String id);
// TODO NodeRef getRecordFolderByName(NodeRef parent, String name);
/**
* Create a record folder in the rm container. The record folder with take the name and type
* provided.
*
* @param rmContainer records management container
* @param name name
* @param type type
* @return NodeRef node reference of record folder
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type);
/**
*
* @param rmContainer
* @param name
* @param type
* @param properties
* @return
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type, Map<QName, Serializable> properties);
/**
* Type defaults to rm:recordFolder
*
* @see RecordsManagementService#createRecordCategory(NodeRef, String, QName)
*
* @param rmContainer records management container
* @param name name
* @return NodeRef node reference of record folder
*/
NodeRef createRecordFolder(NodeRef parent, String name);
/**
*
* @param parent
* @param name
* @param properties
* @return
*/
NodeRef createRecordFolder(NodeRef parent, String name, Map<QName, Serializable> properties);
// TODO void deleteRecordFolder(NodeRef recordFolder);
// TODO List<NodeRef> getParentRecordsManagementContainers(NodeRef container); // also applicable to record folders
/**
* Gets a list of all the records within a record folder
*
* @param recordFolder record folder
* @return List<NodeRef> list of records in the record folder
*/
// TODO rename to getContainedRecords(NodeRef recordFolder);
List<NodeRef> getRecords(NodeRef recordFolder);
// TODO move? copy? link?
/**
* Get all the record folders that a record is filed into.
*
* @param record the record node reference
* @return List<NodeRef> list of folder record node references
*/
// TODO rename to List<NodeRef> getParentRecordFolders(NodeRef record);
List<NodeRef> getRecordFolders(NodeRef record);
/********** Deprecated **********/
/**
/**
* @deprecated As of 2.2, see {@link RecordFolderService#isRecordFolderDeclared(NodeRef)}
*/
@Deprecated
boolean isRecordFolderDeclared(NodeRef nodeRef);
/**
* @since 2.0
* @deprecated As of 2.2, see {@link RecordFolderService#isRecordFolderClosed(NodeRef)}
*/
@Deprecated
boolean isRecordFolderClosed(NodeRef nodeRef);
/**
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String, QName)}
*/
@Deprecated
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type);
/**
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String, QName, Map)}
*/
@Deprecated
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type, Map<QName, Serializable> properties);
/**
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String)}
*/
@Deprecated
NodeRef createRecordFolder(NodeRef parent, String name);
/**
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String, Map)
*/
@Deprecated
NodeRef createRecordFolder(NodeRef parent, String name, Map<QName, Serializable> properties);
/**
* @deprecated As of 2.2, see {@link RecordService#getRecords(NodeRef)}
*/
@Deprecated
List<NodeRef> getRecords(NodeRef recordFolder);
/**
* @deprecated As of 2.2, see {@link RecordFolderService#getRecordFolders(NodeRef)}
*/
@Deprecated
List<NodeRef> getRecordFolders(NodeRef record);
/**
* @deprecated As of 2.1, replaced by {@link RecordService#getRecordMetaDataAspects()}
*/
@Deprecated
@@ -330,28 +270,28 @@ public interface RecordsManagementService
*/
@Deprecated
boolean isRecordDeclared(NodeRef nodeRef);
/**
* @since 2.0
* @deprecated As of 2.1, replaced by {@link FreezeService#isHold(NodeRef)}
*/
@Deprecated
boolean isHold(NodeRef nodeRef);
/**
* @since 2.0
* @deprecated As of 2.1, replaced by {@link FreezeService#isFrozen(NodeRef)}
*/
@Deprecated
@Deprecated
boolean isFrozen(NodeRef nodeRef);
/**
* @since 2.0
* @deprecated As of 2.1, replaced by {@link FreezeService#hasFrozenChildren(NodeRef)}
*/
@Deprecated
boolean hasFrozenChildren(NodeRef nodeRef);
/**
* @deprecated As of 2.1, replaced by {@link RecordService#isRecord(NodeRef)}
*/

View File

@@ -29,10 +29,14 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.model.RenditionModel;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
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.freeze.FreezeService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementCustomModel;
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.security.ExtendedSecurityService;
import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
@@ -42,15 +46,11 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.ScriptService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.ParameterCheck;
import org.alfresco.util.PropertyMap;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.extensions.surf.util.I18NUtil;
/**
@@ -62,17 +62,12 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
implements RecordsManagementService,
RecordsManagementModel,
RecordsManagementPolicies.OnCreateReference,
RecordsManagementPolicies.OnRemoveReference,
ApplicationContextAware
RecordsManagementPolicies.OnRemoveReference
{
/** I18N */
private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container";
private final static String MSG_UPDATE_DISP_ACT_DEF = "rm.service.update-disposition-action-def";
private final static String MSG_SET_ID = "rm.service.set-id";
private final static String MSG_RECORD_FOLDER_EXPECTED = "rm.service.record-folder-expected";
private final static String MSG_PARENT_RECORD_FOLDER_ROOT = "rm.service.parent-record-folder-root";
private final static String MSG_PARENT_RECORD_FOLDER_TYPE = "rm.service.parent-record-folder-type";
private final static String MSG_RECORD_FOLDER_TYPE = "rm.service.record-folder-type";
/** Store that the RM roots are contained within */
@SuppressWarnings("unused")
@@ -91,18 +86,6 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
/** Java behaviour */
private JavaBehaviour onChangeToDispositionActionDefinition;
/** Application context */
private ApplicationContext applicationContext;
/**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
}
/**
* Set the service registry service
*
@@ -135,9 +118,68 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
this.defaultStoreRef = defaultStoreRef;
}
/**
* @return File plan service
*/
private FilePlanService getFilePlanService()
{
return (FilePlanService)applicationContext.getBean("filePlanService");
return serviceRegistry.getFilePlanService();
}
/**
* @return Record Folder Service
*/
private RecordFolderService getRecordFolderService()
{
return serviceRegistry.getRecordFolderService();
}
/**
* @return Record Service
*/
private RecordService getRecordService()
{
return serviceRegistry.getRecordService();
}
/**
* @return Freeze Service
*/
private FreezeService getFreezeService()
{
return serviceRegistry.getFreezeService();
}
/**
* @return Disposition Service
*/
private DispositionService getDispositionService()
{
return serviceRegistry.getDispositionService();
}
/**
* @return Extended Security Service
*/
private ExtendedSecurityService getExtendedSecurityService()
{
return serviceRegistry.getExtendedSecurityService();
}
/**
* @return Script Service
*/
private ScriptService getScriptService()
{
return serviceRegistry.getScriptService();
}
/**
* @return Namespace service
*/
private NamespaceService getNamespaceService()
{
return serviceRegistry.getNamespaceService();
}
/**
@@ -236,8 +278,8 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
nodeService.addAspect(thumbnail, ASPECT_FILE_PLAN_COMPONENT, null);
// manage any extended readers
ExtendedSecurityService extendedSecurityService = serviceRegistry.getExtendedSecurityService();
NodeRef parent = childAssocRef.getParentRef();
ExtendedSecurityService extendedSecurityService = getExtendedSecurityService();
Set<String> readers = extendedSecurityService.getExtendedReaders(parent);
Set<String> writers = extendedSecurityService.getExtendedWriters(parent);
if (readers != null && readers.size() != 0)
@@ -296,6 +338,37 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}
}
/**
* This method compares the oldProps map against the newProps map and returns
* a set of QNames of the properties that have changed. Changed here means one of
* <ul>
* <li>the property has been removed</li>
* <li>the property has had its value changed</li>
* <li>the property has been added</li>
* </ul>
*/
private Set<QName> determineChangedProps(Map<QName, Serializable> oldProps, Map<QName, Serializable> newProps)
{
Set<QName> result = new HashSet<QName>();
for (QName qn : oldProps.keySet())
{
if (newProps.get(qn) == null ||
newProps.get(qn).equals(oldProps.get(qn)) == false)
{
result.add(qn);
}
}
for (QName qn : newProps.keySet())
{
if (oldProps.get(qn) == null)
{
result.add(qn);
}
}
return result;
}
/**
* Called after any Records Management property has been updated.
*/
@@ -316,6 +389,68 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}, AuthenticationUtil.getAdminUserName());
}
/**
* This method examines the old and new property sets and for those properties which
* have changed, looks for script resources corresponding to those properties.
* Those scripts are then called via the ScriptService.
*
* @param nodeWithChangedProperties the node whose properties have changed.
* @param oldProps the old properties and their values.
* @param newProps the new properties and their values.
*
* @see #lookupScripts(Map<QName, Serializable>, Map<QName, Serializable>)
*/
private void lookupAndExecuteScripts(NodeRef nodeWithChangedProperties,
Map<QName, Serializable> oldProps, Map<QName, Serializable> newProps)
{
List<NodeRef> scriptRefs = lookupScripts(oldProps, newProps);
Map<String, Object> objectModel = new HashMap<String, Object>(1);
objectModel.put("node", nodeWithChangedProperties);
objectModel.put("oldProperties", oldProps);
objectModel.put("newProperties", newProps);
ScriptService scriptService = getScriptService();
for (NodeRef scriptRef : scriptRefs)
{
scriptService.executeScript(scriptRef, null, objectModel);
}
}
/**
* This method determines which properties have changed and for each such property
* looks for a script resource in a well-known location.
*
* @param oldProps the old properties and their values.
* @param newProps the new properties and their values.
* @return A list of nodeRefs corresponding to the Script resources.
*
* @see #determineChangedProps(Map<QName, Serializable>, Map<QName, Serializable>)
*/
private List<NodeRef> lookupScripts(Map<QName, Serializable> oldProps, Map<QName, Serializable> newProps)
{
List<NodeRef> result = new ArrayList<NodeRef>();
Map<QName, Serializable> changedProps = PropertyMap.getChangedProperties(oldProps, newProps);
for (QName propQName : changedProps.keySet())
{
QName prefixedQName = propQName.getPrefixedQName(getNamespaceService());
String [] splitQName = QName.splitPrefixedQName(prefixedQName.toPrefixString());
final String shortPrefix = splitQName[0];
final String localName = splitQName[1];
// This is the filename pattern which is assumed.
// e.g. a script file cm_name.js would be called for changed to cm:name
String expectedScriptName = shortPrefix + "_" + localName + ".js";
NodeRef nextElement = nodeService.getChildByName(scriptsFolderNodeRef, ContentModel.ASSOC_CONTAINS, expectedScriptName);
if (nextElement != null) result.add(nextElement);
}
return result;
}
/**
* Property update behaviour implementation
*
@@ -380,7 +515,7 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
objectModel.put("policy", policy);
objectModel.put("reference", referenceId);
serviceRegistry.getScriptService().executeScript(scriptNodeRef, null, objectModel);
getScriptService().executeScript(scriptNodeRef, null, objectModel);
}
}
@@ -401,43 +536,25 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef)
*
* @deprecated As of 2.1, see {@link FilePlanService#isFilePlan(NodeRef)}
*/
@Deprecated
public boolean isFilePlan(NodeRef nodeRef)
{
return getFilePlanService().isFilePlan(nodeRef);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#isFilePlanContainer(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#isFilePlanComponent(NodeRef)}
*/
@Override
public boolean isRecordsManagementContainer(NodeRef nodeRef)
{
return getFilePlanService().isFilePlanContainer(nodeRef);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#isFilePlanComponent(NodeRef)}
*/
public boolean isFilePlanComponent(NodeRef nodeRef)
{
return getFilePlanService().isFilePlanComponent(nodeRef);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#getFilePlanComponentKind(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlanComponentKind(NodeRef)}
*/
@Override
public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef)
{
return getFilePlanService().getFilePlanComponentKind(nodeRef);
return getFilePlanService().getFilePlanComponentKind(nodeRef);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#getFilePlanComponentKindFromType(QName)}
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlanComponentKindFromType(QName)}
*/
@Override
public FilePlanComponentKind getFilePlanComponentKindFromType(QName type)
@@ -446,102 +563,97 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#isRecordCategory(NodeRef)}
* @deprecated As of 2.1, see {@link FilePlanService#isFilePlanContainer(NodeRef)}
*/
@Override
public boolean isRecordsManagementContainer(NodeRef nodeRef)
{
return getFilePlanService().isFilePlanContainer(nodeRef);
}
/**
* @deprecated As of 2.1, see {@link FilePlanService#isFilePlan(NodeRef)}
*/
@Override
public boolean isFilePlan(NodeRef nodeRef)
{
return getFilePlanService().isFilePlan(nodeRef);
}
/**
* @deprecated As of 2.1, see {@link FilePlanService#isRecordCategory(NodeRef)}
*/
@Override
public boolean isRecordCategory(NodeRef nodeRef)
{
return getFilePlanService().isRecordCategory(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecordFolder(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.2, see {@link RecordFolderService#isRecordFolder(NodeRef)}
*/
@Override
public boolean isRecordFolder(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_RECORD_FOLDER);
return getRecordFolderService().isRecordFolder(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isTransfer(org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public boolean isTransfer(NodeRef nodeRef)
{
return instanceOf(nodeRef, TYPE_TRANSFER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isMetadataStub(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.2, see {@link RecordService#isMetadataStub(NodeRef)}
*/
@Override
public boolean isMetadataStub(NodeRef nodeRef)
{
return nodeService.hasAspect(nodeRef, ASPECT_GHOSTED);
return getRecordService().isMetadataStub(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isCutoff(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.2, see {@link DispositionService#isCutoff(NodeRef)}
*/
@Override
public boolean isCutoff(NodeRef nodeRef)
{
return nodeService.hasAspect(nodeRef, ASPECT_CUT_OFF);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getFilePlan(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlan(NodeRef)}
*/
@Deprecated
public NodeRef getFilePlan(NodeRef nodeRef)
{
return getFilePlanService().getFilePlan(nodeRef);
return getDispositionService().isCutoff(nodeRef);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#getNodeRefPath(NodeRef)}
*/
@Override
public List<NodeRef> getNodeRefPath(NodeRef nodeRef)
{
return getFilePlanService().getNodeRefPath(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getRecordsManagementRoots(org.alfresco.service.cmr.repository.StoreRef)
*
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlan(NodeRef)}
*/
@Override
public NodeRef getFilePlan(NodeRef nodeRef)
{
return getFilePlanService().getFilePlan(nodeRef);
}
/**
* @deprecated As of 2.1, see {@link FilePlanService#getFilePlans()}
*/
@Deprecated
@Override
public List<NodeRef> getFilePlans()
{
return new ArrayList<NodeRef>(getFilePlanService().getFilePlans());
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName, Map)}
*/
public NodeRef createFilePlan(NodeRef parent, String name, QName type, Map<QName, Serializable> properties)
{
return getFilePlanService().createFilePlan(parent, name, type, properties);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, Map)}
*/
public NodeRef createFilePlan(NodeRef parent, String name, Map<QName, Serializable> properties)
{
return getFilePlanService().createFilePlan(parent, name, properties);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String)}
*/
public NodeRef createFilePlan(NodeRef parent, String name)
{
return getFilePlanService().createFilePlan(parent, name);
}
/**
* @deprecated as of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName)}
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName)}
*/
@Override
public NodeRef createFilePlan(NodeRef parent, String name, QName type)
@@ -550,39 +662,43 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, QName, Map)}
*/
public NodeRef createRecordCategory(NodeRef parent, String name, QName type, Map<QName, Serializable> properties)
@Override
public NodeRef createFilePlan(NodeRef parent, String name, QName type, Map<QName, Serializable> properties)
{
return getFilePlanService().createRecordCategory(parent, name, type, properties);
return getFilePlanService().createFilePlan(parent, name, type, properties);
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String)}
*/
public NodeRef createRecordCategory(NodeRef parent, String name)
@Override
public NodeRef createFilePlan(NodeRef parent, String name)
{
return getFilePlanService().createRecordCategory(parent, name);
return getFilePlanService().createFilePlan(parent, name);
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#createFilePlan(NodeRef, String, Map)}
*/
public NodeRef createRecordCategory(NodeRef parent, String name, Map<QName, Serializable> properties)
@Override
public NodeRef createFilePlan(NodeRef parent, String name, Map<QName, Serializable> properties)
{
return getFilePlanService().createRecordCategory(parent, name, properties);
return getFilePlanService().createFilePlan(parent, name, properties);
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#getAllContained(NodeRef, boolean)}
*/
public NodeRef createRecordCategory(NodeRef parent, String name, QName type)
@Override
public List<NodeRef> getAllContained(NodeRef container, boolean deep)
{
return getFilePlanService().createRecordCategory(parent, name, type);
return getFilePlanService().getAllContained(container, deep);
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#getAllContained(NodeRef)}
*/
@Override
public List<NodeRef> getAllContained(NodeRef container)
@@ -591,25 +707,7 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}
/**
* @deprecated as of 2.1
*/
@Override
public List<NodeRef> getAllContained(NodeRef container, boolean deep)
{
return getFilePlanService().getAllContained(container, deep);
}
/**
* @deprecated as of 2.1
*/
@Override
public List<NodeRef> getContainedRecordCategories(NodeRef container)
{
return getFilePlanService().getContainedRecordCategories(container);
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef, boolean)}
*/
@Override
public List<NodeRef> getContainedRecordCategories(NodeRef container, boolean deep)
@@ -618,16 +716,16 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordCategories(NodeRef)}
*/
@Override
public List<NodeRef> getContainedRecordFolders(NodeRef container)
public List<NodeRef> getContainedRecordCategories(NodeRef container)
{
return getFilePlanService().getContainedRecordFolders(container);
return getFilePlanService().getContainedRecordCategories(container);
}
/**
* @deprecated as of 2.1
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordFolders(NodeRef, boolean)}
*/
@Override
public List<NodeRef> getContainedRecordFolders(NodeRef container, boolean deep)
@@ -636,311 +734,172 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecordFolderDeclared(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link FilePlanService#getContainedRecordFolders(NodeRef)}
*/
public boolean isRecordFolderDeclared(NodeRef recordFolder)
@Override
public List<NodeRef> getContainedRecordFolders(NodeRef container)
{
// Check we have a record folder
if (isRecordFolder(recordFolder) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_EXPECTED));
}
boolean result = true;
// Check that each record in the record folder in declared
List<NodeRef> records = getRecords(recordFolder);
for (NodeRef record : records)
{
if (serviceRegistry.getRecordService().isDeclared(record) == false)
{
result = false;
break;
}
}
return result;
return getFilePlanService().getContainedRecordFolders(container);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecordFolderClosed(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, QName)}
*/
@Override
public NodeRef createRecordCategory(NodeRef parent, String name, QName type)
{
return getFilePlanService().createRecordCategory(parent, name, type);
}
/**
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, QName, Map)}
*/
@Override
public NodeRef createRecordCategory(NodeRef parent, String name, QName type, Map<QName, Serializable> properties)
{
return getFilePlanService().createRecordCategory(parent, name, type, properties);
}
/**
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String)}
*/
@Override
public NodeRef createRecordCategory(NodeRef parent, String name)
{
return getFilePlanService().createRecordCategory(parent, name);
}
/**
* @deprecated As of 2.1, see {@link FilePlanService#createRecordCategory(NodeRef, String, Map)}
*/
public NodeRef createRecordCategory(NodeRef parent, String name, Map<QName, Serializable> properties)
{
return getFilePlanService().createRecordCategory(parent, name, properties);
}
/**
* @deprecated As of 2.2, see {@link RecordFolderService#isRecordFolderDeclared(NodeRef)}
*/
@Override
public boolean isRecordFolderDeclared(NodeRef recordFolder)
{
return getRecordFolderService().isRecordFolderDeclared(recordFolder);
}
/**
* @deprecated As of 2.2, see {@link RecordFolderService#isRecordFolderClosed(NodeRef)}
*/
@Override
public boolean isRecordFolderClosed(NodeRef nodeRef)
{
// Check we have a record folder
if (isRecordFolder(nodeRef) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_EXPECTED));
}
return ((Boolean)this.nodeService.getProperty(nodeRef, PROP_IS_CLOSED)).booleanValue();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getRecordFolders(org.alfresco.service.cmr.repository.NodeRef)
*/
public List<NodeRef> getRecordFolders(NodeRef record)
{
List<NodeRef> result = new ArrayList<NodeRef>(1);
if (isRecord(record) == true)
{
List<ChildAssociationRef> assocs = this.nodeService.getParentAssocs(record, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef parent = assoc.getParentRef();
if (isRecordFolder(parent) == true)
{
result.add(parent);
}
}
}
return result;
return getRecordFolderService().isRecordFolderClosed(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#createRecordFolder(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map)
*/
public NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type, Map<QName, Serializable> properties)
{
ParameterCheck.mandatory("rmContainer", rmContainer);
ParameterCheck.mandatory("name", name);
ParameterCheck.mandatory("type", type);
// Check that we are not trying to create a record folder in a root container
if (isFilePlan(rmContainer) == true)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_PARENT_RECORD_FOLDER_ROOT));
}
// Check that the parent is a container
QName parentType = nodeService.getType(rmContainer);
if (TYPE_RECORD_CATEGORY.equals(parentType) == false &&
dictionaryService.isSubClass(parentType, TYPE_RECORD_CATEGORY) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_PARENT_RECORD_FOLDER_TYPE, parentType.toString()));
}
// Check that the the provided type is a sub-type of rm:recordFolder
if (TYPE_RECORD_FOLDER.equals(type) == false &&
dictionaryService.isSubClass(type, TYPE_RECORD_FOLDER) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_TYPE, type.toString()));
}
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
if (properties != null && properties.size() != 0)
{
props.putAll(properties);
}
props.put(ContentModel.PROP_NAME, name);
return nodeService.createNode(
rmContainer,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name),
type,
props).getChildRef();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#createRecordFolder(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
*/
public NodeRef createRecordFolder(NodeRef rmContrainer, String name)
{
// TODO defaults to rm:recordFolder, but in future could auto-detect sub-type of folder based on
// context
return createRecordFolder(rmContrainer, name, TYPE_RECORD_FOLDER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#createRecordFolder(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map)
*/
public NodeRef createRecordFolder(NodeRef parent, String name, Map<QName, Serializable> properties)
{
return createRecordFolder(parent, name, TYPE_RECORD_FOLDER, properties);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#createRecordFolder(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName)
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String, QName)}
*/
@Override
public NodeRef createRecordFolder(NodeRef parent, String name, QName type)
{
return createRecordFolder(parent, name, type, null);
return getRecordFolderService().createRecordFolder(parent, name, type);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getRecords(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String, QName, Map)}
*/
@Override
public NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type, Map<QName, Serializable> properties)
{
return getRecordFolderService().createRecordFolder(rmContainer, name, type, properties);
}
/**
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String)}
*/
@Override
public NodeRef createRecordFolder(NodeRef rmContrainer, String name)
{
return getRecordFolderService().createRecordFolder(rmContrainer, name);
}
/**
* @deprecated As of 2.2, see {@link RecordFolderService#createRecordFolder(NodeRef, String, Map)}
*/
@Override
public NodeRef createRecordFolder(NodeRef parent, String name, Map<QName, Serializable> properties)
{
return getRecordFolderService().createRecordFolder(parent, name, properties);
}
/**
* @deprecated As of 2.2, see {@link RecordService#getRecords(NodeRef)}
*/
@Override
public List<NodeRef> getRecords(NodeRef recordFolder)
{
List<NodeRef> result = new ArrayList<NodeRef>(1);
if (isRecordFolder(recordFolder) == true)
{
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(recordFolder, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef child = assoc.getChildRef();
if (isRecord(child) == true)
{
result.add(child);
}
}
}
return result;
return getRecordService().getRecords(recordFolder);
}
/**
* This method examines the old and new property sets and for those properties which
* have changed, looks for script resources corresponding to those properties.
* Those scripts are then called via the ScriptService.
*
* @param nodeWithChangedProperties the node whose properties have changed.
* @param oldProps the old properties and their values.
* @param newProps the new properties and their values.
*
* @see #lookupScripts(Map<QName, Serializable>, Map<QName, Serializable>)
*/
private void lookupAndExecuteScripts(NodeRef nodeWithChangedProperties,
Map<QName, Serializable> oldProps, Map<QName, Serializable> newProps)
{
List<NodeRef> scriptRefs = lookupScripts(oldProps, newProps);
Map<String, Object> objectModel = new HashMap<String, Object>(1);
objectModel.put("node", nodeWithChangedProperties);
objectModel.put("oldProperties", oldProps);
objectModel.put("newProperties", newProps);
for (NodeRef scriptRef : scriptRefs)
{
serviceRegistry.getScriptService().executeScript(scriptRef, null, objectModel);
}
}
/**
* This method determines which properties have changed and for each such property
* looks for a script resource in a well-known location.
*
* @param oldProps the old properties and their values.
* @param newProps the new properties and their values.
* @return A list of nodeRefs corresponding to the Script resources.
*
* @see #determineChangedProps(Map<QName, Serializable>, Map<QName, Serializable>)
*/
private List<NodeRef> lookupScripts(Map<QName, Serializable> oldProps, Map<QName, Serializable> newProps)
{
List<NodeRef> result = new ArrayList<NodeRef>();
Map<QName, Serializable> changedProps = PropertyMap.getChangedProperties(oldProps, newProps);
for (QName propQName : changedProps.keySet())
{
QName prefixedQName = propQName.getPrefixedQName(serviceRegistry.getNamespaceService());
String [] splitQName = QName.splitPrefixedQName(prefixedQName.toPrefixString());
final String shortPrefix = splitQName[0];
final String localName = splitQName[1];
// This is the filename pattern which is assumed.
// e.g. a script file cm_name.js would be called for changed to cm:name
String expectedScriptName = shortPrefix + "_" + localName + ".js";
NodeRef nextElement = nodeService.getChildByName(scriptsFolderNodeRef, ContentModel.ASSOC_CONTAINS, expectedScriptName);
if (nextElement != null) result.add(nextElement);
}
return result;
}
/**
* This method compares the oldProps map against the newProps map and returns
* a set of QNames of the properties that have changed. Changed here means one of
* <ul>
* <li>the property has been removed</li>
* <li>the property has had its value changed</li>
* <li>the property has been added</li>
* </ul>
*/
private Set<QName> determineChangedProps(Map<QName, Serializable> oldProps, Map<QName, Serializable> newProps)
{
Set<QName> result = new HashSet<QName>();
for (QName qn : oldProps.keySet())
{
if (newProps.get(qn) == null ||
newProps.get(qn).equals(oldProps.get(qn)) == false)
{
result.add(qn);
}
}
for (QName qn : newProps.keySet())
{
if (oldProps.get(qn) == null)
{
result.add(qn);
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getRecordMetaDataAspects()
* @deprecated As of 2.2, see {@link RecordFolderService#getRecordFolders(NodeRef)}
*/
@Override
public List<NodeRef> getRecordFolders(NodeRef record)
{
return getRecordFolderService().getRecordFolders(record);
}
/**
* @deprecated As of 2.1, see {@link RecordService#getRecordMetaDataAspects()}
*/
@Override
@Deprecated
public Set<QName> getRecordMetaDataAspects()
{
return serviceRegistry.getRecordService().getRecordMetaDataAspects();
return getRecordService().getRecordMetaDataAspects();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecordDeclared(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link RecordService#isDeclared(NodeRef)}
*/
@Override
@Deprecated
public boolean isRecordDeclared(NodeRef nodeRef)
{
return serviceRegistry.getRecordService().isDeclared(nodeRef);
return getRecordService().isDeclared(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isHold(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link FreezeService#isHold(NodeRef)}
*/
@Override
@Deprecated
public boolean isHold(NodeRef nodeRef)
{
return serviceRegistry.getFreezeService().isHold(nodeRef);
return getFreezeService().isHold(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isFrozen(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link FreezeService#isFrozen(NodeRef)}
*/
@Override
@Deprecated
public boolean isFrozen(NodeRef nodeRef)
{
return serviceRegistry.getFreezeService().isFrozen(nodeRef);
return getFreezeService().isFrozen(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#hasFrozenChildren(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link FreezeService#hasFrozenChildren(NodeRef)}
*/
@Override
@Deprecated
public boolean hasFrozenChildren(NodeRef nodeRef)
{
return serviceRegistry.getFreezeService().hasFrozenChildren(nodeRef);
return getFreezeService().hasFrozenChildren(nodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isRecord(org.alfresco.service.cmr.repository.NodeRef)
* @deprecated As of 2.1, see {@link RecordService#isRecord(NodeRef)}
*/
@Override
@Deprecated
public boolean isRecord(NodeRef nodeRef)
{
return serviceRegistry.getRecordService().isRecord(nodeRef);
return getRecordService().isRecord(nodeRef);
}
}

View File

@@ -28,6 +28,7 @@ import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService;
import org.alfresco.module.org_alfresco_module_rm.model.security.ModelSecurityService;
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.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService;
import org.alfresco.module.org_alfresco_module_rm.security.FilePlanAuthenticationService;
@@ -40,7 +41,7 @@ import org.alfresco.service.namespace.QName;
/**
* Records management service registry
*
*
* @author Roy Wetherall
*/
@SuppressWarnings("deprecation")
@@ -64,110 +65,118 @@ public interface RecordsManagementServiceRegistry extends ServiceRegistry
static final QName IDENTIFIER_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "recordsManagementIdentifierService");
@Deprecated
static final QName RECORDS_MANAGEMENT_SECURITY_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RecordsManagementSecurityService");
static final QName RECORD_FOLDER_SERVICE = QName.createQName(NamespaceService.ALFRESCO_URI, "RecordFolderService");
/**
* @return records management service
*/
@NotAuditable
RecordsManagementService getRecordsManagementService();
/**
* @return record service
*/
@NotAuditable
RecordService getRecordService();
/**
* @return disposition service
*/
@NotAuditable
DispositionService getDispositionService();
/**
* @return records management admin service
*/
@NotAuditable
RecordsManagementAdminService getRecordsManagementAdminService();
/**
* @return records management action service
*/
@NotAuditable
RecordsManagementActionService getRecordsManagementActionService();
/**
* @return records management event service
*/
@NotAuditable
RecordsManagementEventService getRecordsManagementEventService();
/**
* @return records management security service
*
*
* @deprecated As of release 2.1, replaced with {@link FilePlanRoleService}, {@link FilePlanPermissionService} and {@link ModelSecurityService}
*/
@Deprecated
@NotAuditable
RecordsManagementSecurityService getRecordsManagementSecurityService();
/**
* @return records management audit service
*/
@NotAuditable
RecordsManagementAuditService getRecordsManagementAuditService();
/**
* @return capability service
* @since 2.0
*/
@NotAuditable
CapabilityService getCapabilityService();
/**
* @return freeze service
* @since 2.1
*/
@NotAuditable
FreezeService getFreezeService();
/**
* @return extended security service
* @since 2.1
*/
@NotAuditable
ExtendedSecurityService getExtendedSecurityService();
/**
* @return file plan service
* @since 2.1
* @since 2.1
*/
@NotAuditable
FilePlanService getFilePlanService();
/**
* @return file plan role service
* @since 2.1
*/
@NotAuditable
FilePlanRoleService getFilePlanRoleService();
/**
* @return file plan permission service
* @since 2.1
* @since 2.1
*/
@NotAuditable
FilePlanPermissionService getFilePlanPermissionService();
/**
* @return file plan authentication service
* @since 2.1
*/
FilePlanAuthenticationService getFilePlanAuthenticationService();
/**
* @return identifier service
* @since 2.1
*/
IdentifierService getIdentifierService();
/**
* @return record folder service
* @since 2.2
*/
@NotAuditable
RecordFolderService getRecordFolderService();
}

View File

@@ -27,6 +27,7 @@ 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.identifier.IdentifierService;
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.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService;
import org.alfresco.module.org_alfresco_module_rm.security.FilePlanAuthenticationService;
@@ -36,11 +37,11 @@ import org.alfresco.repo.service.ServiceDescriptorRegistry;
/**
* Records management service registry implementation
*
*
* @author Roy Wetherall
*/
@SuppressWarnings("deprecation")
public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegistry
public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegistry
implements RecordsManagementServiceRegistry
{
/**
@@ -141,7 +142,7 @@ public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegis
{
return (ExtendedSecurityService) getService(EXTENDED_SECURITY_SERVICE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getFilePlanService()
*/
@@ -159,7 +160,7 @@ public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegis
{
return (FilePlanRoleService) getService(FILE_PLAN_ROLE_SERVICE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getFilePlanPermissionService()
*/
@@ -168,7 +169,7 @@ public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegis
{
return (FilePlanPermissionService) getService(FILE_PLAN_PERMISSION_SERVICE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getFilePlanAuthenticationService()
*/
@@ -177,7 +178,7 @@ public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegis
{
return (FilePlanAuthenticationService) getService(FILE_PLAN_AUTHENTICATION_SERVICE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getIdentifierService()
*/
@@ -186,4 +187,13 @@ public class RecordsManagementServiceRegistryImpl extends ServiceDescriptorRegis
{
return (IdentifierService) getService(IDENTIFIER_SERVICE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry#getRecordFolderService()
*/
@Override
public RecordFolderService getRecordFolderService()
{
return (RecordFolderService) getService(RECORD_FOLDER_SERVICE);
}
}

View File

@@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction;
@@ -42,6 +41,7 @@ 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.security.ModelSecurityService;
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.vital.VitalRecordService;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.service.cmr.action.Action;
@@ -66,7 +66,7 @@ import org.springframework.util.StringUtils;
/**
* Records management action executer base class
*
*
* @author Roy Wetherall
*/
public abstract class RMActionExecuterAbstractBase extends PropertySubActionExecuterAbstractBase
@@ -76,58 +76,58 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
/** Namespace service */
protected NamespaceService namespaceService;
/** Used to control transactional behaviour including post-commit auditing */
protected TransactionService transactionService;
/** Node service */
protected NodeService nodeService;
/** Dictionary service */
protected DictionaryService dictionaryService;
/** Content service */
protected ContentService contentService;
/** Action service */
protected ActionService actionService;
/** Records management action service */
protected RecordsManagementAuditService recordsManagementAuditService;
/** Records management action service */
protected RecordsManagementActionService recordsManagementActionService;
/** Records management service */
protected RecordsManagementService recordsManagementService;
/** Record service */
protected RecordService recordService;
/** Disposition service */
protected DispositionService dispositionService;
/** Vital record service */
protected VitalRecordService vitalRecordService;
/** Records management event service */
protected RecordsManagementEventService recordsManagementEventService;
/** Records management action service */
protected RecordsManagementAdminService recordsManagementAdminService;
/** Ownable service **/
protected OwnableService ownableService;
/** Freeze Service */
/** Freeze service */
protected FreezeService freezeService;
/** model security service */
/** Model security service */
protected ModelSecurityService modelSecurityService;
/** Record folder service */
protected RecordFolderService recordFolderService;
/** List of kinds for which this action is applicable */
protected Set<FilePlanComponentKind> applicableKinds = new HashSet<FilePlanComponentKind>();
/**
* Set the namespace service
*/
@@ -135,7 +135,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.transactionService = transactionService;
}
/**
* Set the namespace service
*/
@@ -143,7 +143,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.namespaceService = namespaceService;
}
/**
* Set node service
*/
@@ -151,7 +151,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.nodeService = nodeService;
}
/**
* Set the dictionary service
*/
@@ -159,7 +159,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.dictionaryService = dictionaryService;
}
/**
* Set the content service
*/
@@ -167,9 +167,9 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.contentService = contentService;
}
/**
* Set action service
* Set action service
*/
public void setActionService(ActionService actionService)
{
@@ -191,15 +191,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.recordsManagementActionService = recordsManagementActionService;
}
/**
* Set records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* Set the disposition service
*/
@@ -207,7 +199,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.dispositionService = dispositionService;
}
/**
* @param vitalRecordService vital record service
*/
@@ -215,16 +207,16 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.vitalRecordService = vitalRecordService;
}
/**
/**
* Set records management event service
*/
public void setRecordsManagementEventService(RecordsManagementEventService recordsManagementEventService)
{
this.recordsManagementEventService = recordsManagementEventService;
}
/**
* Set the ownable service
* @param ownableSerice
@@ -233,27 +225,27 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.ownableService = ownableService;
}
/**
* Set freeze service
*
*
* @param freezeService freeze service
*/
public void setFreezeService(FreezeService freezeService)
{
this.freezeService = freezeService;
}
/**
* Set record service
*
*
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* @param recordsManagementAdminService records management admin service
*/
@@ -269,7 +261,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
return recordsManagementAdminService;
}
/**
* @param modelSecurityService model security service
*/
@@ -278,6 +270,14 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
this.modelSecurityService = modelSecurityService;
}
/**
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @param applicableKinds kinds that this action is applicable for
*/
@@ -288,7 +288,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
this.applicableKinds.add(FilePlanComponentKind.valueOf(kind));
}
}
/**
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#createActionDefinition(java.lang.String)
*/
@@ -297,18 +297,18 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
return new RecordsManagementActionDefinitionImpl(name);
}
/**
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#getActionDefinition()
*/
@Override
public ActionDefinition getActionDefinition()
{
ActionDefinition actionDefinition = super.getActionDefinition();
((RecordsManagementActionDefinitionImpl)this.actionDefinition).setApplicableKinds(applicableKinds);
ActionDefinition actionDefinition = super.getActionDefinition();
((RecordsManagementActionDefinitionImpl)this.actionDefinition).setApplicableKinds(applicableKinds);
return actionDefinition;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#getRecordsManagementActionDefinition()
*/
@@ -333,16 +333,15 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
PropertyCheck.mandatory(this, "transactionService", transactionService);
PropertyCheck.mandatory(this, "recordsManagementAuditService", recordsManagementAuditService);
PropertyCheck.mandatory(this, "recordsManagementActionService", recordsManagementActionService);
PropertyCheck.mandatory(this, "recordsManagementService", recordsManagementService);
PropertyCheck.mandatory(this, "recordsManagementAdminService", recordsManagementAdminService);
PropertyCheck.mandatory(this, "recordsManagementEventService", recordsManagementEventService);
super.init();
}
/**
* Indicates whether this records management action is public or not
*
*
* @return boolean true if public, false otherwise
*/
@Override
@@ -350,7 +349,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
return publicAction;
}
/**
* @see org.alfresco.repo.action.CommonResourceAbstractBase#setBeanName(java.lang.String)
*/
@@ -359,7 +358,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
this.name = name;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementAction#getName()
*/
@@ -367,49 +366,49 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
return this.name;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#getLabel()
*/
public String getLabel()
{
String label = I18NUtil.getMessage(this.getTitleKey());
if (label == null)
{
// default to the name of the action with first letter capitalised
label = StringUtils.capitalize(this.name);
}
return label;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#getDescription()
*/
public String getDescription()
{
String desc = I18NUtil.getMessage(this.getDescriptionKey());
if (desc == null)
{
// default to the name of the action with first letter capitalised
desc = StringUtils.capitalize(this.name);
}
return desc;
}
/**
* By default an action is not a disposition action
*
*
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementAction#isDispositionAction()
*/
public boolean isDispositionAction()
{
return false;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementAction#execute(org.alfresco.service.cmr.repository.NodeRef, java.util.Map)
*/
@@ -418,7 +417,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
// Create the action
Action action = this.actionService.createAction(name);
action.setParameterValues(parameters);
// disable model security whilst we execute the RM rule
modelSecurityService.disable();
try
@@ -430,20 +429,20 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
modelSecurityService.enable();
}
// Get the result
Object value = action.getParameterValue(ActionExecuterAbstractBase.PARAM_RESULT);
return new RecordsManagementActionResult(value);
}
/**
* Function to pad a string with zero '0' characters to the required length
*
*
* @param s String to pad with leading zero '0' characters
* @param len Length to pad to
*
*
* @return padded string or the original if already at >=len characters
*
*
* @deprecated As of 2.1, replaced by {@link org.apache.commons.lang.StringUtils.leftPad}
*/
@Deprecated
@@ -455,11 +454,11 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
result = "0" + result;
}
return result;
}
}
/**
* By default there are no parameters.
*
*
* @see org.alfresco.repo.action.ParameterizedItemAbstractBase#addParameterDefinitions(java.util.List)
*/
@Override
@@ -495,17 +494,17 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
currentDispositionAction = assocs.get(0).getChildRef();
}
}
if (currentDispositionAction != null)
{
// Move it to the history association
this.nodeService.moveNode(currentDispositionAction, nodeRef, ASSOC_DISPOSITION_ACTION_HISTORY, ASSOC_DISPOSITION_ACTION_HISTORY);
}
List<DispositionActionDefinition> dispositionActionDefinitions = di.getDispositionActionDefinitions();
DispositionActionDefinition currentDispositionActionDefinition = null;
DispositionActionDefinition nextDispositionActionDefinition = null;
if (currentDispositionAction == null)
{
if (dispositionActionDefinitions.isEmpty() == false)
@@ -519,7 +518,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
// Get the current action
String currentADId = (String)this.nodeService.getProperty(currentDispositionAction, PROP_DISPOSITION_ACTION_ID);
currentDispositionActionDefinition = di.getDispositionActionDefinition(currentADId);
// Get the next disposition action
int index = currentDispositionActionDefinition.getIndex();
index++;
@@ -528,7 +527,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
nextDispositionActionDefinition = dispositionActionDefinitions.get(index);
}
}
if (nextDispositionActionDefinition != null)
{
if (this.nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) == false)
@@ -536,40 +535,40 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
// Add the disposition life cycle aspect
this.nodeService.addAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE, null);
}
// Create the properties
Map<QName, Serializable> props = new HashMap<QName, Serializable>(10);
// Calculate the asOf date
Date asOfDate = null;
Period period = nextDispositionActionDefinition.getPeriod();
if (period != null)
{
Date contextDate = null;
// Get the period properties value
QName periodProperty = nextDispositionActionDefinition.getPeriodProperty();
if (periodProperty != null &&
if (periodProperty != null &&
RecordsManagementModel.PROP_DISPOSITION_AS_OF.equals(periodProperty) == false)
{
// doesn't matter if the period property isn't set ... the asOfDate will get updated later
// when the value of the period property is set
contextDate = (Date)this.nodeService.getProperty(nodeRef, periodProperty);
contextDate = (Date)this.nodeService.getProperty(nodeRef, periodProperty);
}
else
{
// for now use 'NOW' as the default context date
// for now use 'NOW' as the default context date
// TODO set the default period property ... cut off date or last disposition date depending on context
contextDate = new Date();
}
// Calculate the as of date
if (contextDate != null)
{
asOfDate = period.getNextDate(contextDate);
}
}
}
// Set the property values
props.put(PROP_DISPOSITION_ACTION_ID, nextDispositionActionDefinition.getId());
props.put(PROP_DISPOSITION_ACTION, nextDispositionActionDefinition.getName());
@@ -577,15 +576,15 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
{
props.put(PROP_DISPOSITION_AS_OF, asOfDate);
}
// Create a new disposition action object
NodeRef dispositionActionNodeRef = this.nodeService.createNode(
nodeRef,
ASSOC_NEXT_DISPOSITION_ACTION,
ASSOC_NEXT_DISPOSITION_ACTION,
nodeRef,
ASSOC_NEXT_DISPOSITION_ACTION,
ASSOC_NEXT_DISPOSITION_ACTION,
TYPE_DISPOSITION_ACTION,
props).getChildRef();
props).getChildRef();
// Create the events
List<RecordsManagementEvent> events = nextDispositionActionDefinition.getEvents();
for (RecordsManagementEvent event : events)
@@ -596,10 +595,10 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
}
}
}
/**
* Creates the given records management event for the given 'next action'.
*
*
* @param event The event to create
* @param nextActionNodeRef The next action node
* @return The created event NodeRef
@@ -607,32 +606,32 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
protected NodeRef createEvent(RecordsManagementEvent event, NodeRef nextActionNodeRef)
{
NodeRef eventNodeRef = null;
Map<QName, Serializable> eventProps = new HashMap<QName, Serializable>(7);
eventProps.put(PROP_EVENT_EXECUTION_NAME, event.getName());
// TODO display label
RecordsManagementEventType eventType = recordsManagementEventService.getEventType(event.getType());
eventProps.put(PROP_EVENT_EXECUTION_AUTOMATIC, eventType.isAutomaticEvent());
eventProps.put(PROP_EVENT_EXECUTION_COMPLETE, false);
// Create the event execution object
this.nodeService.createNode(nextActionNodeRef, ASSOC_EVENT_EXECUTIONS,
ASSOC_EVENT_EXECUTIONS, TYPE_EVENT_EXECUTION, eventProps);
return eventNodeRef;
}
/**
* Calculates and updates the <code>rma:dispositionEventsEligible</code>
* property for the given next disposition action.
*
*
* @param nextAction The next disposition action
* @return The result of calculation
*/
protected boolean updateEventEligible(DispositionAction nextAction)
{
List<EventCompletionDetails> events = nextAction.getEventCompletionDetails();
boolean eligible = false;
if (nextAction.getDispositionActionDefinition().eligibleOnFirstCompleteEvent() == false)
{
@@ -657,12 +656,12 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe
}
}
}
// Update the property with the eligible value
this.nodeService.setProperty(nextAction.getNodeRef(), PROP_DISPOSITION_EVENTS_ELIGIBLE, eligible);
return eligible;
}
}

View File

@@ -46,13 +46,13 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
private static final String MSG_NEXT_DISP_NOT_SET = "rm.action.next-disp-not-set";
private static final String MSG_NOT_NEXT_DISP = "rm.action.not-next-disp";
private static final String MSG_NOT_RECORD_FOLDER = "rm.action.not-record-folder";
/** Parameter value indicating whether we should be doing non-error raising state checks */
public static final String PARAM_NO_ERROR_CHECK = "rm.no-error-check";
/**
* All children of this implementation are disposition actions.
*
*
* @see org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase#isDispositionAction()
*/
@Override
@@ -63,28 +63,28 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
/**
* Indicates whether the disposition is marked complete
*
*
* @return boolean true if marked complete, false otherwise
*/
public boolean getSetDispositionActionComplete()
{
return true;
}
/**
* Indicates whether we should validate the next disposition action is the action we are
* trying to execute.
*
*
* @return
*/
protected boolean checkNextDispositionAction(NodeRef actionedUponNodeRef)
{
return true;
}
/**
* Indicated whether we should validate the disposition action is eligible or not.
*
*
* @param actionedUponNodeRef
* @return
*/
@@ -101,7 +101,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
{
NodeRef nextDispositionActionNodeRef = getNextDispostionAction(actionedUponNodeRef);
// determine whether we should be raising errors during state checking or not
boolean checkError = true;
Boolean checkErrorValue = (Boolean)action.getParameterValue(PARAM_NO_ERROR_CHECK);
@@ -109,14 +109,14 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
{
checkError = checkErrorValue.booleanValue();
}
// Check the validity of the action (is it the next action, are we dealing with the correct type of object for
// the disposition level?
DispositionSchedule di = checkDispositionActionExecutionValidity(actionedUponNodeRef, nextDispositionActionNodeRef, checkError);
if (di != null)
{
// Check the eligibility of the action
if (checkEligibility(actionedUponNodeRef) == false ||
if (checkEligibility(actionedUponNodeRef) == false ||
dispositionService.isNextDispositionActionEligible(actionedUponNodeRef) == true)
{
if (di.isRecordLevelDisposition() == true)
@@ -128,17 +128,17 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
if (recordService.isDeclared(actionedUponNodeRef) == true)
{
// Indicate that the disposition action is underway
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_AT, new Date());
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_BY, AuthenticationUtil.getRunAsUser());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_AT, new Date());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_BY, AuthenticationUtil.getRunAsUser());
// Execute record level disposition
executeRecordLevelDisposition(action, actionedUponNodeRef);
if (this.nodeService.exists(nextDispositionActionNodeRef) == true &&
if (nodeService.exists(nextDispositionActionNodeRef) == true &&
getSetDispositionActionComplete() == true)
{
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_AT, new Date());
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_BY, AuthenticationUtil.getRunAsUser());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_AT, new Date());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_BY, AuthenticationUtil.getRunAsUser());
}
}
else
@@ -153,24 +153,24 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
}
else
{
if (this.recordsManagementService.isRecordFolder(actionedUponNodeRef) == true)
if (recordFolderService.isRecordFolder(actionedUponNodeRef) == true)
{
if (this.recordsManagementService.isRecordFolderDeclared(actionedUponNodeRef) == true)
if (recordFolderService.isRecordFolderDeclared(actionedUponNodeRef) == true)
{
// Indicate that the disposition action is underway
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_AT, new Date());
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_BY, AuthenticationUtil.getRunAsUser());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_AT, new Date());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_STARTED_BY, AuthenticationUtil.getRunAsUser());
executeRecordFolderLevelDisposition(action, actionedUponNodeRef);
// Indicate that the disposition action is compelte
if (this.nodeService.exists(nextDispositionActionNodeRef) == true &&
if (nodeService.exists(nextDispositionActionNodeRef) == true &&
getSetDispositionActionComplete() == true)
{
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_AT, new Date());
this.nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_BY, AuthenticationUtil.getRunAsUser());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_AT, new Date());
nodeService.setProperty(nextDispositionActionNodeRef, PROP_DISPOSITION_ACTION_COMPLETED_BY, AuthenticationUtil.getRunAsUser());
}
}
else
{
@@ -181,10 +181,10 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_NOT_RECORD_FOLDER, getName(), actionedUponNodeRef.toString()));
}
}
if (this.nodeService.exists(actionedUponNodeRef) == true && getSetDispositionActionComplete() == true)
if (nodeService.exists(actionedUponNodeRef) == true && getSetDispositionActionComplete() == true)
{
// Update the disposition schedule
updateNextDispositionAction(actionedUponNodeRef);
@@ -217,7 +217,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
* @param recordFolder
*/
protected abstract void executeRecordFolderLevelDisposition(Action action, NodeRef recordFolder);
/**
* @param nodeRef
* @return
@@ -225,7 +225,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
protected DispositionSchedule checkDispositionActionExecutionValidity(NodeRef nodeRef, NodeRef nextDispositionActionNodeRef, boolean throwError)
{
// Check the node has associated disposition instructions
DispositionSchedule di = this.dispositionService.getDispositionSchedule(nodeRef);
DispositionSchedule di = dispositionService.getDispositionSchedule(nodeRef);
if (di == null)
{
if (throwError)
@@ -239,7 +239,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
}
// Check the node has the disposition schedule aspect applied
if (this.nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) == false)
if (nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) == false)
{
if (throwError)
{
@@ -253,7 +253,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
if (checkNextDispositionAction(nodeRef) == true)
{
// Check this the next disposition action
// Check this the next disposition action
NodeRef nextDispositionAction = nextDispositionActionNodeRef;
if (nextDispositionAction == null)
{
@@ -266,7 +266,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
return null;
}
}
String actionName = (String) this.nodeService.getProperty(nextDispositionAction, PROP_DISPOSITION_ACTION);
String actionName = (String) nodeService.getProperty(nextDispositionAction, PROP_DISPOSITION_ACTION);
if (actionName == null || actionName.equals(getName()) == false)
{
if (throwError)
@@ -285,7 +285,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
/**
* Get the next disposition action node. Null if none present.
*
*
* @param nodeRef
* the disposable node reference
* @return NodeRef the next disposition action, null if none
@@ -293,7 +293,7 @@ public abstract class RMDispositionActionExecuterAbstractBase extends RMActionEx
private NodeRef getNextDispostionAction(NodeRef nodeRef)
{
NodeRef result = null;
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL);
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL);
if (assocs.size() != 0)
{
result = assocs.get(0).getChildRef();

View File

@@ -28,7 +28,7 @@ import org.springframework.extensions.surf.util.I18NUtil;
/**
* Action to close the records folder
*
*
* @author Roy Wetherall
*/
public class CloseRecordFolderAction extends RMActionExecuterAbstractBase
@@ -49,7 +49,7 @@ public class CloseRecordFolderAction extends RMActionExecuterAbstractBase
@Override
protected void executeImpl(Action action, NodeRef actionedUponNodeRef)
{
if (nodeService.exists(actionedUponNodeRef) == true &&
if (nodeService.exists(actionedUponNodeRef) == true &&
freezeService.isFrozen(actionedUponNodeRef) == false)
{
if (recordService.isRecord(actionedUponNodeRef))
@@ -61,12 +61,12 @@ public class CloseRecordFolderAction extends RMActionExecuterAbstractBase
}
}
if (this.recordsManagementService.isRecordFolder(actionedUponNodeRef) == true)
if (recordFolderService.isRecordFolder(actionedUponNodeRef) == true)
{
Boolean isClosed = (Boolean) this.nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED);
Boolean isClosed = (Boolean) nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED);
if (Boolean.FALSE.equals(isClosed) == true)
{
this.nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, true);
nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, true);
}
}
else

View File

@@ -23,31 +23,25 @@ import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstrac
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Create disposition schedule action
*
*
* @author Roy Wetherall
*/
public class CreateDispositionScheduleAction extends RMActionExecuterAbstractBase
{
/** Logger */
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(CreateDispositionScheduleAction.class);
/** file plan service */
private FilePlanService filePlanService;
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/**
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -63,5 +57,5 @@ public class CreateDispositionScheduleAction extends RMActionExecuterAbstractBas
{
throw new AlfrescoRuntimeException("The disposition schedule could not be created, because the actioned upon node was not a record category.");
}
}
}
}

View File

@@ -31,14 +31,14 @@ import org.alfresco.service.namespace.QName;
/**
* Cut off disposition action
*
*
* @author Roy Wetherall
*/
public class CutOffAction extends RMDispositionActionExecuterAbstractBase
{
/** Action name */
public static final String NAME = "cutoff";
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase#executeRecordFolderLevelDisposition(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -46,17 +46,17 @@ public class CutOffAction extends RMDispositionActionExecuterAbstractBase
protected void executeRecordFolderLevelDisposition(Action action, NodeRef recordFolder)
{
// Close folder
Boolean isClosed = (Boolean)this.nodeService.getProperty(recordFolder, PROP_IS_CLOSED);
Boolean isClosed = (Boolean)nodeService.getProperty(recordFolder, PROP_IS_CLOSED);
if (Boolean.FALSE.equals(isClosed) == true)
{
this.nodeService.setProperty(recordFolder, PROP_IS_CLOSED, true);
nodeService.setProperty(recordFolder, PROP_IS_CLOSED, true);
}
// Mark the folder as cut off
doCutOff(recordFolder);
// Mark all the declared children of the folder as cut off
List<NodeRef> records = this.recordsManagementService.getRecords(recordFolder);
List<NodeRef> records = recordService.getRecords(recordFolder);
for (NodeRef record : records)
{
doCutOff(record);
@@ -70,22 +70,22 @@ public class CutOffAction extends RMDispositionActionExecuterAbstractBase
protected void executeRecordLevelDisposition(Action action, NodeRef record)
{
// Mark the record as cut off
doCutOff(record);
doCutOff(record);
}
/**
* Marks the record or record folder as cut off, calculating the cut off date.
*
*
* @param nodeRef node reference
*/
private void doCutOff(NodeRef nodeRef)
{
if (this.nodeService.hasAspect(nodeRef, ASPECT_CUT_OFF) == false)
if (nodeService.hasAspect(nodeRef, ASPECT_CUT_OFF) == false)
{
// Apply the cut off aspect and set cut off date
Map<QName, Serializable> cutOffProps = new HashMap<QName, Serializable>(1);
cutOffProps.put(PROP_CUT_OFF_DATE, new Date());
this.nodeService.addAspect(nodeRef, ASPECT_CUT_OFF, cutOffProps);
nodeService.addAspect(nodeRef, ASPECT_CUT_OFF, cutOffProps);
}
}
}

View File

@@ -44,28 +44,28 @@ import org.springframework.extensions.surf.util.I18NUtil;
/**
* Destroy action.
*
*
* @author Roy Wetherall
*/
public class DestroyAction extends RMDispositionActionExecuterAbstractBase
implements ContentServicePolicies.OnContentUpdatePolicy,
public class DestroyAction extends RMDispositionActionExecuterAbstractBase
implements ContentServicePolicies.OnContentUpdatePolicy,
InitializingBean
{
/** Action name */
public static final String NAME = "destroy";
/** I18N */
private static final String MSG_GHOSTED_PROP_UPDATE = "rm.action.ghosted-prop-update";
/** Policy component */
private PolicyComponent policyComponent;
/** Eager content store cleaner */
private EagerContentStoreCleaner eagerContentStoreCleaner;
/** Capability service */
private CapabilityService capabilityService;
/** Indicates if ghosting is enabled or not */
private boolean ghostingEnabled = true;
@@ -76,7 +76,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
this.policyComponent = policyComponent;
}
/**
* @param eagerContentStoreCleaner eager content store cleaner
*/
@@ -92,7 +92,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
this.capabilityService = capabilityService;
}
/**
* @param ghostingEnabled true if ghosting is enabled, false otherwise
*/
@@ -100,7 +100,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
this.ghostingEnabled = ghostingEnabled;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase#checkNextDispositionAction()
*/
@@ -109,7 +109,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
return checkForDestroyRecordsCapability(actionedUponNodeRef);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase#checkEligibility(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -118,9 +118,9 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
return checkForDestroyRecordsCapability(actionedUponNodeRef);
}
/**
*
*
* @param actionedUponNodeRef
* @return
*/
@@ -131,7 +131,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
result = false;
}
return result;
return result;
}
/**
@@ -140,15 +140,15 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
@Override
protected void executeRecordFolderLevelDisposition(Action action, NodeRef recordFolder)
{
List<NodeRef> records = this.recordsManagementService.getRecords(recordFolder);
List<NodeRef> records = recordService.getRecords(recordFolder);
for (NodeRef record : records)
{
executeRecordLevelDisposition(action, record);
}
if (ghostingEnabled == true)
{
nodeService.addAspect(recordFolder, ASPECT_GHOSTED, Collections.<QName, Serializable> emptyMap());
nodeService.addAspect(recordFolder, ASPECT_GHOSTED, Collections.<QName, Serializable> emptyMap());
}
else
{
@@ -164,20 +164,20 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
doDestroy(record);
}
/**
* Do the content destroy
*
*
* @param nodeRef
*/
private void doDestroy(NodeRef nodeRef)
{
// Clear the content
clearAllContent(nodeRef);
// Clear thumbnail content
clearThumbnails(nodeRef);
if (ghostingEnabled == true)
{
// Add the ghosted aspect
@@ -186,13 +186,13 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
else
{
// If ghosting is not enabled, delete the node
nodeService.deleteNode(nodeRef);
nodeService.deleteNode(nodeRef);
}
}
/**
* Clear all the content properties
*
*
* @param nodeRef
*/
private void clearAllContent(NodeRef nodeRef)
@@ -203,15 +203,15 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
{
// Clear the content
clearContent(nodeRef, prop);
// Remove the property
this.nodeService.removeProperty(nodeRef, prop);
}
}
}
/**
* Clear all the thumbnail information
*
*
* @param nodeRef
*/
@SuppressWarnings("deprecation")
@@ -226,7 +226,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
// We want to remove the rn:renditioned aspect, but due to the possibility
// that there is Alfresco 3.2-era data with the cm:thumbnailed aspect
// applied, we must consider removing it too.
if (nodeService.hasAspect(nodeRef, RenditionModel.ASPECT_RENDITIONED) ||
if (nodeService.hasAspect(nodeRef, RenditionModel.ASPECT_RENDITIONED) ||
nodeService.hasAspect(nodeRef, ContentModel.ASPECT_THUMBNAILED))
{
// Add the ghosted aspect to all the renditioned children, so that they will not be archived when the
@@ -241,12 +241,12 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
nodeService.deleteNode(child.getChildRef());
}
}
}
}
}
/**
* Clear a content property
*
*
* @param nodeRef
* @param contentProperty
*/
@@ -257,7 +257,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
if (contentData != null && contentData.getContentUrl() != null)
{
eagerContentStoreCleaner.registerOrphanedContentUrl(contentData.getContentUrl(), true);
}
}
}
/**
@@ -276,7 +276,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase
// Register interest in the onContentUpdate policy
policyComponent.bindClassBehaviour(
ContentServicePolicies.OnContentUpdatePolicy.QNAME,
ASPECT_GHOSTED,
ASPECT_GHOSTED,
new JavaBehaviour(this, "onContentUpdate"));
}
}

View File

@@ -25,13 +25,11 @@ import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstrac
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Edit review as of date action.
*
*
* @author Roy Wetherall
*/
public class EditDispositionActionAsOfDateAction extends RMActionExecuterAbstractBase
@@ -39,11 +37,7 @@ public class EditDispositionActionAsOfDateAction extends RMActionExecuterAbstrac
/** I18N */
private static final String MSG_VALID_DATE_DISP_ASOF = "rm.action.valid-date-disp-asof";
private static final String MSG_DISP_ASOF_LIFECYCLE_APPLIED = "rm.action.disp-asof-lifecycle-applied";
/** Logger */
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(EditDispositionActionAsOfDateAction.class);
/** Action parameters */
public static final String PARAM_AS_OF_DATE = "asOfDate";
@@ -62,11 +56,11 @@ public class EditDispositionActionAsOfDateAction extends RMActionExecuterAbstrac
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_VALID_DATE_DISP_ASOF));
}
// Set the dispostion action as of date
DispositionAction da = dispositionService.getNextDispositionAction(actionedUponNodeRef);
if (da != null)
{
{
nodeService.setProperty(da.getNodeRef(), PROP_DISPOSITION_AS_OF, asOfDate);
}
}

View File

@@ -24,14 +24,12 @@ import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
/**
*
*
* Edit review as of date action
*
*
* @author Roy Wetherall
*/
public class EditReviewAsOfDateAction extends RMActionExecuterAbstractBase
@@ -39,10 +37,7 @@ public class EditReviewAsOfDateAction extends RMActionExecuterAbstractBase
/** I18N */
private static final String MSG_SPECIFY_VALID_DATE = "rm.action.specify-avlid-date";
private static final String MSG_REVIEW_DETAILS_ONLY = "rm.action.review-details-only";
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(EditReviewAsOfDateAction.class);
public static final String PARAM_AS_OF_DATE = "asOfDate";
/**
@@ -61,14 +56,14 @@ public class EditReviewAsOfDateAction extends RMActionExecuterAbstractBase
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_SPECIFY_VALID_DATE));
}
// Set the as of date
// Set the as of date
this.nodeService.setProperty(actionedUponNodeRef, PROP_REVIEW_AS_OF, reviewAsOf);
}
else
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_REVIEW_DETAILS_ONLY));
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_REVIEW_DETAILS_ONLY));
}
}
}

View File

@@ -20,7 +20,7 @@ import org.springframework.util.StringUtils;
/**
* File To action implementation.
*
*
* @author Roy Wetherall
* @since 2.1
*/
@@ -28,18 +28,18 @@ public class FileToAction extends RMActionExecuterAbstractBase
{
/** action name */
public static final String NAME = "fileTo";
/** action parameters */
public static final String PARAM_DESTINATION_RECORD_FOLDER = "destinationRecordFolder";
public static final String PARAM_PATH = "path";
public static final String PARAM_CREATE_RECORD_FOLDER = "createRecordFolder";
/** file folder service */
private FileFolderService fileFolderService;
/** file plan service */
private FilePlanService filePlanService;
/**
* @param fileFolderService file folder service
*/
@@ -47,7 +47,7 @@ public class FileToAction extends RMActionExecuterAbstractBase
{
this.fileFolderService = fileFolderService;
}
/**
* @param filePlanService file plan service
*/
@@ -55,7 +55,7 @@ public class FileToAction extends RMActionExecuterAbstractBase
{
this.filePlanService = filePlanService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase#addParameterDefinitions(java.util.List)
*/
@@ -65,7 +65,7 @@ public class FileToAction extends RMActionExecuterAbstractBase
paramList.add(new ParameterDefinitionImpl(PARAM_PATH, DataTypeDefinition.TEXT, false, getParamDisplayLabel(PARAM_PATH)));
paramList.add(new ParameterDefinitionImpl(PARAM_CREATE_RECORD_FOLDER, DataTypeDefinition.BOOLEAN, false, getParamDisplayLabel(PARAM_CREATE_RECORD_FOLDER)));
}
/**
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -84,15 +84,15 @@ public class FileToAction extends RMActionExecuterAbstractBase
// get the reference to the record folder based on the relative path
recordFolder = createOrResolveRecordFolder(action, actionedUponNodeRef);
}
if (recordFolder == null)
{
throw new AlfrescoRuntimeException("Unable to execute file to action, because the destination record folder could not be determined.");
}
if (recordsManagementService.isRecordFolder(recordFolder) == true)
if (recordFolderService.isRecordFolder(recordFolder) == true)
{
final NodeRef finalRecordFolder = recordFolder;
final NodeRef finalRecordFolder = recordFolder;
try
{
fileFolderService.move(actionedUponNodeRef, finalRecordFolder, null);
@@ -109,9 +109,9 @@ public class FileToAction extends RMActionExecuterAbstractBase
}
}
}
/**
*
*
* @param action
* @param actionedUponNodeRef
* @return
@@ -119,8 +119,8 @@ public class FileToAction extends RMActionExecuterAbstractBase
private NodeRef createOrResolveRecordFolder(Action action, NodeRef actionedUponNodeRef)
{
// TODO check the action for a context node reference
// the file plan node always provides the context
NodeRef context = filePlanService.getFilePlan(actionedUponNodeRef);
// the file plan node always provides the context
NodeRef context = filePlanService.getFilePlan(actionedUponNodeRef);
if (context == null)
{
throw new AlfrescoRuntimeException("Unable to execute fileTo action, because the path resolution context could not be found.");
@@ -129,16 +129,16 @@ public class FileToAction extends RMActionExecuterAbstractBase
{
throw new AlfrescoRuntimeException("Unable to execute fileTo action, because the context for the relative path does not exist.");
}
// look for the path parameter
String path = (String)action.getParameterValue(PARAM_PATH);
String[] pathValues = ArrayUtils.EMPTY_STRING_ARRAY;
if (path != null && path.isEmpty() == false)
{
pathValues = StringUtils.tokenizeToStringArray(path, "/", false, true);
}
// look for the creation strategy
boolean create = false;
Boolean createValue = (Boolean)action.getParameterValue(PARAM_CREATE_RECORD_FOLDER);
@@ -146,10 +146,10 @@ public class FileToAction extends RMActionExecuterAbstractBase
{
create = createValue.booleanValue();
}
// try and get child
NodeRef recordFolder = resolvePath(context, pathValues);
if (recordFolder == null)
{
if (create == true)
@@ -160,28 +160,28 @@ public class FileToAction extends RMActionExecuterAbstractBase
{
throw new AlfrescoRuntimeException("Unable to create new record folder, because destination parent could not be found.");
}
// ensure we are trying to create a record folder in a record category
if (filePlanService.isRecordCategory(parent) == false)
{
throw new AlfrescoRuntimeException("Unable to create nre record folder, beacuse the parent is not a record category.");
}
// get the new record folders name
String recordFolderName = pathValues[pathValues.length-1];
recordFolder = recordsManagementService.createRecordFolder(parent, recordFolderName);
recordFolder = recordFolderService.createRecordFolder(parent, recordFolderName);
}
else
{
throw new AlfrescoRuntimeException("Unable to execute FileTo action, because the destination record folder does not exist.");
}
}
}
return recordFolder;
return recordFolder;
}
/**
*
*
* @param context
* @param pathValues
* @return
@@ -197,16 +197,16 @@ public class FileToAction extends RMActionExecuterAbstractBase
catch (FileNotFoundException e)
{
// ignore, checking for null
}
}
if (fileInfo != null)
{
result = fileInfo.getNodeRef();
}
return result;
}
/**
*
*
* @param context
* @param pathValues
* @return
@@ -214,10 +214,10 @@ public class FileToAction extends RMActionExecuterAbstractBase
private NodeRef resolveParent(NodeRef context, String[] pathValues)
{
NodeRef result = null;
if (ArrayUtils.isEmpty(pathValues) == true)
{
// this should never occur since if the path is empty then the context it the resolution of the
// this should never occur since if the path is empty then the context it the resolution of the
// path .. the context must already exist
throw new AlfrescoRuntimeException("Unable to resolve the parent, because no valid path was specified.");
}
@@ -231,9 +231,9 @@ public class FileToAction extends RMActionExecuterAbstractBase
pathValues = (String[])ArrayUtils.remove(pathValues, pathValues.length-1);
result = resolvePath(context, pathValues);
}
return result;
}
}

View File

@@ -30,14 +30,14 @@ import org.alfresco.service.cmr.repository.NodeRef;
/**
* Freeze Action
*
*
* @author Roy Wetherall
*/
public class FreezeAction extends RMActionExecuterAbstractBase
{
/** Parameter names */
public static final String PARAM_REASON = "reason";
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RMActionExecuterAbstractBase#addParameterDefinitions(java.util.List)
*/
@@ -46,7 +46,7 @@ public class FreezeAction extends RMActionExecuterAbstractBase
{
paramList.add(new ParameterDefinitionImpl(PARAM_REASON, DataTypeDefinition.TEXT, true, getParamDisplayLabel(PARAM_REASON)));
}
/**
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -57,7 +57,7 @@ public class FreezeAction extends RMActionExecuterAbstractBase
if (nodeService.exists(actionedUponNodeRef) == true &&
nodeService.hasAspect(actionedUponNodeRef, ContentModel.ASPECT_PENDING_DELETE) == false &&
(recordService.isRecord(actionedUponNodeRef) == true ||
recordsManagementService.isRecordFolder(actionedUponNodeRef) == true) &&
recordFolderService.isRecordFolder(actionedUponNodeRef) == true) &&
freezeService.isFrozen(actionedUponNodeRef) == false)
{
freezeService.freeze((String) action.getParameterValue(PARAM_REASON), actionedUponNodeRef);

View File

@@ -28,7 +28,7 @@ import org.springframework.extensions.surf.util.I18NUtil;
/**
* Action to re-open the records folder
*
*
* @author Roy Wetherall
*/
public class OpenRecordFolderAction extends RMActionExecuterAbstractBase
@@ -38,7 +38,7 @@ public class OpenRecordFolderAction extends RMActionExecuterAbstractBase
/** I18N */
private static final String MSG_NO_OPEN_RECORD_FOLDER = "rm.action.no-open-record-folder";
/** Parameter names */
public static final String PARAM_OPEN_PARENT = "openParent";
@@ -54,7 +54,7 @@ public class OpenRecordFolderAction extends RMActionExecuterAbstractBase
{
// TODO move re-open logic into a service method
// TODO check that the user in question has the correct permission to re-open a records folder
if (recordService.isRecord(actionedUponNodeRef))
{
ChildAssociationRef assocRef = nodeService.getPrimaryParent(actionedUponNodeRef);
@@ -63,13 +63,13 @@ public class OpenRecordFolderAction extends RMActionExecuterAbstractBase
actionedUponNodeRef = assocRef.getParentRef();
}
}
if (this.recordsManagementService.isRecordFolder(actionedUponNodeRef) == true)
if (recordFolderService.isRecordFolder(actionedUponNodeRef) == true)
{
Boolean isClosed = (Boolean) this.nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED);
Boolean isClosed = (Boolean) nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED);
if (Boolean.TRUE.equals(isClosed) == true)
{
this.nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, false);
nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, false);
}
}
else

View File

@@ -43,23 +43,23 @@ import org.springframework.extensions.surf.util.I18NUtil;
/**
* Transfer action
*
*
* @author Roy Wetherall
*/
public class TransferAction extends RMDispositionActionExecuterAbstractBase
{
{
/** Transfer node reference key */
public static final String KEY_TRANSFER_NODEREF = "transferNodeRef";
/** I18N */
private static final String MSG_NODE_ALREADY_TRANSFER = "rm.action.node-already-transfer";
/** Indicates whether the transfer is an accession or not */
private boolean isAccession = false;
/** File plan service */
private FilePlanService filePlanService;
/**
* @param filePlanService file plan service
*/
@@ -67,20 +67,20 @@ public class TransferAction extends RMDispositionActionExecuterAbstractBase
{
this.filePlanService = filePlanService;
}
/**
* Indicates whether this transfer is an accession or not
*
*
* @param isAccession
*/
public void setIsAccession(boolean isAccession)
{
this.isAccession = isAccession;
}
/**
* Do not set the transfer action to auto-complete
*
*
* @see org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase#getSetDispositionActionComplete()
*/
@Override
@@ -88,7 +88,7 @@ public class TransferAction extends RMDispositionActionExecuterAbstractBase
{
return false;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase#executeRecordFolderLevelDisposition(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -106,31 +106,31 @@ public class TransferAction extends RMDispositionActionExecuterAbstractBase
{
doTransfer(action, record);
}
/**
* Create the transfer node and link the disposition lifecycle node beneath it
*
*
* @param dispositionLifeCycleNodeRef disposition lifecycle node
*/
private void doTransfer(Action action, NodeRef dispositionLifeCycleNodeRef)
{
// Get the root rm node
NodeRef root = filePlanService.getFilePlan(dispositionLifeCycleNodeRef);
// Get the transfer object
NodeRef transferNodeRef = (NodeRef)AlfrescoTransactionSupport.getResource(KEY_TRANSFER_NODEREF);
NodeRef transferNodeRef = (NodeRef)AlfrescoTransactionSupport.getResource(KEY_TRANSFER_NODEREF);
if (transferNodeRef == null)
{
// Calculate a transfer name
QName nodeDbid = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "node-dbid");
Long dbId = (Long)this.nodeService.getProperty(dispositionLifeCycleNodeRef, nodeDbid);
String transferName = StringUtils.leftPad(dbId.toString(), 10, "0");
// Create the transfer object
Map<QName, Serializable> transferProps = new HashMap<QName, Serializable>(2);
transferProps.put(ContentModel.PROP_NAME, transferName);
transferProps.put(PROP_TRANSFER_ACCESSION_INDICATOR, this.isAccession);
// setup location property from disposition schedule
DispositionAction da = dispositionService.getNextDispositionAction(dispositionLifeCycleNodeRef);
if (da != null)
@@ -141,57 +141,57 @@ public class TransferAction extends RMDispositionActionExecuterAbstractBase
transferProps.put(PROP_TRANSFER_LOCATION, actionDef.getLocation());
}
}
NodeRef transferContainer = filePlanService.getTransferContainer(root);
transferNodeRef = this.nodeService.createNode(transferContainer,
ContentModel.ASSOC_CONTAINS,
QName.createQName(RM_URI, transferName),
transferNodeRef = this.nodeService.createNode(transferContainer,
ContentModel.ASSOC_CONTAINS,
QName.createQName(RM_URI, transferName),
TYPE_TRANSFER,
transferProps).getChildRef();
// Bind the hold node reference to the transaction
AlfrescoTransactionSupport.bindResource(KEY_TRANSFER_NODEREF, transferNodeRef);
}
else
{
// ensure this node has not already in the process of being transferred
// ensure this node has not already in the process of being transferred
List<ChildAssociationRef> transferredAlready = nodeService.getChildAssocs(transferNodeRef, ASSOC_TRANSFERRED, ASSOC_TRANSFERRED);
for(ChildAssociationRef car : transferredAlready)
{
if(car.getChildRef().equals(dispositionLifeCycleNodeRef) == true)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_NODE_ALREADY_TRANSFER, dispositionLifeCycleNodeRef.toString()));
}
}
}
// Link the record to the trasnfer object
this.nodeService.addChild(transferNodeRef,
dispositionLifeCycleNodeRef,
ASSOC_TRANSFERRED,
this.nodeService.addChild(transferNodeRef,
dispositionLifeCycleNodeRef,
ASSOC_TRANSFERRED,
ASSOC_TRANSFERRED);
// Set PDF indicator flag
setPDFIndicationFlag(transferNodeRef, dispositionLifeCycleNodeRef);
// Set the transferring indicator aspect
nodeService.addAspect(dispositionLifeCycleNodeRef, ASPECT_TRANSFERRING, null);
// Set the return value of the action
action.setParameterValue(ActionExecuter.PARAM_RESULT, transferNodeRef);
}
/**
*
*
* @param transferNodeRef
* @param dispositionLifeCycleNodeRef
*/
private void setPDFIndicationFlag(NodeRef transferNodeRef, NodeRef dispositionLifeCycleNodeRef)
{
if (recordsManagementService.isRecordFolder(dispositionLifeCycleNodeRef) == true)
if (recordFolderService.isRecordFolder(dispositionLifeCycleNodeRef) == true)
{
List<NodeRef> records = recordsManagementService.getRecords(dispositionLifeCycleNodeRef);
List<NodeRef> records = recordService.getRecords(dispositionLifeCycleNodeRef);
for (NodeRef record : records)
{
setPDFIndicationFlag(transferNodeRef, record);
@@ -205,7 +205,7 @@ public class TransferAction extends RMDispositionActionExecuterAbstractBase
{
// Set the property indicator
nodeService.setProperty(transferNodeRef, PROP_TRANSFER_PDF_INDICATOR, true);
}
}
}
}
}

View File

@@ -35,7 +35,7 @@ import org.springframework.extensions.surf.util.I18NUtil;
/**
* Transfer complete action
*
*
* @author Roy Wetherall
*/
public class TransferCompleteAction extends RMActionExecuterAbstractBase
@@ -55,7 +55,7 @@ public class TransferCompleteAction extends RMActionExecuterAbstractBase
{
boolean accessionIndicator = ((Boolean)nodeService.getProperty(actionedUponNodeRef, PROP_TRANSFER_ACCESSION_INDICATOR)).booleanValue();
String transferLocation = nodeService.getProperty(actionedUponNodeRef, PROP_TRANSFER_LOCATION).toString();
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(actionedUponNodeRef, ASSOC_TRANSFERRED, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
@@ -82,7 +82,7 @@ public class TransferCompleteAction extends RMActionExecuterAbstractBase
/**
* Marks the node complete
*
*
* @param nodeRef
* disposition lifecycle node reference
*/
@@ -95,11 +95,11 @@ public class TransferCompleteAction extends RMActionExecuterAbstractBase
nodeService.setProperty(da.getNodeRef(), PROP_DISPOSITION_ACTION_COMPLETED_AT, new Date());
nodeService.setProperty(da.getNodeRef(), PROP_DISPOSITION_ACTION_COMPLETED_BY, AuthenticationUtil.getRunAsUser());
}
// Remove the transferring indicator aspect
nodeService.removeAspect(nodeRef, ASPECT_TRANSFERRING);
nodeService.setProperty(nodeRef, PROP_LOCATION, transferLocation);
// Determine which marker aspect to use
QName markerAspectQName = null;
if (accessionIndicator == true)
@@ -110,12 +110,12 @@ public class TransferCompleteAction extends RMActionExecuterAbstractBase
{
markerAspectQName = ASPECT_TRANSFERRED;
}
// Mark the object and children accordingly
nodeService.addAspect(nodeRef, markerAspectQName, null);
if (recordsManagementService.isRecordFolder(nodeRef) == true)
if (recordFolderService.isRecordFolder(nodeRef) == true)
{
List<NodeRef> records = recordsManagementService.getRecords(nodeRef);
List<NodeRef> records = recordService.getRecords(nodeRef);
for (NodeRef record : records)
{
nodeService.addAspect(record, markerAspectQName, null);

View File

@@ -58,9 +58,9 @@ public class UnCutoffAction extends RMActionExecuterAbstractBase
// Remove the cutoff aspect
nodeService.removeAspect(actionedUponNodeRef, ASPECT_CUT_OFF);
if (recordsManagementService.isRecordFolder(actionedUponNodeRef) == true)
if (recordFolderService.isRecordFolder(actionedUponNodeRef) == true)
{
List<NodeRef> records = this.recordsManagementService.getRecords(actionedUponNodeRef);
List<NodeRef> records = recordService.getRecords(actionedUponNodeRef);
for (NodeRef record : records)
{
nodeService.removeAspect(record, ASPECT_CUT_OFF);

View File

@@ -36,7 +36,6 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent;
@@ -97,10 +96,10 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
private static Log logger = LogFactory.getLog(RecordsManagementAuditServiceImpl.class);
private static final String KEY_RM_AUDIT_NODE_RECORDS = "RMAUditNodeRecords";
protected static final String RM_AUDIT_EVENT_LOGIN_SUCCESS = "Login.Success";
protected static final String RM_AUDIT_EVENT_LOGIN_FAILURE = "Login.Failure";
protected static final String RM_AUDIT_APPLICATION_NAME = "RM";
protected static final String RM_AUDIT_PATH_ROOT = "/RM";
protected static final String RM_AUDIT_SNIPPET_EVENT = "/event";
@@ -125,7 +124,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
protected static final String RM_AUDIT_DATA_LOGIN_USERNAME = "/RM/login/args/userName/value";
protected static final String RM_AUDIT_DATA_LOGIN_FULLNAME = "/RM/login/no-error/fullName";
protected static final String RM_AUDIT_DATA_LOGIN_ERROR = "/RM/login/error/value";
/* Provide Backward compatibility with DOD5015 Audit Events RM-904*/
protected static final String DOD5015_AUDIT_APPLICATION_NAME = "DOD5015";
protected static final String DOD5015_AUDIT_PATH_ROOT = "/DOD5015";
@@ -156,7 +155,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
protected static final String AUDIT_TRAIL_FILE_PREFIX = "audit_";
protected static final String AUDIT_TRAIL_JSON_FILE_SUFFIX = ".json";
protected static final String AUDIT_TRAIL_HTML_FILE_SUFFIX = ".html";
/** Audit auditing events */
private static final String AUDIT_EVENT_START = "audit.start";
private static final String MSG_AUDIT_START = "rm.audit.audit-start";
@@ -174,7 +173,6 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
private ContentService contentService;
private AuditComponent auditComponent;
private AuditService auditService;
private RecordsManagementService rmService;
private RecordsManagementActionService rmActionService;
private FilePlanService filePlanService;
private NamespaceService namespaceService;
@@ -246,14 +244,6 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
this.auditService = auditService;
}
/**
* Set the RecordsManagementService
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* Sets the RecordsManagementActionService instance
*/
@@ -294,7 +284,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
registerAuditEvent(new AuditEvent(name, label));
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService#registerAuditEvent(org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent)
*/
@@ -305,7 +295,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
logger.debug("Registering audit event " + auditEvent.getName());
}
this.auditEvents.put(auditEvent.getName(), auditEvent);
}
@@ -320,11 +310,10 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
PropertyCheck.mandatory(this, "contentService", contentService);
PropertyCheck.mandatory(this, "auditComponent", auditComponent);
PropertyCheck.mandatory(this, "auditService", auditService);
PropertyCheck.mandatory(this, "rmService", rmService);
PropertyCheck.mandatory(this, "rmActionService", rmActionService);
PropertyCheck.mandatory(this, "dictionaryService", dictionaryService);
PropertyCheck.mandatory(this, "filePlanService", filePlanService);
// register audit auditing events
registerAuditEvent(AUDIT_EVENT_CLEAR, MSG_AUDIT_CLEAR);
registerAuditEvent(AUDIT_EVENT_START, MSG_AUDIT_START);
@@ -385,7 +374,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
logger.info("Started Records Management auditing");
}
auditEvent(filePlan, AUDIT_EVENT_START, null, null, true);
}
@@ -396,18 +385,18 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
ParameterCheck.mandatory("filePlan", filePlan);
// TODO use file plan to scope audit log
auditEvent(filePlan, AUDIT_EVENT_STOP, null, null, true);
auditService.disableAudit(
RM_AUDIT_APPLICATION_NAME,
RM_AUDIT_PATH_ROOT);
if (logger.isInfoEnabled())
{
logger.info("Stopped Records Management auditing");
}
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService#clearAuditLog(org.alfresco.service.cmr.repository.NodeRef)
@@ -423,9 +412,9 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
logger.debug("Records Management audit log has been cleared");
}
auditEvent(filePlan, AUDIT_EVENT_CLEAR, null, null, true);
}
}
/**
* {@inheritDoc}
@@ -451,7 +440,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
// TODO: return proper date, for now it's today's date
return getEndOfDay(new Date());
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService#auditEvent(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
*/
@@ -460,7 +449,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
auditEvent(nodeRef, eventName, null, null, false, false);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService#auditEvent(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map, java.util.Map)
*/
@@ -469,16 +458,16 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
auditEvent(nodeRef, eventName, before, after, false, false);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService#auditEvent(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map, java.util.Map, boolean)
*/
@Override
public void auditEvent(NodeRef nodeRef, String eventName, Map<QName, Serializable> before, Map<QName, Serializable> after, boolean immediate)
public void auditEvent(NodeRef nodeRef, String eventName, Map<QName, Serializable> before, Map<QName, Serializable> after, boolean immediate)
{
auditEvent(nodeRef, eventName, before, after, immediate, false);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService#auditEvent(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map, java.util.Map, boolean)
*/
@@ -495,7 +484,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
Set<RMAuditNode> auditDetails = TransactionalResourceHelper.getSet(KEY_RM_AUDIT_NODE_RECORDS);
AlfrescoTransactionSupport.bindListener(txnListener);
// RM-936: Eliminate multiple audit maps from being generated when events with the same name are required to be fired multiple times in the same transaction.
// Check if auditDetails already contains an auditedNode with the same combination of nodeRef and eventName.
boolean auditNodeAlreadyExists = false;
@@ -543,14 +532,14 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
RM_AUDIT_SNIPPET_EVENT,
RM_AUDIT_SNIPPET_NAME),
eventName);
if (nodeRef != null)
{
auditMap.put(
AuditApplication.buildPath(
RM_AUDIT_SNIPPET_EVENT,
RM_AUDIT_SNIPPET_NODE),
nodeRef);
nodeRef);
}
// Filter out any properties to be audited if specified in the Spring configuration.
@@ -558,7 +547,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
removeAuditProperties(ignoredAuditProperties, propertiesBefore, propertiesAfter);
}
// Property changes
Pair<Map<QName, Serializable>, Map<QName, Serializable>> deltaPair = PropertyMap.getBeforeAndAfterMapsForChanges(propertiesBefore, propertiesAfter);
@@ -566,8 +555,8 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
if (deltaPair.getFirst().isEmpty() && deltaPair.getSecond().isEmpty() && removeOnNoPropertyChange == true)
{
auditMap.clear();
}
else
}
else
{
auditMap.put(
AuditApplication.buildPath(
@@ -583,13 +572,13 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
RM_AUDIT_SNIPPET_CHANGES,
RM_AUDIT_SNIPPET_AFTER),
(Serializable) deltaPair.getSecond());
}
}
return auditMap;
}
/**
* Helper method to remove system properties from maps
*
*
* @param properties
*/
private void removeAuditProperties(List<String> ignoredAuditProperties, Map<QName, Serializable> before, Map<QName, Serializable> after)
@@ -608,7 +597,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
* A <b>stateless</b> transaction listener for RM auditing. This component picks up the data of modified nodes and generates the audit information.
* <p/>
* This class is not static so that the instances will have access to the action's implementation.
*
*
* @author Derek Hulley
* @since 3.2
*/
@@ -649,7 +638,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
private void auditInTxn(Set<RMAuditNode> auditedNodes) throws Throwable
{
// Go through all the audit information and audit it
boolean auditedSomething = false;
boolean auditedSomething = false;
for (RMAuditNode auditedNode : auditedNodes)
{
NodeRef nodeRef = auditedNode.getNodeRef();
@@ -661,9 +650,9 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
}
// build the audit map
Map<String, Serializable> auditMap = buildAuditMap(nodeRef,
auditedNode.getEventName(),
auditedNode.getNodePropertiesBefore(),
Map<String, Serializable> auditMap = buildAuditMap(nodeRef,
auditedNode.getEventName(),
auditedNode.getNodePropertiesBefore(),
auditedNode.getNodePropertiesAfter(),
auditedNode.getRemoveIfNoPropertyChanged());
// Audit it
@@ -770,7 +759,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
logger.debug("Retrieving audit trail in '" + reportFormat + "' format using parameters: " + params);
}
// define the callback
AuditQueryCallback callback = new AuditQueryCallback()
{
@@ -853,7 +842,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
namePath = (String) values.get(DOD5015_AUDIT_DATA_NODE_NAMEPATH);
beforeProperties = (Map<QName, Serializable>) values.get( DOD5015_AUDIT_DATA_NODE_CHANGES_BEFORE);
afterProperties = (Map<QName, Serializable>) values.get(DOD5015_AUDIT_DATA_NODE_CHANGES_AFTER);
// Convert some of the values to recognizable forms
nodeType = null;
if (nodeTypeQname != null)
@@ -998,7 +987,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
dod5015AuditQueryParams.addSearchKey(DOD5015_AUDIT_DATA_NODE_NODEREF, nodeRef);
}
//
AuditQueryParameters auditQueryParams = new AuditQueryParameters();
auditQueryParams.setForward(forward);
@@ -1021,7 +1010,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
// finish off the audit trail report
writeAuditTrailFooter(writer, reportFormat);
// audit that the audit has been view'ed
if (nodeRef == null)
{
@@ -1177,7 +1166,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
List<AuditEvent> listAuditEvents = new ArrayList<AuditEvent>(this.auditEvents.size());
listAuditEvents.addAll(this.auditEvents.values());
Collections.sort(listAuditEvents, new AuditEvent());
Collections.sort(listAuditEvents, new AuditEvent());
return listAuditEvents;
}
@@ -1497,7 +1486,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
return label;
}
/**
* A class to carry audit information through the transaction.
*
@@ -1516,12 +1505,12 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
return nodeRef;
}
public void setNodeRef(NodeRef nodeRef)
{
this.nodeRef = nodeRef;
}
public String getEventName()
{
return eventName;
@@ -1561,13 +1550,13 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
this.removeIfNoPropertyChanged = removeIfNoPropertyChanged;
}
}
}
/** Deprecated Method Implementations **/
/**
* Helper method to get the default file plan
*
*
* @return NodRef default file plan
*/
private NodeRef getDefaultFilePlan()
@@ -1607,7 +1596,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
{
stopAuditLog(getDefaultFilePlan());
}
/**
* {@inheritDoc}
*/
@@ -1633,8 +1622,8 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean
public void clear()
{
clearAuditLog(getDefaultFilePlan());
}
}
/**
* {@inheritDoc}
* @since 3.2

View File

@@ -22,7 +22,6 @@ import java.io.Serializable;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.audit.extractor.AbstractDataExtractor;
@@ -33,9 +32,9 @@ import org.alfresco.service.cmr.repository.NodeService;
* An extractor that extracts the <b>cm:name</b> path from the RM root down to
* - and including - the node's own name. This will only extract data if the
* node is a {@link RecordsManagementModel#ASPECT_FILE_PLAN_COMPONENT fileplan component}.
*
* @see RecordsManagementService#getNodeRefPath(NodeRef)
*
*
* @see FilePlanService#getNodeRefPath(NodeRef)
*
* @author Derek Hulley
* @since 3.2
*/
@@ -55,7 +54,7 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
@@ -79,17 +78,17 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor
public Serializable extractData(Serializable value) throws Throwable
{
NodeRef nodeRef = (NodeRef) value;
// Get path from the RM root
List<NodeRef> nodeRefPath = filePlanService.getNodeRefPath(nodeRef);
StringBuilder sb = new StringBuilder(128);
for (NodeRef pathNodeRef : nodeRefPath)
{
String name = (String)nodeService.getProperty(pathNodeRef, ContentModel.PROP_NAME);
sb.append("/").append(name);
}
// Done
return sb.toString();
}

View File

@@ -21,7 +21,6 @@ package org.alfresco.module.org_alfresco_module_rm.audit.extractor;
import java.io.Serializable;
import java.util.List;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.audit.extractor.AbstractDataExtractor;
@@ -32,9 +31,9 @@ import org.alfresco.service.cmr.repository.NodeService;
* An extractor that extracts the NodeRef path from the RM root down to
* - and including - the node itself. This will only extract data if the
* node is a {@link RecordsManagementModel#ASPECT_FILE_PLAN_COMPONENT fileplan component}.
*
* @see RecordsManagementService#getNodeRefPath(NodeRef)
*
*
* @see FilePlanService#getNodeRefPath(NodeRef)
*
* @author Derek Hulley
* @since 1.0
*/
@@ -51,7 +50,7 @@ public final class FilePlanNodeRefPathDataExtractor extends AbstractDataExtracto
this.nodeService = nodeService;
}
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
@@ -72,10 +71,10 @@ public final class FilePlanNodeRefPathDataExtractor extends AbstractDataExtracto
public Serializable extractData(Serializable value) throws Throwable
{
NodeRef nodeRef = (NodeRef) value;
// Get path from the RM root
List<NodeRef> nodeRefPath = filePlanService.getNodeRefPath(nodeRef);
// Done
return (Serializable) nodeRefPath;
}

View File

@@ -24,8 +24,6 @@ import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AccessStatus;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
/**
@@ -37,10 +35,6 @@ import org.springframework.extensions.surf.util.I18NUtil;
public abstract class AbstractCapability extends RMSecurityCommon
implements Capability, RecordsManagementModel, RMPermissionModel
{
/** Logger */
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(AbstractCapability.class);
/** Capability service */
protected CapabilityService capabilityService;
@@ -115,7 +109,7 @@ public abstract class AbstractCapability extends RMSecurityCommon
{
title = getName();
}
}
return title;
}

View File

@@ -21,7 +21,6 @@ package org.alfresco.module.org_alfresco_module_rm.capability;
import net.sf.acegisecurity.vote.AccessDecisionVoter;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.caveat.RMCaveatConfigComponent;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
@@ -41,27 +40,26 @@ import org.apache.commons.logging.LogFactory;
/**
* Common security functions.
*
*
* TODO move methods to the appropriate services
*
*
* @author Roy Wetherall
* @since 2.0
*/
public class RMSecurityCommon
{
{
/** No set value */
protected int NOSET_VALUE = -100;
/** Logger */
private static Log logger = LogFactory.getLog(RMSecurityCommon.class);
/** Services */
protected NodeService nodeService; //This is the internal NodeService -- no permission checks
protected PermissionService permissionService;
protected RecordsManagementService rmService;
protected RMCaveatConfigComponent caveatConfigComponent;
protected FilePlanService filePlanService;
/**
* @param nodeService node service
*/
@@ -69,7 +67,7 @@ public class RMSecurityCommon
{
this.nodeService = nodeService;
}
/**
* @param permissionService permission service
*/
@@ -77,15 +75,7 @@ public class RMSecurityCommon
{
this.permissionService = permissionService;
}
/**
* @param rmService records management service
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* @param caveatConfigComponent caveat config service
*/
@@ -93,7 +83,7 @@ public class RMSecurityCommon
{
this.caveatConfigComponent = caveatConfigComponent;
}
/**
* @param filePlanService file plan service
*/
@@ -101,10 +91,10 @@ public class RMSecurityCommon
{
this.filePlanService = filePlanService;
}
/**
* Sets a value into the transaction cache
*
*
* @param prefix
* @param nodeRef
* @param value
@@ -114,12 +104,12 @@ public class RMSecurityCommon
{
String user = AuthenticationUtil.getRunAsUser();
AlfrescoTransactionSupport.bindResource(prefix + nodeRef.toString() + user, Integer.valueOf(value));
return value;
return value;
}
/**
* Gets a value from the transaction cache
*
*
* @param prefix
* @param nodeRef
* @return
@@ -135,10 +125,10 @@ public class RMSecurityCommon
}
return result;
}
/**
* Check for RM read
*
*
* @param nodeRef
* @return
*/
@@ -153,10 +143,10 @@ public class RMSecurityCommon
return result;
}
/**
* Check for RM read
*
*
* @param nodeRef
* @param allowDMRead
* @return
@@ -164,7 +154,7 @@ public class RMSecurityCommon
public int checkRead(NodeRef nodeRef, boolean allowDMRead)
{
int result = AccessDecisionVoter.ACCESS_ABSTAIN;
if (nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT)== true)
{
result = checkRmRead(nodeRef);
@@ -187,26 +177,26 @@ public class RMSecurityCommon
result = AccessDecisionVoter.ACCESS_GRANTED;
}
}
return result;
}
return result;
}
/**
*
*
* @param nodeRef
* @return
*/
public int checkRmRead(NodeRef nodeRef)
{
{
int result = getTransactionCache("checkRmRead", nodeRef);
if (result != NOSET_VALUE)
{
return result;
}
// Get the file plan for the node
NodeRef filePlan = filePlanService.getFilePlan(nodeRef);
// Admin role
//if (permissionService.hasPermission(filePlan, RMPermissionModel.ROLE_ADMINISTRATOR) == AccessStatus.ALLOWED)
//{
@@ -214,7 +204,7 @@ public class RMSecurityCommon
// {
// logger.debug("\t\tAdmin user, access granted. (nodeRef=" + nodeRef.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")");
// }
// return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_GRANTED);
// return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_GRANTED);
// }
if (permissionService.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS) == AccessStatus.DENIED)
@@ -223,7 +213,7 @@ public class RMSecurityCommon
{
logger.debug("\t\tUser does not have read record permission on node, access denied. (nodeRef=" + nodeRef.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")");
}
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED);
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED);
}
if (permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS) == AccessStatus.DENIED)
@@ -232,36 +222,36 @@ public class RMSecurityCommon
{
logger.debug("\t\tUser does not have view records capability permission on node, access denied. (filePlan=" + filePlan.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")");
}
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED);
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED);
}
if (caveatConfigComponent.hasAccess(nodeRef))
{
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_GRANTED);
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_GRANTED);
}
else
{
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED);
return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED);
}
}
@SuppressWarnings("rawtypes")
protected NodeRef getTestNode(MethodInvocation invocation, Class[] params, int position, boolean parent)
{
NodeRef testNodeRef = null;
if (position < 0)
{
testNodeRef = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID);
testNodeRef = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID);
if (testNodeRef == null)
{
throw new AlfrescoRuntimeException("Unable to find default file plan node.");
}
if (logger.isDebugEnabled())
{
logger.debug("\tPermission test against the file plan node " + nodeService.getPath(testNodeRef));
}
}
}
else if (StoreRef.class.isAssignableFrom(params[position]))
{

View File

@@ -18,43 +18,37 @@
*/
package org.alfresco.module.org_alfresco_module_rm.capability.declarative;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
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.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.PermissionService;
import org.springframework.beans.factory.BeanNameAware;
/**
* Abstract capability condition.
*
*
* @author Roy Wetherall
*/
public abstract class AbstractCapabilityCondition implements CapabilityCondition,
public abstract class AbstractCapabilityCondition implements CapabilityCondition,
BeanNameAware,
RecordsManagementModel
{
/** Capability condition name */
protected String name;
/** Services */
protected RecordsManagementService rmService;
protected RecordService recordService;
protected PermissionService permissionService;
protected NodeService nodeService;
protected FreezeService freezeService;
protected FilePlanService filePlanService;
/**
* @param rmService records management service
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
protected DispositionService dispositionService;
protected RecordFolderService recordFolderService;
/**
* @param recordService record service
*/
@@ -62,7 +56,7 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition
{
this.recordService = recordService;
}
/**
* @param permissionService permission service
*/
@@ -70,7 +64,7 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition
{
this.permissionService = permissionService;
}
/**
* @param nodeService node service
*/
@@ -78,7 +72,7 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition
{
this.nodeService = nodeService;
}
/**
* @param freezeService freeze service
*/
@@ -86,15 +80,31 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition
{
this.freezeService = freezeService;
}
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/**
* @param dispositionService disposition service
*/
public void setDispositionService(DispositionService dispositionService)
{
this.dispositionService = dispositionService;
}
/**
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#getName()
*/
@@ -103,7 +113,7 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition
{
return name;
}
/**
* @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String)
*/

View File

@@ -38,9 +38,9 @@ public class ClosedCapabilityCondition extends AbstractCapabilityCondition
public boolean evaluate(NodeRef nodeRef)
{
boolean result = false;
if (rmService.isRecordFolder(nodeRef) == true)
if (recordFolderService.isRecordFolder(nodeRef) == true)
{
result = rmService.isRecordFolderClosed(nodeRef);
result = recordFolderService.isRecordFolderClosed(nodeRef);
}
else if (recordService.isRecord(nodeRef) == true)
{
@@ -48,14 +48,14 @@ public class ClosedCapabilityCondition extends AbstractCapabilityCondition
for (ChildAssociationRef assoc : assocs)
{
NodeRef parent = assoc.getParentRef();
if (rmService.isRecordFolder(parent) == true &&
rmService.isRecordFolderClosed(parent) == true)
if (recordFolderService.isRecordFolder(parent) == true &&
recordFolderService.isRecordFolderClosed(parent) == true)
{
result = true;
break;
}
}
}
}
}
return result;
}

View File

@@ -32,7 +32,7 @@ public class CutoffCapabilityCondition extends AbstractCapabilityCondition
@Override
public boolean evaluate(NodeRef nodeRef)
{
return rmService.isCutoff(nodeRef);
return dispositionService.isCutoff(nodeRef);
}
}

View File

@@ -38,7 +38,7 @@ public class IsRecordFolderCondition extends AbstractCapabilityCondition
{
ParameterCheck.mandatory("nodeRef", nodeRef);
return rmService.isRecordFolder(nodeRef);
return recordFolderService.isRecordFolder(nodeRef);
}
}

View File

@@ -26,17 +26,17 @@ import org.alfresco.service.cmr.repository.NodeRef;
/**
* Indicates whether the given disposition action 'may' be scheduled in the future
*
*
* @author Roy Wetherall
*/
public class MayBeScheduledCapabilityCondition extends AbstractCapabilityCondition
{
/** Disposition action */
private String dispositionAction;
/** Disposition service */
private DispositionService dispositionService;
/**
* @param dispositionAction disposition action
*/
@@ -44,7 +44,7 @@ public class MayBeScheduledCapabilityCondition extends AbstractCapabilityConditi
{
this.dispositionAction = dispositionAction;
}
/**
* @param dispositionService disposition service
*/
@@ -52,20 +52,20 @@ public class MayBeScheduledCapabilityCondition extends AbstractCapabilityConditi
{
this.dispositionService = dispositionService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public boolean evaluate(NodeRef nodeRef)
{
boolean result = false;
boolean result = false;
DispositionSchedule dispositionSchedule = dispositionService.getDispositionSchedule(nodeRef);
if (dispositionSchedule != null)
{
{
if (checkDispositionLevel(nodeRef, dispositionSchedule) == true)
{
{
for (DispositionActionDefinition dispositionActionDefinition : dispositionSchedule.getDispositionActionDefinitions())
{
if (dispositionActionDefinition.getName().equals(dispositionAction) == true)
@@ -79,10 +79,10 @@ public class MayBeScheduledCapabilityCondition extends AbstractCapabilityConditi
}
return result;
}
/**
* Checks the disposition level
*
*
* @param nodeRef
* @param dispositionSchedule
* @return
@@ -95,8 +95,8 @@ public class MayBeScheduledCapabilityCondition extends AbstractCapabilityConditi
{
result = true;
}
else if (rmService.isRecordFolder(nodeRef) == true && isRecordLevelDisposition == false)
else if (recordFolderService.isRecordFolder(nodeRef) == true && isRecordLevelDisposition == false)
{
result = true;
}

View File

@@ -30,14 +30,14 @@ public class VitalRecordOrFolderCapabilityCondition extends AbstractCapabilityCo
@Override
public boolean evaluate(NodeRef nodeRef)
{
boolean result = false;
boolean result = false;
if (recordService.isRecord(nodeRef) == true)
{
// Check the record for the vital record aspect
result = nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_VITAL_RECORD);
}
else if (rmService.isRecordFolder(nodeRef) == true)
else if (recordFolderService.isRecordFolder(nodeRef) == true)
{
// Check the folder for the vital record indicator
Boolean value = (Boolean)nodeService.getProperty(nodeRef, RecordsManagementModel.PROP_VITAL_RECORD_INDICATOR);
@@ -45,8 +45,8 @@ public class VitalRecordOrFolderCapabilityCondition extends AbstractCapabilityCo
{
result = value.booleanValue();
}
}
}
return result;
}
}

View File

@@ -27,24 +27,31 @@ import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.capability.declarative.DeclarativeCapability;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.namespace.QName;
/**
* Create group capability implementation
*
*
* @author Andy Hind
*/
public class CreateCapability extends DeclarativeCapability
{
private RecordService recordService;
private RecordFolderService recordFolderService;
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.capability.Capability#evaluate(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -55,7 +62,7 @@ public class CreateCapability extends DeclarativeCapability
}
/**
*
*
* @param destination
* @param linkee
* @param type
@@ -66,7 +73,7 @@ public class CreateCapability extends DeclarativeCapability
{
if (linkee != null)
{
int state = checkRead(linkee, true);
int state = checkRead(linkee, true);
if (state != AccessDecisionVoter.ACCESS_GRANTED)
{
return AccessDecisionVoter.ACCESS_DENIED;
@@ -84,7 +91,7 @@ public class CreateCapability extends DeclarativeCapability
{
return AccessDecisionVoter.ACCESS_GRANTED;
}
}
}
}
else
{
@@ -96,31 +103,31 @@ public class CreateCapability extends DeclarativeCapability
}
}
}
}
// Build the conditions map
Map<String, Boolean> conditions = new HashMap<String, Boolean>(5);
conditions.put("capabilityCondition.filling", Boolean.TRUE);
conditions.put("capabilityCondition.frozen", Boolean.FALSE);
conditions.put("capabilityCondition.frozen", Boolean.FALSE);
conditions.put("capabilityCondition.closed", Boolean.FALSE);
conditions.put("capabilityCondition.cutoff", Boolean.FALSE);
conditions.put("capabilityCondition.cutoff", Boolean.FALSE);
if (checkConditions(destination, conditions) == true)
{
if (rmService.isRecordFolder(destination))
if (recordFolderService.isRecordFolder(destination))
{
if (permissionService.hasPermission(destination, RMPermissionModel.FILE_RECORDS) == AccessStatus.ALLOWED)
{
return AccessDecisionVoter.ACCESS_GRANTED;
}
}
}
conditions.put("capabilityCondition.closed", Boolean.TRUE);
}
conditions.put("capabilityCondition.closed", Boolean.TRUE);
if (checkConditions(destination, conditions) == true)
{
if (rmService.isRecordFolder(destination))
if (recordFolderService.isRecordFolder(destination))
{
if (permissionService.hasPermission(filePlanService.getFilePlan(destination), RMPermissionModel.DECLARE_RECORDS_IN_CLOSED_FOLDERS) == AccessStatus.ALLOWED)
{
@@ -128,12 +135,12 @@ public class CreateCapability extends DeclarativeCapability
}
}
}
conditions.remove("capabilityCondition.closed");
conditions.put("capabilityCondition.cutoff", Boolean.TRUE);
if (checkConditions(destination, conditions) == true)
{
if (rmService.isRecordFolder(destination))
if (recordFolderService.isRecordFolder(destination))
{
if (permissionService.hasPermission(filePlanService.getFilePlan(destination), RMPermissionModel.CREATE_MODIFY_RECORDS_IN_CUTOFF_FOLDERS) == AccessStatus.ALLOWED)
{

View File

@@ -22,7 +22,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.behaviour.RecordsManagementSearchBehaviour;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderServiceImpl;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.role.Role;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
@@ -41,11 +41,8 @@ import org.alfresco.service.namespace.QName;
import org.alfresco.util.ParameterCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class DataSetServiceImpl implements DataSetService, RecordsManagementModel, ApplicationContextAware
public class DataSetServiceImpl implements DataSetService, RecordsManagementModel
{
/** Logger */
@@ -87,17 +84,8 @@ public class DataSetServiceImpl implements DataSetService, RecordsManagementMode
/** Disposition service */
private DispositionService dispositionService;
/** Application context */
private ApplicationContext applicationContext;
/**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
}
/** Record folder service */
private RecordFolderService recordFolderService;
/**
* Set importer service
@@ -188,6 +176,16 @@ public class DataSetServiceImpl implements DataSetService, RecordsManagementMode
this.dispositionService = dispositionService;
}
/**
* Set record folder service
*
* @param recordFolderService the record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService#register(org.alfresco.module.org_alfresco_module_rm.dataset.DataSet)
*/
@@ -346,11 +344,6 @@ public class DataSetServiceImpl implements DataSetService, RecordsManagementMode
/**
* Temp method to patch AMP'ed data
*
* @param searchService
* @param nodeService
* @param recordsManagementService
* @param recordsManagementActionService
*/
private void patchLoadedData()
{
@@ -445,8 +438,7 @@ public class DataSetServiceImpl implements DataSetService, RecordsManagementMode
{
// Fire action to "set-up" the folder correctly
logger.info("Setting up bootstraped record folder: " + folderName);
RecordFolderServiceImpl recordService = (RecordFolderServiceImpl)applicationContext.getBean("recordFolderService");
recordService.initialiseRecordFolder(recordFolder);
recordFolderService.initialiseRecordFolder(recordFolder);
}
}

View File

@@ -29,126 +29,126 @@ import org.alfresco.service.namespace.QName;
/**
* Disposition service interface.
*
*
* @author Roy Wetherall
* @since 2.0
*/
public interface DispositionService
{
/** ========= Disposition Property Methods ========= */
/**
* Register a disposition property.
*
*
* @param dispositionProperty disposition property
*/
void registerDispositionProperty(DispositionProperty dispositionProperty);
/**
* Returns the list of disposition period properties that apply given the context provided.
*
*
* @return filtered list of disposition period properties
*/
Collection<DispositionProperty> getDispositionProperties(boolean isRecordLevel, String dispositionAction);
Collection<DispositionProperty> getDispositionProperties();
/** ========= Disposition Schedule Methods ========= */
/**
* Get the disposition schedule for a given record management node. Traverses the hierarchy to
* Get the disposition schedule for a given record management node. Traverses the hierarchy to
* find the first disposition schedule in the primary hierarchy.
*
*
* @param nodeRef node reference to record category, record folder or record
* @return {@link DispositionSchedule} disposition schedule
*/
DispositionSchedule getDispositionSchedule(NodeRef nodeRef);
// Gets all the disposition schedules, not just the first in the primary parent path.
// TODO List<DispositionSchedule> getAllDispositionSchedules(NodeRef nodeRef);
/**
* Get the disposition schedule directly associated with the node specified. Returns
* null if none.
*
*
* @param nodeRef node reference
* @return {@link DispositionSchedule} disposition schedule directly associated with the node reference, null if none
*/
DispositionSchedule getAssociatedDispositionSchedule(NodeRef nodeRef);
/**
* Gets the records management container that is directly associated with the disposition schedule.
*
*
* @param dispositionSchedule disposition schedule
* @return {@link NodeRef} node reference of the associated container
*/
NodeRef getAssociatedRecordsManagementContainer(DispositionSchedule dispositionSchedule);
/**
* Indicates whether a disposition schedule has any disposable items under its management
*
*
* @param dispositionSchdule disposition schedule
* @return boolean true if there are disposable items being managed by, false otherwise
*/
boolean hasDisposableItems(DispositionSchedule dispositionSchdule);
/**
* Gets a list of all the disposable items (records, record folders) that are under the control of
* Gets a list of all the disposable items (records, record folders) that are under the control of
* the disposition schedule.
*
*
* @param dispositionSchedule disposition schedule
* @return {@link List}<{@link NodeRef}> list of disposable items
*/
List<NodeRef> getDisposableItems(DispositionSchedule dispositionSchedule);
/**
* Indicates whether the node is a disposable item or not (ie is under the control of a disposition schedule)
*
*
* @param nodeRef node reference
* @return boolean true if node is a disposable item, false otherwise
*/
boolean isDisposableItem(NodeRef nodeRef);
/**
* Creates a disposition schedule on the given record category.
*
*
* @param recordCategory
* @param props
* @return {@link DispositionSchedule}
*/
DispositionSchedule createDispositionSchedule(NodeRef recordCategory, Map<QName, Serializable> props);
// TODO DispositionSchedule updateDispositionSchedule(DispositionScedule, Map<QName, Serializable> props)
// TODO void removeDispositionSchedule(NodeRef nodeRef); - can only remove if no disposition items
/** ========= Disposition Action Definition Methods ========= */
/**
* Adds a new disposition action definition to the given disposition schedule.
*
*
* @param schedule The DispositionSchedule to add to
* @param actionDefinitionParams Map of parameters to use to create the action definition
*/
DispositionActionDefinition addDispositionActionDefinition(
DispositionSchedule schedule,
DispositionSchedule schedule,
Map<QName, Serializable> actionDefinitionParams);
/**
* Removes the given disposition action definition from the given disposition
* schedule.
*
*
* @param schedule The DispositionSchedule to remove from
* @param actionDefinition The DispositionActionDefinition to remove
*/
void removeDispositionActionDefinition(
DispositionSchedule schedule,
DispositionSchedule schedule,
DispositionActionDefinition actionDefinition);
/**
* Updates the given disposition action definition belonging to the given disposition
* schedule.
*
*
* @param actionDefinition The DispositionActionDefinition to update
* @param actionDefinitionParams Map of parameters to use to update the action definition
* @return The updated DispositionActionDefinition
@@ -156,48 +156,57 @@ public interface DispositionService
DispositionActionDefinition updateDispositionActionDefinition(
DispositionActionDefinition actionDefinition,
Map<QName, Serializable> actionDefinitionParams);
/** ========= Disposition Action Methods ========= */
/**
* Indicates whether the next disposition action is eligible or not.
*
*
* @param nodeRef node reference to disposable item
* @return boolean true if next disposition action is eligible, false otherwise
*/
*/
boolean isNextDispositionActionEligible(NodeRef nodeRef);
/**
* Gets the next disposition action for a given node
*
*
* @param nodeRef node reference to disposable item
* @return DispositionAction next disposition action, null if none
*/
DispositionAction getNextDispositionAction(NodeRef nodeRef);
// TODO void startNextDispositionAction(NodeRef nodeRef);
// TODO void completeNextDispositionAction(NodeRef nodeRef);
/** ========= Disposition Action History Methods ========= */
/**
* Gets a list of all the completed disposition action in the order they occured.
*
* @param nodeRef record/record folder
*
* @param nodeRef record/record folder
* @return List<DispositionAction> list of completed disposition actions
*/
List<DispositionAction> getCompletedDispositionActions(NodeRef nodeRef);
/**
* Helper method to get the last completed disposition action. Returns null
* Helper method to get the last completed disposition action. Returns null
* if there is none.
*
*
* @param nodeRef record/record folder
* @return DispositionAction last completed disposition action, null if none
*/
DispositionAction getLastCompletedDispostionAction(NodeRef nodeRef);
/**
* Indicates whether the item is cutoff or not.
*
* @param nodeRef node reference
* @return boolean true if the item is cutoff, false otherwise
*
* @since 2.0
*/
boolean isCutoff(NodeRef nodeRef);
}

View File

@@ -27,18 +27,19 @@ import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
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.RecordsManagementEventType;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
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.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -56,91 +57,95 @@ import org.springframework.context.ApplicationContextAware;
/**
* Disposition service implementation.
*
*
* @author Roy Wetherall
*/
public class DispositionServiceImpl implements
DispositionService,
RecordsManagementModel,
public class DispositionServiceImpl implements
DispositionService,
RecordsManagementModel,
ApplicationContextAware,
NodeServicePolicies.OnAddAspectPolicy
{
/** Logger */
private static Log logger = LogFactory.getLog(DispositionServiceImpl.class);
/** Node service */
private NodeService nodeService;
/** Dictionary service */
private DictionaryService dictionaryService;
/** Behaviour filter */
private BehaviourFilter behaviourFilter;
/** Records management service */
private RecordsManagementService rmService;
/** Records management service registry */
private RecordsManagementServiceRegistry serviceRegistry;
/** Disposition selection strategy */
private DispositionSelectionStrategy dispositionSelectionStrategy;
/** File plan service */
private FilePlanService filePlanService;
/** Application context */
private ApplicationContext applicationContext;
/** Record Folder Service */
// FIXME
//private RecordFolderService recordFolderService;
/** Record Service */
private RecordService recordService;
/** Policy component */
private PolicyComponent policyComponent;
/** Disposition properties */
private Map<QName, DispositionProperty> dispositionProperties = new HashMap<QName, DispositionProperty>(4);
/** Behaviours */
private JavaBehaviour onAddAspect;
/**
* Set node service
*
*
* @param nodeService the node service
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
/**
* Set the dictionary service
*
*
* @param dictionaryServic the dictionary service
*/
public void setDictionaryService(DictionaryService dictionaryService)
{
this.dictionaryService = dictionaryService;
}
/**
* Set the behaviour filter.
*
*
* @param behaviourFilter the behaviour filter
*/
public void setBehaviourFilter(BehaviourFilter behaviourFilter)
{
this.behaviourFilter = behaviourFilter;
}
/**
* Set the records management service registry
*
*
* @param serviceRegistry records management registry service
*/
public void setRecordsManagementServiceRegistry(RecordsManagementServiceRegistry serviceRegistry)
{
this.serviceRegistry = serviceRegistry;
}
/**
* @param policyComponent policy component
*/
@@ -148,30 +153,31 @@ public class DispositionServiceImpl implements
{
this.policyComponent = policyComponent;
}
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/**
* Get the records management service
* NOTE: have to pull it out of the app context manually to prevent Spring circular dependancy issue
*
* @return
* @param recordFolderService record folder service
*/
public RecordsManagementService getRmService()
// public void setRecordFolderService(RecordFolderService recordFolderService)
// {
// this.recordFolderService = recordFolderService;
// }
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
if (rmService == null)
{
rmService = (RecordsManagementService)applicationContext.getBean("recordsManagementService");
}
return rmService;
this.recordService = recordService;
}
/**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@@ -180,17 +186,17 @@ public class DispositionServiceImpl implements
{
this.applicationContext = applicationContext;
}
/**
* Set the dispositionSelectionStrategy bean.
*
*
* @param dispositionSelectionStrategy
*/
public void setDispositionSelectionStrategy(DispositionSelectionStrategy dispositionSelectionStrategy)
{
this.dispositionSelectionStrategy = dispositionSelectionStrategy;
}
/**
* Bean initialisation
*/
@@ -199,7 +205,7 @@ public class DispositionServiceImpl implements
onAddAspect = new JavaBehaviour(this, "onAddAspect", NotificationFrequency.FIRST_EVENT);
policyComponent.bindClassBehaviour(NodeServicePolicies.OnAddAspectPolicy.QNAME, ASPECT_DISPOSITION_LIFECYCLE, onAddAspect);
}
/**
* Initialises the details of the disposition life cycle
*/
@@ -211,35 +217,35 @@ public class DispositionServiceImpl implements
refreshDispositionAction(nodeRef);
}
}
/**
* Helper method used to refresh the dispostion action details of the given node.
*
*
* @param nodeRef node reference
*/
public void refreshDispositionAction(NodeRef nodeRef)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
// get this disposition instructions for the node
DispositionSchedule di = getDispositionSchedule(nodeRef);
if (di != null)
{
List<DispositionActionDefinition> dispositionActionDefinitions = di.getDispositionActionDefinitions();
{
List<DispositionActionDefinition> dispositionActionDefinitions = di.getDispositionActionDefinitions();
if (dispositionActionDefinitions.isEmpty() == false)
{
// get the first disposition action definition
DispositionActionDefinition nextDispositionActionDefinition = dispositionActionDefinitions.get(0);
// initialise the details of the next disposition action
initialiseDispositionAction(nodeRef, nextDispositionActionDefinition);
}
}
}
/** ========= Disposition Property Methods ========= */
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#registerDispositionProperty(org.alfresco.module.org_alfresco_module_rm.disposition.property.DispositionProperty)
*/
@@ -248,14 +254,14 @@ public class DispositionServiceImpl implements
{
dispositionProperties.put(dispositionProperty.getQName(), dispositionProperty);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#getDispositionProperties(boolean, java.lang.String)
*/
@Override
public Collection<DispositionProperty> getDispositionProperties(boolean isRecordLevel, String dispositionAction)
{
Collection<DispositionProperty> values = dispositionProperties.values();
Collection<DispositionProperty> values = dispositionProperties.values();
List<DispositionProperty> result = new ArrayList<DispositionProperty>(values.size());
for (DispositionProperty dispositionProperty : values)
{
@@ -267,7 +273,7 @@ public class DispositionServiceImpl implements
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#getDispositionProperties()
*/
@@ -276,20 +282,22 @@ public class DispositionServiceImpl implements
{
return dispositionProperties.values();
}
/** ========= Disposition Schedule Methods ========= */
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#getDispositionSchedule(org.alfresco.service.cmr.repository.NodeRef)
*/
public DispositionSchedule getDispositionSchedule(NodeRef nodeRef)
{
{
DispositionSchedule di = null;
NodeRef diNodeRef = null;
if (serviceRegistry.getRecordService().isRecord(nodeRef) == true)
{
// Get the record folders for the record
List<NodeRef> recordFolders = getRmService().getRecordFolders(nodeRef);
// FIXME
RecordFolderService recordFolderService = (RecordFolderService)applicationContext.getBean("RecordFolderService");
List<NodeRef> recordFolders = recordFolderService.getRecordFolders(nodeRef);
// At this point, we may have disposition instruction objects from 1..n folders.
diNodeRef = dispositionSelectionStrategy.selectDispositionScheduleFrom(recordFolders);
}
@@ -298,26 +306,26 @@ public class DispositionServiceImpl implements
// Get the disposition instructions for the node reference provided
diNodeRef = getDispositionScheduleImpl(nodeRef);
}
if (diNodeRef != null)
{
di = new DispositionScheduleImpl(serviceRegistry, nodeService, diNodeRef);
}
return di;
}
/**
* This method returns a NodeRef
* Gets the disposition instructions
*
* Gets the disposition instructions
*
* @param nodeRef
* @return
*/
private NodeRef getDispositionScheduleImpl(NodeRef nodeRef)
{
NodeRef result = getAssociatedDispositionScheduleImpl(nodeRef);
if (result == null)
{
NodeRef parent = this.nodeService.getPrimaryParent(nodeRef).getParentRef();
@@ -328,18 +336,18 @@ public class DispositionServiceImpl implements
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#getAssociatedDispositionSchedule(org.alfresco.service.cmr.repository.NodeRef)
*/
public DispositionSchedule getAssociatedDispositionSchedule(NodeRef nodeRef)
{
DispositionSchedule ds = null;
// Check the noderef parameter
ParameterCheck.mandatory("nodeRef", nodeRef);
if (nodeService.exists(nodeRef) == true)
{
{
// Get the associated disposition schedule node reference
NodeRef dsNodeRef = getAssociatedDispositionScheduleImpl(nodeRef);
if (dsNodeRef != null)
@@ -348,21 +356,21 @@ public class DispositionServiceImpl implements
ds = new DispositionScheduleImpl(serviceRegistry, nodeService, dsNodeRef);
}
}
return ds;
}
/**
* Gets the node reference of the disposition schedule associated with the container.
*
*
* @param nodeRef node reference of the container
* @return {@link NodeRef} node reference of the disposition schedule, null if none
*/
private NodeRef getAssociatedDispositionScheduleImpl(NodeRef nodeRef)
{
NodeRef result = null;
NodeRef result = null;
ParameterCheck.mandatory("nodeRef", nodeRef);
// Make sure we are dealing with an RM node
if (filePlanService.isFilePlanComponent(nodeRef) == false)
{
@@ -378,10 +386,10 @@ public class DispositionServiceImpl implements
result = firstChildAssocRef.getChildRef();
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#getAssociatedRecordsManagementContainer(org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule)
*/
@@ -390,7 +398,7 @@ public class DispositionServiceImpl implements
{
ParameterCheck.mandatory("dispositionSchedule", dispositionSchedule);
NodeRef result = null;
NodeRef dsNodeRef = dispositionSchedule.getNodeRef();
if (nodeService.exists(dsNodeRef) == true)
{
@@ -408,39 +416,39 @@ public class DispositionServiceImpl implements
"(dispositionScheduleNodeRef=" + dispositionSchedule.getNodeRef().toString() + ")");
}
}
// Get the container reference
ChildAssociationRef assoc = assocs.get(0);
result = assoc.getParentRef();
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#hasDisposableItems(org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule)
*/
*/
@Override
public boolean hasDisposableItems(DispositionSchedule dispositionSchdule)
public boolean hasDisposableItems(DispositionSchedule dispositionSchdule)
{
return !getDisposableItems(dispositionSchdule).isEmpty();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#getDisposableItems(org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule)
*/
public List<NodeRef> getDisposableItems(DispositionSchedule dispositionSchedule)
{
ParameterCheck.mandatory("dispositionSchedule", dispositionSchedule);
// Get the associated container
NodeRef rmContainer = getAssociatedRecordsManagementContainer(dispositionSchedule);
// Return the disposable items
return getDisposableItemsImpl(dispositionSchedule.isRecordLevelDisposition(), rmContainer);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#isDisposableItem(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -449,9 +457,9 @@ public class DispositionServiceImpl implements
{
return nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE);
}
/**
*
*
* @param isRecordLevelDisposition
* @param rmContainer
* @param root
@@ -461,13 +469,15 @@ public class DispositionServiceImpl implements
{
List<NodeRef> items = filePlanService.getAllContained(rmContainer);
List<NodeRef> result = new ArrayList<NodeRef>(items.size());
// FIXME
RecordFolderService recordFolderService = (RecordFolderService)applicationContext.getBean("RecordFolderService");
for (NodeRef item : items)
{
if (getRmService().isRecordFolder(item) == true)
{
if (recordFolderService.isRecordFolder(item) == true)
{
if (isRecordLevelDisposition == true)
{
result.addAll(getRmService().getRecords(item));
result.addAll(recordService.getRecords(item));
}
else
{
@@ -484,7 +494,7 @@ public class DispositionServiceImpl implements
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#createDispositionSchedule(org.alfresco.service.cmr.repository.NodeRef, java.util.Map)
*/
@@ -492,16 +502,16 @@ public class DispositionServiceImpl implements
public DispositionSchedule createDispositionSchedule(NodeRef nodeRef, Map<QName, Serializable> props)
{
NodeRef dsNodeRef = null;
// Check mandatory parameters
ParameterCheck.mandatory("nodeRef", nodeRef);
// Check exists
if (nodeService.exists(nodeRef) == false)
{
throw new AlfrescoRuntimeException("Unable to create disposition schedule, because node does not exist. (nodeRef=" + nodeRef.toString() + ")");
}
// Check is sub-type of rm:recordCategory
QName nodeRefType = nodeService.getType(nodeRef);
if (TYPE_RECORD_CATEGORY.equals(nodeRefType) == false &&
@@ -509,18 +519,18 @@ public class DispositionServiceImpl implements
{
throw new AlfrescoRuntimeException("Unable to create disposition schedule on a node that is not a records management container.");
}
behaviourFilter.disableBehaviour(nodeRef, ASPECT_SCHEDULED);
try
{
{
// Add the schedules aspect if required
if (nodeService.hasAspect(nodeRef, ASPECT_SCHEDULED) == false)
{
nodeService.addAspect(nodeRef, ASPECT_SCHEDULED, null);
}
// Check whether there is already a disposition schedule object present
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL);
// Check whether there is already a disposition schedule object present
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL);
if (assocs.size() == 0)
{
DispositionSchedule currentDispositionSchdule = getDispositionSchedule(nodeRef);
@@ -532,15 +542,15 @@ public class DispositionServiceImpl implements
throw new AlfrescoRuntimeException("Can not create a disposition schedule if there are disposable items already under the control of an other disposition schedule");
}
}
// Create the disposition schedule object
dsNodeRef = nodeService.createNode(
nodeRef,
ASSOC_DISPOSITION_SCHEDULE,
nodeRef,
ASSOC_DISPOSITION_SCHEDULE,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName("dispositionSchedule")),
TYPE_DISPOSITION_SCHEDULE,
props).getChildRef();
}
}
else
{
// Error since the node already has a disposition schedule set
@@ -551,15 +561,15 @@ public class DispositionServiceImpl implements
{
behaviourFilter.enableBehaviour(nodeRef, ASPECT_SCHEDULED);
}
// Create the return object
// Create the return object
return new DispositionScheduleImpl(serviceRegistry, nodeService, dsNodeRef);
}
/** ========= Disposition Action Definition Methods ========= */
/**
*
*
*/
public DispositionActionDefinition addDispositionActionDefinition(
DispositionSchedule schedule,
@@ -571,22 +581,22 @@ public class DispositionServiceImpl implements
{
throw new IllegalArgumentException("'name' parameter is mandatory when creating a disposition action definition");
}
// TODO: also check the action name is valid?
// create the child association from the schedule to the action definition
NodeRef actionNodeRef = this.nodeService.createNode(schedule.getNodeRef(),
RecordsManagementModel.ASSOC_DISPOSITION_ACTION_DEFINITIONS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
NodeRef actionNodeRef = this.nodeService.createNode(schedule.getNodeRef(),
RecordsManagementModel.ASSOC_DISPOSITION_ACTION_DEFINITIONS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
QName.createValidLocalName(name)),
RecordsManagementModel.TYPE_DISPOSITION_ACTION_DEFINITION, actionDefinitionParams).getChildRef();
// get the updated disposition schedule and retrieve the new action definition
NodeRef scheduleParent = this.nodeService.getPrimaryParent(schedule.getNodeRef()).getParentRef();
DispositionSchedule updatedSchedule = this.getDispositionSchedule(scheduleParent);
return updatedSchedule.getDispositionActionDefinition(actionNodeRef.getId());
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#removeDispositionActionDefinition(org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule, org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition)
*/
@@ -595,79 +605,79 @@ public class DispositionServiceImpl implements
// check first whether action definitions can be removed
if (hasDisposableItems(schedule) == true)
{
throw new AlfrescoRuntimeException("Can not remove action definitions from schedule '" +
throw new AlfrescoRuntimeException("Can not remove action definitions from schedule '" +
schedule.getNodeRef() + "' as one or more record or record folders are present.");
}
// remove the child node representing the action definition
this.nodeService.removeChild(schedule.getNodeRef(), actionDefinition.getNodeRef());
}
/**
* Updates the given disposition action definition belonging to the given disposition
* schedule.
*
*
* @param schedule The DispositionSchedule the action belongs to
* @param actionDefinition The DispositionActionDefinition to update
* @param actionDefinitionParams Map of parameters to use to update the action definition
* @return The updated DispositionActionDefinition
*/
public DispositionActionDefinition updateDispositionActionDefinition(
DispositionActionDefinition actionDefinition,
DispositionActionDefinition actionDefinition,
Map<QName, Serializable> actionDefinitionParams)
{
// update the node with properties
this.nodeService.addProperties(actionDefinition.getNodeRef(), actionDefinitionParams);
// get the updated disposition schedule and retrieve the updated action definition
NodeRef ds = this.nodeService.getPrimaryParent(actionDefinition.getNodeRef()).getParentRef();
DispositionSchedule updatedSchedule = new DispositionScheduleImpl(serviceRegistry, nodeService, ds);
return updatedSchedule.getDispositionActionDefinition(actionDefinition.getId());
}
return updatedSchedule.getDispositionActionDefinition(actionDefinition.getId());
}
/** ========= Disposition Action Methods ========= */
/**
* Initialises the details of the next disposition action based on the details of a disposition
* action definition.
*
*
* @param nodeRef node reference
* @param dispositionActionDefinition disposition action definition
*/
private void initialiseDispositionAction(NodeRef nodeRef, DispositionActionDefinition dispositionActionDefinition)
{
{
// Create the properties
Map<QName, Serializable> props = new HashMap<QName, Serializable>(10);
// Calculate the asOf date
Date asOfDate = null;
Period period = dispositionActionDefinition.getPeriod();
if (period != null)
{
Date contextDate = null;
// Get the period properties value
QName periodProperty = dispositionActionDefinition.getPeriodProperty();
if (periodProperty != null)
{
// doesn't matter if the period property isn't set ... the asOfDate will get updated later
// when the value of the period property is set
contextDate = (Date)this.nodeService.getProperty(nodeRef, periodProperty);
contextDate = (Date)this.nodeService.getProperty(nodeRef, periodProperty);
}
else
{
// for now use 'NOW' as the default context date
// for now use 'NOW' as the default context date
// TODO set the default period property ... cut off date or last disposition date depending on context
contextDate = new Date();
}
// Calculate the as of date
if (contextDate != null)
{
asOfDate = period.getNextDate(contextDate);
}
}
}
// Set the property values
props.put(PROP_DISPOSITION_ACTION_ID, dispositionActionDefinition.getId());
props.put(PROP_DISPOSITION_ACTION, dispositionActionDefinition.getName());
@@ -675,27 +685,27 @@ public class DispositionServiceImpl implements
{
props.put(PROP_DISPOSITION_AS_OF, asOfDate);
}
// Create a new disposition action object
NodeRef dispositionActionNodeRef = this.nodeService.createNode(
nodeRef,
ASSOC_NEXT_DISPOSITION_ACTION,
ASSOC_NEXT_DISPOSITION_ACTION,
nodeRef,
ASSOC_NEXT_DISPOSITION_ACTION,
ASSOC_NEXT_DISPOSITION_ACTION,
TYPE_DISPOSITION_ACTION,
props).getChildRef();
props).getChildRef();
// Create the events
List<RecordsManagementEvent> events = dispositionActionDefinition.getEvents();
for (RecordsManagementEvent event : events)
{
// For every event create an entry on the action
createEvent(event, dispositionActionNodeRef);
}
}
}
/**
* Creates the given records management event for the given 'next action'.
*
*
* @param event The event to create
* @param nextActionNodeRef The next action node
* @return The created event NodeRef
@@ -703,31 +713,31 @@ public class DispositionServiceImpl implements
private NodeRef createEvent(RecordsManagementEvent event, NodeRef nextActionNodeRef)
{
NodeRef eventNodeRef = null;
Map<QName, Serializable> eventProps = new HashMap<QName, Serializable>(7);
eventProps.put(PROP_EVENT_EXECUTION_NAME, event.getName());
// TODO display label
RecordsManagementEventType eventType = serviceRegistry.getRecordsManagementEventService().getEventType(event.getType());
eventProps.put(PROP_EVENT_EXECUTION_AUTOMATIC, eventType.isAutomaticEvent());
eventProps.put(PROP_EVENT_EXECUTION_COMPLETE, false);
// Create the event execution object
this.nodeService.createNode(nextActionNodeRef,
this.nodeService.createNode(nextActionNodeRef,
ASSOC_EVENT_EXECUTIONS,
ASSOC_EVENT_EXECUTIONS,
TYPE_EVENT_EXECUTION,
ASSOC_EVENT_EXECUTIONS,
TYPE_EVENT_EXECUTION,
eventProps);
return eventNodeRef;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#isNextDispositionActionEligible(org.alfresco.service.cmr.repository.NodeRef)
*/
public boolean isNextDispositionActionEligible(NodeRef nodeRef)
{
boolean result = false;
// Get the disposition instructions
DispositionSchedule di = getDispositionSchedule(nodeRef);
NodeRef nextDa = getNextDispositionActionNodeRef(nodeRef);
@@ -742,7 +752,7 @@ public class DispositionServiceImpl implements
{
result = true;
}
if (result == false)
{
DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa);
@@ -750,7 +760,7 @@ public class DispositionServiceImpl implements
if (dad != null)
{
boolean firstComplete = dad.eligibleOnFirstCompleteEvent();
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(nextDa, ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
@@ -760,7 +770,7 @@ public class DispositionServiceImpl implements
if (isCompleteValue != null)
{
isComplete = isCompleteValue.booleanValue();
// implement AND and OR combination of event completions
if (isComplete == true)
{
@@ -783,13 +793,13 @@ public class DispositionServiceImpl implements
}
}
}
return result;
}
/**
* Get the next disposition action node. Null if none present.
*
*
* @param nodeRef the disposable node reference
* @return NodeRef the next disposition action, null if none
*/
@@ -803,7 +813,7 @@ public class DispositionServiceImpl implements
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#getNextDispositionAction(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -818,23 +828,23 @@ public class DispositionServiceImpl implements
}
return result;
}
/** ========= Disposition Action History Methods ========= */
public List<DispositionAction> getCompletedDispositionActions(NodeRef nodeRef)
{
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_ACTION_HISTORY, RegexQNamePattern.MATCH_ALL);
List<DispositionAction> result = new ArrayList<DispositionAction>(assocs.size());
List<DispositionAction> result = new ArrayList<DispositionAction>(assocs.size());
for (ChildAssociationRef assoc : assocs)
{
NodeRef dispositionActionNodeRef = assoc.getChildRef();
result.add(new DispositionActionImpl(serviceRegistry, dispositionActionNodeRef));
}
}
return result;
}
public DispositionAction getLastCompletedDispostionAction(NodeRef nodeRef)
{
DispositionAction result = null;
@@ -843,7 +853,17 @@ public class DispositionServiceImpl implements
{
// Get the last disposition action in the list
result = list.get(list.size()-1);
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService#isCutoff(NodeRef)
*/
@Override
public boolean isCutoff(NodeRef nodeRef)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
return nodeService.hasAspect(nodeRef, ASPECT_CUT_OFF);
}
}

View File

@@ -30,7 +30,6 @@ import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.metadata.RFC822MetadataExtracter;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
@@ -86,8 +85,6 @@ public class CustomEmailMappingServiceImpl extends AbstractLifecycleBean impleme
/** Services */
private NodeService nodeService;
private NamespacePrefixResolver nspr;
@SuppressWarnings("unused")
private PolicyComponent policyComponent;
private ContentService contentService;
private TransactionService transactionService;
@@ -97,14 +94,6 @@ public class CustomEmailMappingServiceImpl extends AbstractLifecycleBean impleme
/** List of email mapping keys */
private List<String> emailMappingKeys;
/**
* @param policyComponent policy component
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* @param nspr namespace service
*/

View File

@@ -25,53 +25,40 @@ import java.util.List;
import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.OnCreateReference;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.action.impl.CompleteEventAction;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
/**
* On reference create event type
*
*
* @author Roy Wetherall
*/
public class OnReferenceCreateEventType extends SimpleRecordsManagementEventTypeImpl
implements RecordsManagementModel,
OnCreateReference
{
/** Records management service */
@SuppressWarnings("unused")
private RecordsManagementService recordsManagementService;
/** Records management action service */
private RecordsManagementActionService recordsManagementActionService;
/** Disposition service */
private DispositionService dispositionService;
/** Policy component */
private PolicyComponent policyComponent;
/** Reference */
private QName reference;
/**
* @param recordsManagementService the records management service to set
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param dispositionService the disposition service to set
*/
@@ -79,7 +66,7 @@ public class OnReferenceCreateEventType extends SimpleRecordsManagementEventType
{
this.dispositionService = dispositionService;
}
/**
* @param recordsManagementActionService the recordsManagementActionService to set
*/
@@ -87,37 +74,37 @@ public class OnReferenceCreateEventType extends SimpleRecordsManagementEventType
{
this.recordsManagementActionService = recordsManagementActionService;
}
/**
* Set policy components
*
*
* @param policyComponent policy component
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* Set the reference
*
*
* @param reference
*/
public void setReferenceName(String reference)
{
this.reference = QName.createQName(reference);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.event.SimpleRecordsManagementEventTypeImpl#init()
*/
public void init()
{
super.init();
// Register interest in the on create reference policy
policyComponent.bindClassBehaviour(RecordsManagementPolicies.ON_CREATE_REFERENCE,
ASPECT_RECORD,
policyComponent.bindClassBehaviour(RecordsManagementPolicies.ON_CREATE_REFERENCE,
ASPECT_RECORD,
new JavaBehaviour(this, "onCreateReference", NotificationFrequency.TRANSACTION_COMMIT));
}
@@ -129,7 +116,7 @@ public class OnReferenceCreateEventType extends SimpleRecordsManagementEventType
{
return true;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.OnCreateReference#onCreateReference(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
*/
@@ -158,18 +145,18 @@ public class OnReferenceCreateEventType extends SimpleRecordsManagementEventType
params.put(CompleteEventAction.PARAM_EVENT_COMPLETED_BY, AuthenticationUtil.getFullyAuthenticatedUser());
params.put(CompleteEventAction.PARAM_EVENT_COMPLETED_AT, new Date());
recordsManagementActionService.executeRecordsManagementAction(toNodeRef, "completeEvent", params);
break;
}
}
}
}
return null;
}
}
};
AuthenticationUtil.runAs(work, AuthenticationUtil.getAdminUserName());
}
}

View File

@@ -24,18 +24,18 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.action.impl.CompleteEventAction;
import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
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.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
@@ -46,48 +46,40 @@ import org.alfresco.service.namespace.RegexQNamePattern;
/**
* Behaviour executed when a references record is actioned upon.
*
*
* @author Roy Wetherall
*/
public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEventTypeImpl
implements RecordsManagementModel
{
/** Records management service */
private RecordsManagementService recordsManagementService;
/** Disposition service */
private DispositionService dispositionService;
/** Records management action service */
private RecordsManagementActionService recordsManagementActionService;
/** Records management admin service */
private RecordsManagementAdminService recordsManagementAdminService;
/** Node service */
private NodeService nodeService;
/** Policy component */
private PolicyComponent policyComponent;
/** Record service */
private RecordService recordService;
/** Record folder service */
private RecordFolderService recordFolderService;
/** Action name */
private String actionName;
/** Reference */
private QName reference;
/**
* @param recordsManagementService the records management service to set
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param dispositionService the disposition service
*/
@@ -95,7 +87,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.dispositionService = dispositionService;
}
/**
* @param recordsManagementActionService the recordsManagementActionService to set
*/
@@ -103,7 +95,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.recordsManagementActionService = recordsManagementActionService;
}
/**
* @param recordsManagementAdminService record management admin service
*/
@@ -111,7 +103,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.recordsManagementAdminService = recordsManagementAdminService;
}
/**
* @param nodeService node service
*/
@@ -119,7 +111,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.nodeService = nodeService;
}
/**
* @param recordService record service
*/
@@ -127,7 +119,15 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.recordService = recordService;
}
/**
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @param policyComponent policy component
*/
@@ -135,7 +135,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.policyComponent = policyComponent;
}
/**
* @param reference reference name
*/
@@ -143,7 +143,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.reference = QName.createQName(reference);
}
/**
* @param actionName action name
*/
@@ -151,17 +151,17 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
this.actionName = actionName;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.event.SimpleRecordsManagementEventTypeImpl#init()
*/
public void init()
{
super.init();
// Register interest in the on create reference policy
policyComponent.bindClassBehaviour(RecordsManagementPolicies.BEFORE_RM_ACTION_EXECUTION,
ASPECT_FILE_PLAN_COMPONENT,
policyComponent.bindClassBehaviour(RecordsManagementPolicies.BEFORE_RM_ACTION_EXECUTION,
ASPECT_FILE_PLAN_COMPONENT,
new JavaBehaviour(this, "beforeActionExecution", NotificationFrequency.FIRST_EVENT));
}
@@ -173,10 +173,10 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
{
return true;
}
/**
* Before action exeuction behaviour.
*
*
* @param nodeRef
* @param name
* @param parameters
@@ -206,32 +206,32 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
}
}
}
return null;
}
}
};
AuthenticationUtil.runAs(work, AuthenticationUtil.getAdminUserName());
}
private void processRecordFolder(NodeRef recordFolder)
{
if (recordService.isRecord(recordFolder) == true)
{
processRecord(recordFolder);
}
else if (recordsManagementService.isRecordFolder(recordFolder) == true)
else if (recordFolderService.isRecordFolder(recordFolder) == true)
{
for (NodeRef record : recordsManagementService.getRecords(recordFolder))
for (NodeRef record : recordService.getRecords(recordFolder))
{
processRecord(record);
}
}
}
private void processRecord(NodeRef record)
{
{
List<AssociationRef> fromAssocs = recordsManagementAdminService.getCustomReferencesFrom(record);
for (AssociationRef fromAssoc : fromAssocs)
{
@@ -241,7 +241,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
doEventComplete(nodeRef);
}
}
List<AssociationRef> toAssocs = recordsManagementAdminService.getCustomReferencesTo(record);
for (AssociationRef toAssoc : toAssocs)
{
@@ -250,9 +250,9 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
NodeRef nodeRef = toAssoc.getSourceRef();
doEventComplete(nodeRef);
}
}
}
}
private void doEventComplete(NodeRef nodeRef)
{
DispositionAction da = dispositionService.getNextDispositionAction(nodeRef);
@@ -271,7 +271,7 @@ public class OnReferencedRecordActionedUpon extends SimpleRecordsManagementEvent
params.put(CompleteEventAction.PARAM_EVENT_COMPLETED_BY, AuthenticationUtil.getFullyAuthenticatedUser());
params.put(CompleteEventAction.PARAM_EVENT_COMPLETED_AT, new Date());
recordsManagementActionService.executeRecordsManagementAction(nodeRef, "completeEvent", params);
break;
}
}

View File

@@ -18,44 +18,38 @@
*/
package org.alfresco.module.org_alfresco_module_rm.event;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.surf.util.I18NUtil;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Simple records management event type implementation
*
*
* @author Roy Wetherall
*/
public class SimpleRecordsManagementEventTypeImpl implements RecordsManagementEventType, BeanNameAware
{
/** Logger */
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(SimpleRecordsManagementEventTypeImpl.class);
/** Display label lookup prefix */
protected static final String LOOKUP_PREFIX = "rmeventservice.";
/** Name */
public static final String NAME = "rmEventType.simple";
/** Records management event service */
protected RecordsManagementEventService recordsManagementEventService;
/** Name */
protected String name;
/**
* Set the records management event service
*
*
* @param recordsManagementEventService records management service
*/
public void setRecordsManagementEventService(RecordsManagementEventService recordsManagementEventService)
{
this.recordsManagementEventService = recordsManagementEventService;
}
/**
* Initialisation method
*/
@@ -63,7 +57,7 @@ public class SimpleRecordsManagementEventTypeImpl implements RecordsManagementEv
{
recordsManagementEventService.registerEventType(this);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventType#isAutomaticEvent()
*/
@@ -87,7 +81,7 @@ public class SimpleRecordsManagementEventTypeImpl implements RecordsManagementEv
{
this.name = name;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventType#getDisplayLabel()
*/

View File

@@ -23,7 +23,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.QName;
@@ -32,26 +31,26 @@ import com.hazelcast.impl.Node;
/**
* File plan service interface.
*
*
* @author Roy Wetherall
* @since 2.1
*/
public interface FilePlanService
{
/**
* Default RM site id.
* Can be used with {@link FilePlanService#getFilePlanBySiteId(String)} to get the file plan node.
/**
* Default RM site id.
* Can be used with {@link FilePlanService#getFilePlanBySiteId(String)} to get the file plan node.
* */
public static final String DEFAULT_RM_SITE_ID = "rm";
/**
* Indicates whether the given node is a file plan component or not.
*
*
* @param nodeRef node reference
* @return boolean true if a file plan component, false otherwise
*/
boolean isFilePlanComponent(NodeRef nodeRef);
/**
* Returns the 'kind' of file plan component the node reference is.
* <p>
@@ -62,260 +61,254 @@ public interface FilePlanService
* @return FilePlanComponentKind the kind of file plan component the node is
*/
FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef);
/**
* Returns the file plan component 'kind' that relates to the passed
* Returns the file plan component 'kind' that relates to the passed
* content type.
* <p>
* Returns null if the type does not relate to a file plan component.
*
* @param type qualified name of content type
*
* @param type qualified name of content type
* @return FilePlanComponentKind the kind relating to the passed type
*/
FilePlanComponentKind getFilePlanComponentKindFromType(QName type);
/**
* Indicates whether the given node is file plan node or not.
*
*
* @param nodeRef node reference
* @return boolean true if node is a file plan node
*/
boolean isFilePlan(NodeRef nodeRef);
/**
* Gets all the file plan nodes.
* Looks in the SpacesStore by default.
*
* Looks in the SpacesStore by default.
*
* @return Set<NodeRef> set of file plan nodes
*/
Set<NodeRef> getFilePlans();
/**
* Getse all the file plan nodes in a store.
*
*
* @param storeRef store reference
* @return Set<NodeRef> set of file plan nodes
*/
Set<NodeRef> getFilePlans(StoreRef storeRef);
/**
* Gets the file plan the node is in.
*
* @return {@link NodeRef} file node reference, null if none
*
* @return {@link NodeRef} file node reference, null if none
*/
NodeRef getFilePlan(NodeRef nodeRef);
/**
* Gets a file plan by site id. Assumes the site is a RM site and that the file plan node, ie
* the document library container, has been already created. Otherwise returns null.
*
*
* @param siteId records management site id
* @return NodeRef file plan, null if can't be found
*/
NodeRef getFilePlanBySiteId(String siteId);
/**
* Indicates whether the unfiled container exists for a given file plan or not.
*
*
* @param filePlan file plan
* @return boolean true if unfiled container exists, false otherwise
*/
boolean existsUnfiledContainer(NodeRef filePlan);
/**
* Gets the unfiled container for a given file plan. Returns null if
* none.
*
*
* @param filePlan file plan
* @return {@link NodeRef} unfiled container, null if none
*/
NodeRef getUnfiledContainer(NodeRef filePlan);
/**
* Creates, and returns, a unfiled container for a given file plan.
*
*
* @param filePlan file plan
* @return {@link Node} unfiled container
*/
NodeRef createUnfiledContainer(NodeRef filePlan);
/**
*
*
* @param filePlan
* @return
*/
NodeRef getHoldContainer(NodeRef filePlan);
/**
*
*
* @param filePlan
* @return
*/
NodeRef createHoldContainer(NodeRef filePlan);
/**
*
*
* @param filePlan
* @return
*/
NodeRef getTransferContainer(NodeRef filePlan);
/**
*
*
* @param filePlan
* @return
*/
NodeRef createTransferContainer(NodeRef filePlan);
/**
* Creates a file plan as a child of the given parent node, with the name
* provided.
*
*
* @param parent parent node reference
* @param name file plan name
* @param name file plan name
* @param type type, must be rma:filePlan or sub-type of
* @return NodeRef file plan node reference
*/
NodeRef createFilePlan(NodeRef parent, String name, QName type);
/**
* Specifies the properties to be set on the created file plan.
*
*
* @see #createFilePlan(NodeRef, String, QName)
*
*
* @param parent parent node reference
* @param name file plan name
* @param name file plan name
* @param type type, must be rma:filePlan or sub-type of
* @param properties file plan properties
* @return NodeRef file plan node reference
*/
NodeRef createFilePlan(NodeRef parent, String name, QName type, Map<QName, Serializable> properties);
/**
* Creates a file plan with the default type.
*
*
* @see #createFilePlan(NodeRef, String, QName)
*
*
* @param parent parent node reference
* @param name file plan name
* @return NodeRef file plan node reference
*/
NodeRef createFilePlan(NodeRef parent, String name);
/**
* Creates a file plan with the default type, specifying properties.
*
*
* @see #createFilePlan(NodeRef, String, QName)
*
*
* @param parent parent node reference
* @param name file plan name
* @param properties file plan properties
* @return NodeRef file plan node reference
*/
NodeRef createFilePlan(NodeRef parent, String name, Map<QName, Serializable> properties);
// TODO deleteFilePlan
/**
* Gets the <b>NodeRef</b> sequence from the {@link #getFilePlan(NodeRef) root}
* down to the fileplan component given. The array will start with the <b>NodeRef</b> of the root
* and end with the name of the fileplan component node given.
*
*
* @param nodeRef a fileplan component
* @return Returns a <b>NodeRef</b> path starting with the file plan
*/
List<NodeRef> getNodeRefPath(NodeRef nodeRef);
/**
* Indicates whether the given node is a file plan container or not.
* <p>
* This includes file plan and record category nodes.
*
*
* @param nodeRef node reference
* @return boolean true if node is a file plan container, false otherwise.
*/
boolean isFilePlanContainer(NodeRef nodeRef);
/**
* Indicates whether the given node is a record category or not.
*
*
* @param nodeRef node reference
* @return boolean true if records category, false otherwise
*/
boolean isRecordCategory(NodeRef nodeRef);
/**
* Get all the items contained within a container. This will include record folders and other record categories.
*
*
* @param recordCategory record category node reference
* @param deep if true then return all children including sub-categories and their children in turn, if false then just
* return the immediate children
* @return {@link List}<{@link NodeRef>} list of contained node references
*/
List<NodeRef> getAllContained(NodeRef recordCategory, boolean deep);
/**
* Only return the immediate children.
*
* @see RecordsManagementService#getAllContained(NodeRef, boolean)
*
*
* @param recordCategory record category node reference
* @return {@link List}<{@link NodeRef>} list of contained node references
*/
List<NodeRef> getAllContained(NodeRef recordCategory);
List<NodeRef> getAllContained(NodeRef recordCategory);
/**
* Get all the record categories within a record category.
*
*
* @param recordCategory record category node reference
* @param deep if true then return all children including sub-categories and their children in turn, if false then just
* return the immediate children
* @return {@link List}<{@link NodeRef>} list of container node references
*/
List<NodeRef> getContainedRecordCategories(NodeRef recordCategory, boolean deep);
/**
* Only return immediate children.
*
* @see RecordsManagementService#getContainedRecordCategories(NodeRef, boolean)
*
*
* @param recordCategory container node reference
* @return {@link List}<{@link NodeRef>} list of container node references
*/
List<NodeRef> getContainedRecordCategories(NodeRef recordCategory);
/**
* Get all the record folders contained within a container
*
*
* @param container container node reference
* @param deep if true then return all children including sub-containers and their children in turn, if false then just
* return the immediate children
* @return {@link List}<{@link NodeRef>} list of record folder node references
*/
List<NodeRef> getContainedRecordFolders(NodeRef container, boolean deep);
/**
* Only return immediate children.
*
* @see RecordsManagementService#getContainedRecordFolders(NodeRef, boolean)
*
*
* @param container container node reference
* @return {@link List}<{@link NodeRef>} list of record folder node references
*/
List<NodeRef> getContainedRecordFolders(NodeRef container);
/**
* Create a record category.
*
*
* @param parent parent node reference, must be a record category or file plan.
* @param name name of the new record category
* @param type type of container to create, must be a sub-type of rm:recordCategory
* @return NodeRef node reference of the created record category
*/
NodeRef createRecordCategory(NodeRef parent, String name, QName type);
/**
*
*
* @param parent
* @param name
* @param type
@@ -323,20 +316,18 @@ public interface FilePlanService
* @return
*/
NodeRef createRecordCategory(NodeRef parent, String name, QName type, Map<QName, Serializable> properties);
/**
* Creates a record category of type rma:recordCategory
*
* @see RecordsManagementService#createRecordCategory(NodeRef, String, QName)
*
*
* @param parent parent node reference, must be a record category or file plan.
* @param name name of the record category
* @return NodeRef node reference of the created record category
*/
NodeRef createRecordCategory(NodeRef parent, String name);
/**
*
*
* @param parent
* @param name
* @param properties

View File

@@ -59,12 +59,12 @@ import org.springframework.extensions.surf.util.I18NUtil;
/**
* File plan service implementation.
*
*
* @author Roy Wetherall
* @since 2.1
*/
public class FilePlanServiceImpl extends ServiceBaseImpl
implements FilePlanService,
implements FilePlanService,
RecordsManagementModel,
ApplicationContextAware
{
@@ -77,18 +77,18 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
private final static String MSG_CONTAINER_PARENT_TYPE= "rm.service.container-parent-type";
private final static String MSG_CONTAINER_TYPE = "rm.service.container-type";
private final static String MSG_CONTAINER_EXPECTED = "rm.service.container-expected";
/** File plan containers */
private static final String NAME_UNFILED_CONTAINER = "Unfiled Records";
private static final String NAME_HOLD_CONTAINER = "Holds";
private static final String NAME_TRANSFER_CONTAINER = "Transfers";
/** RM site file plan container */
private static final String FILE_PLAN_CONTAINER = "documentLibrary";
/** Application context */
private ApplicationContext applicationContext;
/**
* @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext)
*/
@@ -97,50 +97,50 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
this.applicationContext = applicationContext;
}
/**
* NOTE: for some reason spring couldn't cope with the circular references between these two
* NOTE: for some reason spring couldn't cope with the circular references between these two
* beans so we need to grab this one manually.
*
*
* @return file plan role service
*/
protected FilePlanRoleService getFilePlanRoleService()
{
return (FilePlanRoleService)applicationContext.getBean("FilePlanRoleService");
return (FilePlanRoleService)applicationContext.getBean("FilePlanRoleService");
}
/**
* @return permission service
*/
protected PermissionService getPermissionService()
{
return (PermissionService)applicationContext.getBean("permissionService");
return (PermissionService)applicationContext.getBean("permissionService");
}
/**
* @return node DAO
*/
protected NodeDAO getNodeDAO()
{
return (NodeDAO)applicationContext.getBean("nodeDAO");
return (NodeDAO)applicationContext.getBean("nodeDAO");
}
/**
* @return internal node service
*/
protected NodeService getInternalNodeService()
{
return (NodeService)applicationContext.getBean("nodeService");
return (NodeService)applicationContext.getBean("nodeService");
}
/**
* @return site service
*/
protected SiteService getSiteService()
{
return (SiteService)applicationContext.getBean("SiteService");
return (SiteService)applicationContext.getBean("SiteService");
}
/**
* @return record service
*/
@@ -148,7 +148,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return (RecordService)applicationContext.getBean("RecordService");
}
/**
* @return record folder service
*/
@@ -156,7 +156,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return (RecordFolderService)applicationContext.getBean("RecordFolderService");
}
/**
* @return freeze service
*/
@@ -164,7 +164,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return (FreezeService)applicationContext.getBean("FreezeService");
}
/**
* @return records management service
*/
@@ -172,7 +172,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return (RecordsManagementService)applicationContext.getBean("RecordsManagementService");
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -186,18 +186,18 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef)
*/
public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef)
{
FilePlanComponentKind result = null;
if (isFilePlanComponent(nodeRef) == true)
{
result = FilePlanComponentKind.FILE_PLAN_COMPONENT;
if (isFilePlan(nodeRef) == true)
{
result = FilePlanComponentKind.FILE_PLAN;
@@ -206,7 +206,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
result = FilePlanComponentKind.RECORD_CATEGORY;
}
else if (getRecordsManagementService().isRecordFolder(nodeRef) == true)
else if (getRecordFolderService().isRecordFolder(nodeRef) == true)
{
result = FilePlanComponentKind.RECORD_FOLDER;
}
@@ -231,18 +231,18 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
result = FilePlanComponentKind.UNFILED_RECORD_CONTAINER;
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getFilePlanComponentKindFromType(org.alfresco.service.namespace.QName)
* @see FilePlanService#getFilePlanComponentKindFromType(QName)
*/
@Override
public FilePlanComponentKind getFilePlanComponentKindFromType(QName type)
{
FilePlanComponentKind result = null;
if (ASPECT_FILE_PLAN_COMPONENT.equals(type) == true)
{
result = FilePlanComponentKind.FILE_PLAN_COMPONENT;
@@ -271,15 +271,15 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
result = FilePlanComponentKind.TRANSFER;
}
else if (dictionaryService.isSubClass(type, TYPE_DISPOSITION_SCHEDULE) == true ||
else if (dictionaryService.isSubClass(type, TYPE_DISPOSITION_SCHEDULE) == true ||
dictionaryService.isSubClass(type, TYPE_DISPOSITION_ACTION_DEFINITION) == true)
{
result = FilePlanComponentKind.DISPOSITION_SCHEDULE;
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -287,7 +287,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return instanceOf(nodeRef, TYPE_FILE_PLAN);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlans()
*/
@@ -296,7 +296,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getFilePlans(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlans(org.alfresco.service.cmr.repository.StoreRef)
*/
@@ -304,34 +304,34 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
public Set<NodeRef> getFilePlans(final StoreRef storeRef)
{
ParameterCheck.mandatory("storeRef", storeRef);
final Set<NodeRef> results = new HashSet<NodeRef>();
Set<QName> aspects = new HashSet<QName>(1);
aspects.add(ASPECT_RECORDS_MANAGEMENT_ROOT);
getNodeDAO().getNodesWithAspects(aspects, Long.MIN_VALUE, Long.MAX_VALUE, new NodeDAO.NodeRefQueryCallback()
{
{
@Override
public boolean handle(Pair<Long, NodeRef> nodePair)
{
NodeRef nodeRef = nodePair.getSecond();
if (storeRef.equals(nodeRef.getStoreRef()) == true)
{
{
results.add(nodeRef);
}
return true;
}
});
return results;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlan(org.alfresco.service.cmr.repository.NodeRef)
*/
@Override
public NodeRef getFilePlan(NodeRef nodeRef)
{
NodeRef result = null;
NodeRef result = null;
if (nodeRef != null)
{
result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF);
@@ -350,19 +350,19 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
}
}
}
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlanBySiteId(java.lang.String)
*/
@Override
public NodeRef getFilePlanBySiteId(String siteId)
{
NodeRef filePlan = null;
NodeRef filePlan = null;
SiteInfo siteInfo = getSiteService().getSite(siteId);
if (siteInfo != null)
{
@@ -375,10 +375,10 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
}
}
}
return filePlan;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#existsUnfiledContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -386,8 +386,8 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
public boolean existsUnfiledContainer(NodeRef filePlan)
{
return (getUnfiledContainer(filePlan) != null);
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getUnfiledContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -396,7 +396,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getFilePlanRootContainer(filePlan, NAME_UNFILED_CONTAINER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getHoldContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -405,7 +405,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getFilePlanRootContainer(filePlan, NAME_HOLD_CONTAINER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getTransferContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -414,9 +414,9 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getFilePlanRootContainer(filePlan, NAME_TRANSFER_CONTAINER);
}
/**
*
*
* @param filePlan
* @param containerName
* @return
@@ -430,7 +430,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
}
NodeRef result = null;
// try and get the unfiled record container
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(filePlan, ContentModel.ASSOC_CONTAINS, QName.createQName(RM_URI, containerName));
if (assocs.size() > 1)
@@ -441,18 +441,18 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
result = assocs.get(0).getChildRef();
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createUnfiledContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
public NodeRef createUnfiledContainer(NodeRef filePlan)
{
{
return createFilePlanRootContainer(filePlan, TYPE_UNFILED_RECORD_CONTAINER, NAME_UNFILED_CONTAINER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createHoldContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -461,7 +461,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createFilePlanRootContainer(filePlan, TYPE_HOLD_CONTAINER, NAME_HOLD_CONTAINER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createTransferContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -470,9 +470,9 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createFilePlanRootContainer(filePlan, TYPE_TRANSFER_CONTAINER, NAME_TRANSFER_CONTAINER);
}
/**
*
*
* @param filePlan
* @param containerType
* @param containerName
@@ -486,9 +486,9 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
throw new AlfrescoRuntimeException("Unable to create file plan root container, because passed node is not a file plan.");
}
String allRoles = getFilePlanRoleService().getAllRolesContainerGroup(filePlan);
// create the properties map
Map<QName, Serializable> properties = new HashMap<QName, Serializable>(1);
properties.put(ContentModel.PROP_NAME, containerName);
@@ -501,7 +501,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
containerType,
properties).getChildRef();
// if (inheritPermissions == false)
// {
// set inheritance to false
@@ -510,7 +510,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
getPermissionService().setPermission(container, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true);
getPermissionService().setPermission(container, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true);
getPermissionService().setPermission(container, "Administrator", RMPermissionModel.FILING, true);
// TODO set the admin users to have filing permissions on the unfiled container!!!
// TODO we will need to be able to get a list of the admin roles from the service
// }
@@ -523,7 +523,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
return container;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map)
*/
@@ -532,21 +532,21 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
ParameterCheck.mandatory("parent", parent);
ParameterCheck.mandatory("name", name);
ParameterCheck.mandatory("type", type);
// Check the parent is not already an RM component node
// ie: you can't create a rm root in an existing rm hierarchy
if (isFilePlanComponent(parent) == true)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_DUP_ROOT));
}
// Check that the passed type is a sub-type of rma:filePlan
if (TYPE_FILE_PLAN.equals(type) == false &&
dictionaryService.isSubClass(type, TYPE_FILE_PLAN) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_ROOT_TYPE, type.toString()));
}
// Build map of properties
Map<QName, Serializable> rmRootProps = new HashMap<QName, Serializable>(1);
if (properties != null && properties.size() != 0)
@@ -554,7 +554,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
rmRootProps.putAll(properties);
}
rmRootProps.put(ContentModel.PROP_NAME, name);
// Create the root
ChildAssociationRef assocRef = nodeService.createNode(
parent,
@@ -562,12 +562,12 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name),
type,
rmRootProps);
// TODO do we need to create role and security groups or is this done automatically?
return assocRef.getChildRef();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map)
*/
@@ -575,7 +575,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createFilePlan(parent, name, TYPE_FILE_PLAN, properties);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
*/
@@ -583,7 +583,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createFilePlan(parent, name, TYPE_FILE_PLAN, null);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName)
*/
@@ -592,7 +592,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createFilePlan(parent, name, type, null);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getNodeRefPath(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -609,7 +609,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
}
return nodeRefPath;
}
/**
* Helper method to build a <b>NodeRef</b> path from the node to the RM root
*/
@@ -639,7 +639,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
getNodeRefPathRecursive(nodeRef, nodeRefPath);
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -648,7 +648,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -656,7 +656,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return instanceOf(nodeRef, TYPE_RECORD_CATEGORY);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map)
*/
@@ -665,7 +665,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
ParameterCheck.mandatory("parent", parent);
ParameterCheck.mandatory("name", name);
ParameterCheck.mandatory("type", type);
// Check that the parent is a container
QName parentType = nodeService.getType(parent);
if (TYPE_RECORDS_MANAGEMENT_CONTAINER.equals(parentType) == false &&
@@ -673,14 +673,14 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_CONTAINER_PARENT_TYPE, parentType.toString()));
}
// Check that the the provided type is a sub-type of rm:recordCategory
if (TYPE_RECORD_CATEGORY.equals(type) == false &&
dictionaryService.isSubClass(type, TYPE_RECORD_CATEGORY) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_CONTAINER_TYPE, type.toString()));
}
// Set the properties for the record category
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
if (properties != null && properties.size() != 0)
@@ -688,7 +688,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
props.putAll(properties);
}
props.put(ContentModel.PROP_NAME, name);
return nodeService.createNode(
parent,
ContentModel.ASSOC_CONTAINS,
@@ -696,7 +696,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
type,
props).getChildRef();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String)
*/
@@ -704,7 +704,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createRecordCategory(parent, name, TYPE_RECORD_CATEGORY);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map)
*/
@@ -712,7 +712,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createRecordCategory(parent, name, TYPE_RECORD_CATEGORY, properties);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName)
*/
@@ -720,7 +720,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return createRecordCategory(parent, name, type, null);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getAllContained(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -729,7 +729,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getAllContained(container, false);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getAllContained(org.alfresco.service.cmr.repository.NodeRef, boolean)
*/
@@ -738,25 +738,25 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getContained(container, null, deep);
}
/**
* Get contained nodes of a particular type. If null return all.
*
*
* @param container container node reference
* @param typeFilter type filter, null if none
* @return {@link List}<{@link NodeRef> list of contained node references
*/
private List<NodeRef> getContained(NodeRef container, QName typeFilter, boolean deep)
{
{
// Parameter check
ParameterCheck.mandatory("container", container);
// Check we have a container in our hands
if (isRecordCategory(container) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_CONTAINER_EXPECTED));
}
List<NodeRef> result = new ArrayList<NodeRef>(1);
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(container, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
@@ -769,7 +769,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
result.add(child);
}
// Inspect the containers and add children if deep
if (deep == true &&
(TYPE_RECORD_CATEGORY.equals(childType) == true ||
@@ -778,10 +778,10 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
result.addAll(getContained(child, typeFilter, deep));
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordCategories(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -790,7 +790,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getContainedRecordCategories(container, false);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordCategories(org.alfresco.service.cmr.repository.NodeRef, boolean)
*/
@@ -799,7 +799,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getContained(container, TYPE_RECORD_CATEGORY, deep);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordFolders(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -808,7 +808,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl
{
return getContainedRecordFolders(container, false);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordFolders(org.alfresco.service.cmr.repository.NodeRef, boolean)
*/

View File

@@ -22,9 +22,8 @@ import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.repo.forms.Field;
import org.alfresco.repo.forms.FieldGroup;
@@ -58,7 +57,6 @@ public abstract class RecordsManagementFormFilter<ItemType> extends AbstractFilt
protected NamespaceService namespaceService;
protected NodeService nodeService;
protected RecordsManagementServiceRegistry rmServiceRegistry;
protected RecordsManagementService rmService;
protected RecordsManagementAdminService rmAdminService;
protected RecordService recordService;
protected DictionaryService dictionaryService;
@@ -93,16 +91,6 @@ public abstract class RecordsManagementFormFilter<ItemType> extends AbstractFilt
this.rmServiceRegistry = rmServiceRegistry;
}
/**
* Sets the RecordsManagementService instance
*
* @param rmService The RecordsManagementService instance
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* Sets the RecordsManagementAdminService instance
*

View File

@@ -28,10 +28,10 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
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.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
import org.alfresco.repo.node.NodeServicePolicies;
@@ -78,21 +78,21 @@ public class FreezeServiceImpl extends ServiceBaseImpl
/** Policy Component */
protected PolicyComponent policyComponent;
/** Records Management Service */
protected RecordsManagementService recordsManagementService;
/** Record service */
protected RecordService recordService;
/** File Plan Service */
protected FilePlanService filePlanService;
/** Permission service */
protected PermissionService permissionService;
/** file plan role service */
/** File plan role service */
protected FilePlanRoleService filePlanRoleService;
/** Record folder service */
protected RecordFolderService recordFolderService;
/**
* @param policyComponent policy component
*/
@@ -101,14 +101,6 @@ public class FreezeServiceImpl extends ServiceBaseImpl
this.policyComponent = policyComponent;
}
/**
* @param recordsManagementService records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param recordService record service
*/
@@ -116,7 +108,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
{
this.recordService = recordService;
}
/**
* @param filePlanService file plan service
*/
@@ -124,31 +116,39 @@ public class FreezeServiceImpl extends ServiceBaseImpl
{
this.filePlanService = filePlanService;
}
/**
* @param permissionService permission service
*/
public void setPermissionService(PermissionService permissionService)
public void setPermissionService(PermissionService permissionService)
{
this.permissionService = permissionService;
}
/**
* @param filePlanRoleService file plan role service
*/
public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService)
public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService)
{
this.filePlanRoleService = filePlanRoleService;
}
/**
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* Init service
*/
public void init()
{
policyComponent.bindClassBehaviour(
NodeServicePolicies.BeforeDeleteNodePolicy.QNAME,
this,
NodeServicePolicies.BeforeDeleteNodePolicy.QNAME,
this,
new JavaBehaviour(this, "beforeDeleteNode", NotificationFrequency.FIRST_EVENT));
}
@@ -271,11 +271,11 @@ public class FreezeServiceImpl extends ServiceBaseImpl
// node references
// Check if the actionedUponNodeRef is a valid file plan component
boolean isRecord = recordService.isRecord(nodeRef);
boolean isFolder = recordsManagementService.isRecordFolder(nodeRef);
boolean isFolder = recordFolderService.isRecordFolder(nodeRef);
if (!(isRecord || isFolder))
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_FREEZE_ONLY_RECORDS_FOLDERS));
if (!(isRecord || isFolder))
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_FREEZE_ONLY_RECORDS_FOLDERS));
}
// Log a message about freezing the node with the reason
@@ -328,9 +328,9 @@ public class FreezeServiceImpl extends ServiceBaseImpl
}
// Mark all the folders contents as frozen
if (recordsManagementService.isRecordFolder(nodeRef))
if (recordFolderService.isRecordFolder(nodeRef))
{
List<NodeRef> records = recordsManagementService.getRecords(nodeRef);
List<NodeRef> records = recordService.getRecords(nodeRef);
for (NodeRef record : records)
{
// no need to freeze if already frozen!
@@ -394,7 +394,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
if (nodeService.hasAspect(nodeRef, ASPECT_FROZEN))
{
boolean isRecordFolder = recordsManagementService.isRecordFolder(nodeRef);
boolean isRecordFolder = recordFolderService.isRecordFolder(nodeRef);
if (logger.isDebugEnabled())
{
@@ -414,7 +414,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
// Remove freeze from records if a record folder
if (isRecordFolder)
{
List<NodeRef> records = recordsManagementService.getRecords(nodeRef);
List<NodeRef> records = recordService.getRecords(nodeRef);
for (NodeRef record : records)
{
removeFreeze(record);
@@ -608,7 +608,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
holdProps.put(ContentModel.PROP_NAME, holdName);
holdProps.put(PROP_HOLD_REASON, reason);
// create the hold object
// create the hold object
QName holdQName = QName.createQName(RM_URI, holdName);
final NodeRef holdNodeRef = nodeService.createNode(holdContainer, ContentModel.ASSOC_CONTAINS, holdQName, TYPE_HOLD, holdProps).getChildRef();
@@ -618,7 +618,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
msg.append("Created hold object '").append(holdNodeRef).append("' with name '").append(holdQName).append("'.");
logger.debug(msg.toString());
}
// Bind the hold node reference to the transaction
AlfrescoTransactionSupport.bindResource(KEY_HOLD_NODEREF, holdNodeRef);
@@ -713,7 +713,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
// parents of the folder(s).
if (recordService.isRecord(nodeRef))
{
List<NodeRef> parentFolders = recordsManagementService.getRecordFolders(nodeRef);
List<NodeRef> parentFolders = recordFolderService.getRecordFolders(nodeRef);
for (NodeRef folder : parentFolders)
{
List<ChildAssociationRef> moreAssocs = nodeService.getParentAssocs(folder, ASSOC_FROZEN_RECORDS,
@@ -755,7 +755,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
// Remove the freezes on the child records as long as there is no other
// hold referencing them
if (recordsManagementService.isRecordFolder(nodeRef) == true)
if (recordFolderService.isRecordFolder(nodeRef) == true)
{
if (logger.isDebugEnabled())
{
@@ -763,7 +763,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl
msg.append(nodeRef).append(" is a record folder");
logger.debug(msg.toString());
}
for (NodeRef record : recordsManagementService.getRecords(nodeRef))
for (NodeRef record : recordService.getRecords(nodeRef))
{
removeFreeze(record, hold);
}

View File

@@ -26,28 +26,23 @@ import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.action.impl.BroadcastDispositionActionDefinitionUpdateAction;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
/**
* Disposition action definition publish executor
*
*
* @author Roy Wetherall
*/
public class DispositionActionDefinitionPublishExecutor extends BasePublishExecutor
{
/** Node service */
private NodeService nodeService;
/** Records management action service */
private RecordsManagementActionService rmActionService;
/** Behaviour filter */
@SuppressWarnings("unused")
private BehaviourFilter behaviourFilter;
/**
* Set node service
* @param nodeService node service
@@ -56,7 +51,7 @@ public class DispositionActionDefinitionPublishExecutor extends BasePublishExecu
{
this.nodeService = nodeService;
}
/**
* Set records management service
* @param rmActionService records management service
@@ -65,16 +60,7 @@ public class DispositionActionDefinitionPublishExecutor extends BasePublishExecu
{
this.rmActionService = rmActionService;
}
/**
* Set behaviour filter
* @param behaviourFilter behaviour filter
*/
public void setBehaviourFilter(BehaviourFilter behaviourFilter)
{
this.behaviourFilter = behaviourFilter;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.job.publish.PublishExecutor#getName()
*/
@@ -96,7 +82,7 @@ public class DispositionActionDefinitionPublishExecutor extends BasePublishExecu
{
Map<String, Serializable> params = new HashMap<String, Serializable>();
params.put(BroadcastDispositionActionDefinitionUpdateAction.CHANGED_PROPERTIES, (Serializable)updatedProps);
rmActionService.executeRecordsManagementAction(nodeRef, BroadcastDispositionActionDefinitionUpdateAction.NAME, params);
rmActionService.executeRecordsManagementAction(nodeRef, BroadcastDispositionActionDefinitionUpdateAction.NAME, params);
}
}
}

View File

@@ -23,14 +23,15 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
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.freeze.FreezeService;
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.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AccessStatus;
@@ -38,60 +39,55 @@ import org.alfresco.service.namespace.NamespaceService;
/**
* Base evaluator.
*
*
* @author Roy Wetherall
*/
public abstract class BaseEvaluator implements RecordsManagementModel
{
/** Name */
protected String name;
/** JSON conversion component */
protected JSONConversionComponent jsonConversionComponent;
/** Records management service */
protected RecordsManagementService recordsManagementService;
/** Record service */
protected RecordService recordService;
/** Node service */
protected NodeService nodeService;
/** Namespace service */
protected NamespaceService namespaceService;
/** Capability service */
protected CapabilityService capabilityService;
/** Freeze service */
protected FreezeService freezeService;
/** File plan component kinds */
protected Set<FilePlanComponentKind> kinds;
protected Set<FilePlanComponentKind> kinds;
/** Capabilities */
protected List<String> capabilities;
/** File plan service */
protected FilePlanService filePlanService;
/** Disposition service */
protected DispositionService dispositionService;
/** Record folder service */
protected RecordFolderService recordFolderService;
/**
* @param jsonConversionComponent json conversion component
*/
public void setJsonConversionComponent(JSONConversionComponent jsonConversionComponent)
{
this.jsonConversionComponent = jsonConversionComponent;
}
/**
* @param recordsManagementService records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param recordService record service
*/
@@ -99,7 +95,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.recordService = recordService;
}
/**
* @param nodeService node service
*/
@@ -107,7 +103,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.nodeService = nodeService;
}
/**
* @param namespaceService namespace service
*/
@@ -115,7 +111,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.namespaceService = namespaceService;
}
/**
* @param capabilityService capability service
*/
@@ -123,7 +119,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.capabilityService = capabilityService;
}
/**
* @param freezeService freeze service
*/
@@ -131,15 +127,31 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.freezeService = freezeService;
}
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/**
* @param dispositionService disposition service
*/
public void setDispositionService(DispositionService dispositionService)
{
this.dispositionService = dispositionService;
}
/**
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @param name
*/
@@ -147,7 +159,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.name = name;
}
/**
* @return
*/
@@ -155,7 +167,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
return this.name;
}
/**
* @param kinds
*/
@@ -163,7 +175,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.kinds = kinds;
}
/**
* @param capabilties
*/
@@ -171,10 +183,10 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
this.capabilities = capabilties;
}
/**
* Helper method which sets on capability.
*
*
* @param capability capability name
*/
public void setCapability(String capability)
@@ -183,7 +195,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
list.add(capability);
this.capabilities = list;
}
/**
* Registers this instance as an indicator (evaluator)
*/
@@ -191,7 +203,7 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
jsonConversionComponent.registerIndicator(this);
}
/**
* Registers this instance as an action (evaluator)
*/
@@ -199,17 +211,17 @@ public abstract class BaseEvaluator implements RecordsManagementModel
{
jsonConversionComponent.registerAction(this);
}
/**
* Executes the evaluation.
*
*
* @param nodeRef
* @return
*/
public boolean evaluate(NodeRef nodeRef)
{
boolean result = false;
// Check that we are dealing with the correct kind of RM object
if (kinds == null || checkKinds(nodeRef) == true)
{
@@ -219,13 +231,13 @@ public abstract class BaseEvaluator implements RecordsManagementModel
result = evaluateImpl(nodeRef);
}
}
return result;
}
/**
/**
* Checks the file plan component kind.
*
*
* @param nodeRef
* @return
*/
@@ -234,10 +246,10 @@ public abstract class BaseEvaluator implements RecordsManagementModel
FilePlanComponentKind kind = filePlanService.getFilePlanComponentKind(nodeRef);
return kinds.contains(kind);
}
/**
* Checks the capabilities.
*
*
* @param nodeRef
* @return
*/
@@ -258,10 +270,10 @@ public abstract class BaseEvaluator implements RecordsManagementModel
}
return result;
}
/**
* Evaluation execution implementation.
*
*
* @param nodeRef
* @return
*/

View File

@@ -21,7 +21,6 @@ package org.alfresco.module.org_alfresco_module_rm.jscript.app;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind;
@@ -41,9 +40,6 @@ import org.json.simple.JSONObject;
*/
public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONConversionComponent
{
/** Records management service */
private RecordsManagementService recordsManagementService;
/** Record service */
private RecordService recordService;
@@ -59,14 +55,6 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC
/** Actions */
private List<BaseEvaluator> actions = new ArrayList<BaseEvaluator>();
/**
* @param recordsManagementService records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param recordService record service
*/
@@ -238,7 +226,7 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC
}
case RECORD_FOLDER:
{
if (recordsManagementService.isMetadataStub(nodeRef) == true)
if (recordService.isMetadataStub(nodeRef) == true)
{
result = "metadata-stub-folder";
}
@@ -250,7 +238,7 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC
}
case RECORD:
{
if (recordsManagementService.isMetadataStub(nodeRef) == true)
if (recordService.isMetadataStub(nodeRef) == true)
{
result = "metadata-stub";
}

View File

@@ -23,21 +23,21 @@ import org.alfresco.service.cmr.repository.NodeRef;
/**
* Cutoff indicator
*
*
* @author Roy Wetherall
*/
public class CutoffEvaluator extends BaseEvaluator
{
{
private boolean isCutoff = true;
public void setCutoff(boolean isCutoff)
{
this.isCutoff = isCutoff;
}
@Override
protected boolean evaluateImpl(NodeRef nodeRef)
{
return (recordsManagementService.isCutoff(nodeRef) == isCutoff);
return (dispositionService.isCutoff(nodeRef) == isCutoff);
}
}

View File

@@ -27,15 +27,15 @@ import org.alfresco.service.cmr.repository.NodeRef;
public class FolderOpenClosedEvaluator extends BaseEvaluator
{
private boolean expected = true;
public void setExpected(boolean expected)
{
this.expected = expected;
}
@Override
protected boolean evaluateImpl(NodeRef nodeRef)
{
return (recordsManagementService.isRecordFolderClosed(nodeRef) == expected);
return (recordFolderService.isRecordFolderClosed(nodeRef) == expected);
}
}

View File

@@ -23,13 +23,12 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionServiceImpl;
import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService;
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.RecordFolderServiceImpl;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.repo.copy.CopyBehaviourCallback;
import org.alfresco.repo.copy.CopyDetails;
import org.alfresco.repo.copy.DefaultCopyBehaviourCallback;
@@ -50,7 +49,7 @@ import org.springframework.context.ApplicationContextAware;
/**
* Class containing behaviour for the vitalRecordDefinition aspect.
*
*
* @author neilm
*/
public class RecordCopyBehaviours implements RecordsManagementModel,
@@ -58,16 +57,16 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
{
/** The policy component */
private PolicyComponent policyComponent;
/** The Behaviour Filter */
private BehaviourFilter behaviourFilter;
/** The rm service registry */
private RecordsManagementServiceRegistry rmServiceRegistry;
/** List of aspects to remove during move and copy */
private List<QName> unwantedAspects = new ArrayList<QName>(5);
/** Application context */
private ApplicationContext applicationContext;
@@ -77,32 +76,32 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
this.applicationContext = applicationContext;
}
this.applicationContext = applicationContext;
}
/**
* Set the policy component
*
*
* @param policyComponent the policy component
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* Set the behaviour Filter
*
*
* @param behaviourFilter
*/
public void setBehaviourFilter(BehaviourFilter behaviourFilter)
{
this.behaviourFilter = behaviourFilter;
}
/**
* Set the rm service registry.
*
*
* @param recordsManagementServiceRegistry the rm service registry.
*/
public void setRecordsManagementServiceRegistry(RecordsManagementServiceRegistry recordsManagementServiceRegistry)
@@ -119,7 +118,7 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
unwantedAspects.add(ASPECT_VITAL_RECORD);
unwantedAspects.add(ASPECT_DISPOSITION_LIFECYCLE);
unwantedAspects.add(RecordsManagementSearchBehaviour.ASPECT_RM_SEARCH);
// Do not copy any of the Alfresco-internal 'state' aspects
for (QName aspect : unwantedAspects)
{
@@ -132,43 +131,43 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"),
ASPECT_RECORD_COMPONENT_ID,
new JavaBehaviour(this, "getDoNothingCopyCallback"));
//On Copy we need a new ID
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onCopyComplete"),
ASPECT_RECORD_COMPONENT_ID,
new JavaBehaviour(this, "generateId", NotificationFrequency.TRANSACTION_COMMIT));
//Don't copy the Aspect Record -- it should be regenerated
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"),
ASPECT_RECORD,
ASPECT_RECORD,
new JavaBehaviour(this, "onCopyRecord"));
// Move behaviour
// Move behaviour
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onMoveNode"),
RecordsManagementModel.ASPECT_RECORD,
RecordsManagementModel.ASPECT_RECORD,
new JavaBehaviour(this, "onMoveRecordNode", NotificationFrequency.FIRST_EVENT));
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onMoveNode"),
RecordsManagementModel.TYPE_RECORD_FOLDER,
RecordsManagementModel.TYPE_RECORD_FOLDER,
new JavaBehaviour(this, "onMoveRecordFolderNode", NotificationFrequency.FIRST_EVENT));
//Copy Behaviour
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"),
RecordsManagementModel.TYPE_RECORD_FOLDER,
QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"),
RecordsManagementModel.TYPE_RECORD_FOLDER,
new JavaBehaviour(this, "onCopyRecordFolderNode"));
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"),
RecordsManagementModel.TYPE_RECORD_CATEGORY,
QName.createQName(NamespaceService.ALFRESCO_URI, "getCopyCallback"),
RecordsManagementModel.TYPE_RECORD_CATEGORY,
new JavaBehaviour(this, "onCopyRecordCategoryNode"));
}
/**
* onMove record behaviour
*
*
* @param oldChildAssocRef
* @param newChildAssocRef
*/
@@ -179,7 +178,7 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
{
final NodeRef newNodeRef = newChildAssocRef.getChildRef();
final NodeService nodeService = rmServiceRegistry.getNodeService();
AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>()
{
public Object doWork() throws Exception
@@ -189,57 +188,56 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
// only remove the search details .. the rest will be resolved automatically
nodeService.removeAspect(newNodeRef, RecordsManagementSearchBehaviour.ASPECT_RM_SEARCH);
}
return null;
}
}, AuthenticationUtil.getAdminUserName());
}
}
/**
* onMove record folder behaviour
*
*
* @param oldChildAssocRef
* @param newChildAssocRef
*/
public void onMoveRecordFolderNode(ChildAssociationRef oldChildAssocRef, ChildAssociationRef newChildAssocRef)
{
final NodeService nodeService = rmServiceRegistry.getNodeService();
if (!nodeService.getType(newChildAssocRef.getParentRef()).equals(TYPE_RECORD_FOLDER))
{
{
if (!oldChildAssocRef.getParentRef().equals(newChildAssocRef.getParentRef()))
{
//final NodeRef oldNodeRef = oldChildAssocRef.getChildRef();
final NodeRef newNodeRef = newChildAssocRef.getChildRef();
AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Object>()
{
public Object doWork() throws Exception
{
final RecordsManagementService rmService = rmServiceRegistry.getRecordsManagementService();
final RecordService rmRecordService = rmServiceRegistry.getRecordService();
final RecordFolderServiceImpl recordFolderService = (RecordFolderServiceImpl)applicationContext.getBean("recordFolderService");
final RecordFolderService recordFolderService = rmServiceRegistry.getRecordFolderService();
final DispositionServiceImpl dispositionService = (DispositionServiceImpl)applicationContext.getBean("dispositionService");
behaviourFilter.disableBehaviour();
try
{
// Remove unwanted aspects
removeUnwantedAspects(nodeService, newNodeRef);
// reinitialise the record folder
recordFolderService.initialiseRecordFolder(newNodeRef);
// reinitialise the record folder disposition action details
dispositionService.refreshDispositionAction(newNodeRef);
// Sort out the child records
for (NodeRef record : rmService.getRecords(newNodeRef))
for (NodeRef record : rmRecordService.getRecords(newNodeRef))
{
// Remove unwanted aspects
removeUnwantedAspects(nodeService, record);
// Re-initiate the records in the new folder.
rmRecordService.file(record);
}
@@ -259,11 +257,11 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
throw new UnsupportedOperationException("Cannot move record folder into another record folder.");
}
}
/**
* Handle the copying of the record aspect.
* Excludes the Date Filed property. The Date Filed will be generated on copy.
*
*
* @param classRef
* @param copyDetails
* @return
@@ -278,7 +276,7 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
Map<QName, Serializable> properties)
{
Map<QName, Serializable> sourceProperties = super.getCopyProperties(classRef, copyDetails, properties);
// Remove the Date Filed property from record properties on copy.
// It will be generated for the copy
if (sourceProperties.containsKey(PROP_DATE_FILED))
@@ -288,15 +286,15 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
return sourceProperties;
}
};
}
/**
* Record Folder Copy Behaviour
*
*
* <li> Do not allow copy of record folder into another record folder</li>
*
*
* @param classRef
* @param copyDetails
* @return
@@ -306,12 +304,12 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
return new DefaultCopyBehaviourCallback()
{
final NodeService nodeService = rmServiceRegistry.getNodeService();
@Override
public Map<QName, Serializable> getCopyProperties(QName classRef, CopyDetails copyDetails, Map<QName, Serializable> properties)
{
Map<QName, Serializable> sourceProperties = super.getCopyProperties(classRef, copyDetails, properties);
// ensure that the 'closed' status of the record folder is not copied
if (sourceProperties.containsKey(PROP_IS_CLOSED))
{
@@ -320,11 +318,11 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
return sourceProperties;
}
/**
* If the targets parent is a Record Folder -- Do Not Allow Copy
*
*
* @param classQName
* @param copyDetails
* @return boolean
@@ -333,7 +331,7 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
public boolean getMustCopy(QName classQName, CopyDetails copyDetails)
{
boolean result = true;
if (nodeService.getType(copyDetails.getTargetParentNodeRef()).equals(TYPE_RECORD_FOLDER) == true)
{
result = false;
@@ -342,17 +340,17 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
{
result = false;
}
return result;
}
};
}
/**
* Record Category Copy Behaviour
*
*
* <li> Do not allow copy of record category into a record folder</li>
*
*
* @param classRef
* @param copyDetails
* @return
@@ -362,10 +360,10 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
return new DefaultCopyBehaviourCallback()
{
final NodeService nodeService = rmServiceRegistry.getNodeService();
/**
* If the targets parent is a Record Folder -- Do Not Allow Copy
*
*
* @param classQName
* @param copyDetails
* @return boolean
@@ -377,10 +375,10 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
}
};
}
/**
* Removes unwanted aspects
*
*
* @param nodeService
* @param nodeRef
*/
@@ -395,10 +393,10 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
}
}
}
/**
* Get the "do nothing" call back behaviour
*
*
* @param classRef
* @param copyDetails
* @return
@@ -407,10 +405,10 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
{
return new DoNothingCopyBehaviourCallback();
}
/**
* Generate and set a new ID for copy of a record
*
*
* @param classRef
* @param sourceNodeRef
* @param targetNodeRef
@@ -422,12 +420,12 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
{
final IdentifierService rmIdentifierService = rmServiceRegistry.getIdentifierService();
final NodeService nodeService = rmServiceRegistry.getNodeService();
//Generate the id for the copy
String id = rmIdentifierService.generateIdentifier(
nodeService.getType(nodeService.getPrimaryParent(targetNodeRef).getParentRef()),
nodeService.getType(nodeService.getPrimaryParent(targetNodeRef).getParentRef()),
(nodeService.getPrimaryParent(targetNodeRef).getParentRef()));
//We need to allow the id to be overwritten disable the policy protecting changes to the id
behaviourFilter.disableBehaviour();
try
@@ -439,14 +437,14 @@ public class RecordCopyBehaviours implements RecordsManagementModel,
behaviourFilter.enableBehaviour();
}
}
/**
* Function to pad a string with zero '0' characters to the required length
*
*
* @param s String to pad with leading zero '0' characters
* @param len Length to pad to
*
* @return padded string or the original if already at >=len characters
*
* @return padded string or the original if already at >=len characters
*/
protected String padString(String s, int len)
{

View File

@@ -27,7 +27,6 @@ import java.util.Map;
import java.util.Set;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition;
@@ -37,11 +36,13 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedul
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.EventCompletionDetails;
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.vital.VitalRecordDefinition;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
@@ -56,33 +57,36 @@ import org.apache.commons.logging.LogFactory;
/**
* Search Behaviour class.
*
*
* Manages the collapse of data onto the supporting aspect on the record/record folder
*
*
* @author Roy Wetherall
*/
public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
private static Log logger = LogFactory.getLog(RecordsManagementSearchBehaviour.class);
private static Log logger = LogFactory.getLog(RecordsManagementSearchBehaviour.class);
/** Policy component */
private PolicyComponent policyComponent;
/** Node service */
private NodeService nodeService;
/** Records management service */
private RecordsManagementService recordsManagementService;
/** Disposition service */
private DispositionService dispositionService;
/** Records management service registry */
private RecordsManagementServiceRegistry recordsManagementServiceRegistry;
/** Vital record service */
private VitalRecordService vitalRecordService;
/** Record folder service */
private RecordFolderService recordFolderService;
/** Record service*/
private RecordService recordService;
/**
* @param nodeService the nodeService to set
*/
@@ -90,7 +94,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
this.nodeService = nodeService;
}
/**
* @param dispositionService the disposition service
*/
@@ -98,7 +102,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
this.dispositionService = dispositionService;
}
/**
* @param policyComponent the policyComponent to set
*/
@@ -106,15 +110,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
this.policyComponent = policyComponent;
}
/**
* @param recordsManagementService the records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param recordsManagementServiceRegistry the records management service registry
*/
@@ -122,7 +118,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
this.recordsManagementServiceRegistry = recordsManagementServiceRegistry;
}
/**
* @param vitalRecordService vital record service
*/
@@ -130,17 +126,33 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
this.vitalRecordService = vitalRecordService;
}
/**
* @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;
}
/** Java behaviour */
private JavaBehaviour onAddSearchAspect = new JavaBehaviour(this, "rmSearchAspectAdd", NotificationFrequency.TRANSACTION_COMMIT);
private JavaBehaviour onAddSearchAspect = new JavaBehaviour(this, "rmSearchAspectAdd", NotificationFrequency.TRANSACTION_COMMIT);
private JavaBehaviour jbDispositionActionCreate = new JavaBehaviour(this, "dispositionActionCreate", NotificationFrequency.TRANSACTION_COMMIT);
private JavaBehaviour jbDispositionActionPropertiesUpdate = new JavaBehaviour(this, "dispositionActionPropertiesUpdate", NotificationFrequency.TRANSACTION_COMMIT);
private JavaBehaviour jbDispositionSchedulePropertiesUpdate = new JavaBehaviour(this, "dispositionSchedulePropertiesUpdate", NotificationFrequency.TRANSACTION_COMMIT);
private JavaBehaviour jbEventExecutionUpdate = new JavaBehaviour(this, "eventExecutionUpdate", NotificationFrequency.TRANSACTION_COMMIT);
private JavaBehaviour jbEventExecutionDelete = new JavaBehaviour(this, "eventExecutionDelete", NotificationFrequency.TRANSACTION_COMMIT);
/** Array of behaviours related to disposition schedule artifacts */
private JavaBehaviour[] jbDispositionBehaviours =
private JavaBehaviour[] jbDispositionBehaviours =
{
jbDispositionActionCreate,
jbDispositionActionPropertiesUpdate,
@@ -148,72 +160,72 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
jbEventExecutionUpdate,
jbEventExecutionDelete
};
/**
* Initialisation method
*/
public void init()
{
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"),
TYPE_DISPOSITION_ACTION,
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"),
TYPE_DISPOSITION_ACTION,
jbDispositionActionCreate);
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
TYPE_DISPOSITION_ACTION,
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
TYPE_DISPOSITION_ACTION,
jbDispositionActionPropertiesUpdate);
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
TYPE_DISPOSITION_SCHEDULE,
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
TYPE_DISPOSITION_SCHEDULE,
jbDispositionSchedulePropertiesUpdate);
this.policyComponent.bindAssociationBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateChildAssociation"),
TYPE_DISPOSITION_ACTION,
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateChildAssociation"),
TYPE_DISPOSITION_ACTION,
ASSOC_EVENT_EXECUTIONS,
jbEventExecutionUpdate);
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onDeleteNode"),
TYPE_EVENT_EXECUTION,
QName.createQName(NamespaceService.ALFRESCO_URI, "onDeleteNode"),
TYPE_EVENT_EXECUTION,
jbEventExecutionDelete);
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"),
ASPECT_RM_SEARCH,
onAddSearchAspect);
QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"),
ASPECT_RM_SEARCH,
onAddSearchAspect);
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"),
ASPECT_RECORD,
new JavaBehaviour(this, "onAddRecordAspect", NotificationFrequency.TRANSACTION_COMMIT));
QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"),
ASPECT_RECORD,
new JavaBehaviour(this, "onAddRecordAspect", NotificationFrequency.TRANSACTION_COMMIT));
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"),
TYPE_RECORD_FOLDER,
QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"),
TYPE_RECORD_FOLDER,
new JavaBehaviour(this, "recordFolderCreate", NotificationFrequency.TRANSACTION_COMMIT));
// Vital Records Review Details Rollup
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"),
ASPECT_VITAL_RECORD_DEFINITION,
QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect"),
ASPECT_VITAL_RECORD_DEFINITION,
new JavaBehaviour(this, "vitalRecordDefintionAddAspect", NotificationFrequency.TRANSACTION_COMMIT));
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
ASPECT_VITAL_RECORD_DEFINITION,
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
ASPECT_VITAL_RECORD_DEFINITION,
new JavaBehaviour(this, "vitalRecordDefintionUpdateProperties", NotificationFrequency.TRANSACTION_COMMIT));
// Hold reason rollup
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onRemoveAspect"),
ASPECT_FROZEN,
QName.createQName(NamespaceService.ALFRESCO_URI, "onRemoveAspect"),
ASPECT_FROZEN,
new JavaBehaviour(this, "onRemoveFrozenAspect", NotificationFrequency.TRANSACTION_COMMIT));
this.policyComponent.bindClassBehaviour(
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
TYPE_HOLD,
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
TYPE_HOLD,
new JavaBehaviour(this, "frozenAspectUpdateProperties", NotificationFrequency.TRANSACTION_COMMIT));
}
@@ -224,7 +236,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
jb.disable();
}
}
public void enableDispositionScheduleBehaviour()
{
for (JavaBehaviour jb : jbDispositionBehaviours)
@@ -232,23 +244,23 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
jb.enable();
}
}
/**
* Ensures the search aspect for the given node is present, complete and correct.
*
*
* @param recordOrFolder
*/
public void fixupSearchAspect(NodeRef recordOrFolder)
{
// for now only deal with record folders
if (recordsManagementService.isRecordFolder(recordOrFolder))
if (recordFolderService.isRecordFolder(recordOrFolder))
{
// ensure the search aspect is applied
applySearchAspect(recordOrFolder);
// setup the properties relating to the disposition schedule
setupDispositionScheduleProperties(recordOrFolder);
// setup the properties relating to the disposition lifecycle
DispositionAction da = dispositionService.getNextDispositionAction(recordOrFolder);
if (da != null)
@@ -256,24 +268,24 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
updateDispositionActionProperties(recordOrFolder, da.getNodeRef());
setupDispositionActionEvents(recordOrFolder, da);
}
// setup the properties relating to the vital record indicator
setVitalRecordDefintionDetails(recordOrFolder);
}
}
/**
* Updates the disposition action properties
*
*
* @param nodeRef
* @param before
* @param after
*/
public void dispositionActionPropertiesUpdate(final NodeRef nodeRef, final Map<QName, Serializable> before, final Map<QName, Serializable> after)
{
if (this.nodeService.exists(nodeRef) == true)
if (nodeService.exists(nodeRef) == true)
{
AuthenticationUtil.runAs(new RunAsWork<Void>()
AuthenticationUtil.runAs(new RunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
@@ -283,29 +295,29 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
// Get the record (or record folder)
NodeRef record = assoc.getParentRef();
// Apply the search aspect
applySearchAspect(record);
// Update disposition properties
updateDispositionActionProperties(record, nodeRef);
}
return null;
}}, AuthenticationUtil.getSystemUserName());
}}, AuthenticationUtil.getSystemUserName());
}
}
private void applySearchAspect(NodeRef nodeRef)
{
onAddSearchAspect.disable();
try
{
if (this.nodeService.hasAspect(nodeRef, ASPECT_RM_SEARCH) == false)
if (nodeService.hasAspect(nodeRef, ASPECT_RM_SEARCH) == false)
{
this.nodeService.addAspect(nodeRef, ASPECT_RM_SEARCH , null);
nodeService.addAspect(nodeRef, ASPECT_RM_SEARCH , null);
if (logger.isDebugEnabled())
logger.debug("Added search aspect to node: " + nodeRef);
}
@@ -315,7 +327,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
onAddSearchAspect.enable();
}
}
public void onAddRecordAspect(final NodeRef nodeRef, final QName aspectTypeQName)
{
AuthenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Void>()
@@ -328,31 +340,31 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
applySearchAspect(nodeRef);
setupDispositionScheduleProperties(nodeRef);
}
return null;
}
});
}
public void recordFolderCreate(final ChildAssociationRef childAssocRef)
{
AuthenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
{
{
NodeRef nodeRef = childAssocRef.getChildRef();
if (nodeService.exists(nodeRef) == true)
{
applySearchAspect(nodeRef);
setupDispositionScheduleProperties(nodeRef);
}
return null;
}
});
}
private void setupDispositionScheduleProperties(NodeRef recordOrFolder)
{
DispositionSchedule ds = dispositionService.getDispositionSchedule(recordOrFolder);
@@ -365,14 +377,14 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
nodeService.setProperty(recordOrFolder, PROP_RS_HAS_DISPOITION_SCHEDULE, true);
setDispositionScheduleProperties(recordOrFolder, ds);
}
if (logger.isDebugEnabled())
{
logger.debug("Set rma:recordSearchHasDispositionSchedule for node " + recordOrFolder +
logger.debug("Set rma:recordSearchHasDispositionSchedule for node " + recordOrFolder +
" to: " + (ds != null));
}
}
public void dispositionActionCreate(ChildAssociationRef childAssocRef)
{
NodeRef child = childAssocRef.getChildRef();
@@ -381,41 +393,41 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
// Get the record (or record folder)
NodeRef record = childAssocRef.getParentRef();
// Apply the search aspect
applySearchAspect(record);
// Update disposition properties
updateDispositionActionProperties(record, childAssocRef.getChildRef());
// Clear the events
this.nodeService.setProperty(record, PROP_RS_DISPOSITION_EVENTS, null);
}
nodeService.setProperty(record, PROP_RS_DISPOSITION_EVENTS, null);
}
}
/**
*
*
* @param record
* @param dispositionAction
*/
private void updateDispositionActionProperties(NodeRef record, NodeRef dispositionAction)
{
Map<QName, Serializable> props = nodeService.getProperties(record);
DispositionAction da = new DispositionActionImpl(recordsManagementServiceRegistry, dispositionAction);
props.put(PROP_RS_DISPOSITION_ACTION_NAME, da.getName());
props.put(PROP_RS_DISPOSITION_ACTION_AS_OF, da.getAsOfDate());
props.put(PROP_RS_DISPOSITION_EVENTS_ELIGIBLE, this.nodeService.getProperty(dispositionAction, PROP_DISPOSITION_EVENTS_ELIGIBLE));
DispositionActionDefinition daDefinition = da.getDispositionActionDefinition();
props.put(PROP_RS_DISPOSITION_ACTION_NAME, da.getName());
props.put(PROP_RS_DISPOSITION_ACTION_AS_OF, da.getAsOfDate());
props.put(PROP_RS_DISPOSITION_EVENTS_ELIGIBLE, nodeService.getProperty(dispositionAction, PROP_DISPOSITION_EVENTS_ELIGIBLE));
DispositionActionDefinition daDefinition = da.getDispositionActionDefinition();
if (daDefinition != null)
{
Period period = daDefinition.getPeriod();
if (period != null)
{
props.put(PROP_RS_DISPOSITION_PERIOD, period.getPeriodType());
props.put(PROP_RS_DISPOSITION_PERIOD_EXPRESSION, period.getExpression());
props.put(PROP_RS_DISPOSITION_PERIOD_EXPRESSION, period.getExpression());
}
else
{
@@ -423,16 +435,16 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
props.put(PROP_RS_DISPOSITION_PERIOD_EXPRESSION, null);
}
}
nodeService.setProperties(record, props);
if (logger.isDebugEnabled())
{
logger.debug("Set rma:recordSearchDispositionActionName for node " + record + " to: " +
logger.debug("Set rma:recordSearchDispositionActionName for node " + record + " to: " +
props.get(PROP_RS_DISPOSITION_ACTION_NAME));
logger.debug("Set rma:recordSearchDispositionActionAsOf for node " + record + " to: " +
props.get(PROP_RS_DISPOSITION_ACTION_AS_OF));
logger.debug("Set rma:recordSearchDispositionEventsEligible for node " + record + " to: " +
logger.debug("Set rma:recordSearchDispositionEventsEligible for node " + record + " to: " +
props.get(PROP_RS_DISPOSITION_EVENTS_ELIGIBLE));
logger.debug("Set rma:recordSearchDispositionPeriod for node " + record + " to: " +
props.get(PROP_RS_DISPOSITION_PERIOD));
@@ -446,11 +458,11 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
NodeRef dispositionAction = childAssocRef.getParentRef();
NodeRef eventExecution = childAssocRef.getChildRef();
if (this.nodeService.exists(dispositionAction) == true &&
this.nodeService.exists(eventExecution) == true)
{
ChildAssociationRef assoc = this.nodeService.getPrimaryParent(dispositionAction);
if (nodeService.exists(dispositionAction) == true &&
nodeService.exists(eventExecution) == true)
{
ChildAssociationRef assoc = nodeService.getPrimaryParent(dispositionAction);
if (assoc.getTypeQName().equals(ASSOC_NEXT_DISPOSITION_ACTION) == true)
{
// Get the record (or record folder)
@@ -458,25 +470,25 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
// Apply the search aspect
applySearchAspect(record);
Collection<String> events = (List<String>)this.nodeService.getProperty(record, PROP_RS_DISPOSITION_EVENTS);
Collection<String> events = (List<String>)nodeService.getProperty(record, PROP_RS_DISPOSITION_EVENTS);
if (events == null)
{
events = new ArrayList<String>(1);
}
events.add((String)this.nodeService.getProperty(eventExecution, PROP_EVENT_EXECUTION_NAME));
this.nodeService.setProperty(record, PROP_RS_DISPOSITION_EVENTS, (Serializable)events);
events.add((String)nodeService.getProperty(eventExecution, PROP_EVENT_EXECUTION_NAME));
nodeService.setProperty(record, PROP_RS_DISPOSITION_EVENTS, (Serializable)events);
}
}
}
public void eventExecutionDelete(ChildAssociationRef childAssocRef, boolean isNodeArchived)
{
NodeRef dispositionActionNode = childAssocRef.getParentRef();
if (this.nodeService.exists(dispositionActionNode))
if (nodeService.exists(dispositionActionNode))
{
ChildAssociationRef assoc = this.nodeService.getPrimaryParent(dispositionActionNode);
ChildAssociationRef assoc = nodeService.getPrimaryParent(dispositionActionNode);
if (assoc.getTypeQName().equals(ASSOC_NEXT_DISPOSITION_ACTION) == true)
{
// Get the record (or record folder)
@@ -484,13 +496,13 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
// Apply the search aspect
applySearchAspect(record);
// make sure the list of events match the action definition
setupDispositionActionEvents(record, dispositionService.getNextDispositionAction(record));
}
}
}
private void setupDispositionActionEvents(NodeRef nodeRef, DispositionAction da)
{
if (da != null)
@@ -505,19 +517,19 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
eventNames.add(event.getEventName());
}
}
// set the property
this.nodeService.setProperty(nodeRef, PROP_RS_DISPOSITION_EVENTS, (Serializable)eventNames);
nodeService.setProperty(nodeRef, PROP_RS_DISPOSITION_EVENTS, (Serializable)eventNames);
if (logger.isDebugEnabled())
{
logger.debug("Set rma:recordSearchDispositionEvents for node " + nodeRef + " to: " + eventNames);
}
}
}
public void rmSearchAspectAdd(final NodeRef nodeRef, final QName aspectTypeQName)
{
{
AuthenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork<Void>()
{
@Override
@@ -527,8 +539,8 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
// Initialise the search parameteres as required
setVitalRecordDefintionDetails(nodeRef);
}
}
return null;
}
});
@@ -537,16 +549,16 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
public void vitalRecordDefintionAddAspect(NodeRef nodeRef, QName aspectTypeQName)
{
// Only care about record folders
if (recordsManagementService.isRecordFolder(nodeRef) == true)
if (recordFolderService.isRecordFolder(nodeRef) == true)
{
updateVitalRecordDefinitionValues(nodeRef);
updateVitalRecordDefinitionValues(nodeRef);
}
}
public void vitalRecordDefintionUpdateProperties(NodeRef nodeRef, Map<QName, Serializable> before, Map<QName, Serializable> after)
{
// Only care about record folders
if (recordsManagementService.isRecordFolder(nodeRef) == true)
if (recordFolderService.isRecordFolder(nodeRef) == true)
{
Set<QName> props = new HashSet<QName>(1);
props.add(PROP_REVIEW_PERIOD);
@@ -556,37 +568,37 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
updateVitalRecordDefinitionValues(nodeRef);
}
}
}
private void updateVitalRecordDefinitionValues(NodeRef nodeRef)
{
// ensure the folder itself reflects the correct details
applySearchAspect(nodeRef);
setVitalRecordDefintionDetails(nodeRef);
List<NodeRef> records = recordsManagementService.getRecords(nodeRef);
List<NodeRef> records = recordService.getRecords(nodeRef);
for (NodeRef record : records)
{
// Apply the search aspect
applySearchAspect(record);
// Set the vital record definition details
setVitalRecordDefintionDetails(record);
}
}
private void setVitalRecordDefintionDetails(NodeRef nodeRef)
{
VitalRecordDefinition vrd = vitalRecordService.getVitalRecordDefinition(nodeRef);
if (vrd != null && vrd.isEnabled() == true && vrd.getReviewPeriod() != null)
{
// Set the property values
nodeService.setProperty(nodeRef, PROP_RS_VITAL_RECORD_REVIEW_PERIOD, vrd.getReviewPeriod().getPeriodType());
nodeService.setProperty(nodeRef, PROP_RS_VITAL_RECORD_REVIEW_PERIOD_EXPRESSION, vrd.getReviewPeriod().getExpression());
if (logger.isDebugEnabled())
{
logger.debug("Set rma:recordSearchVitalRecordReviewPeriod for node " + nodeRef + " to: " +
@@ -602,7 +614,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
nodeService.setProperty(nodeRef, PROP_RS_VITAL_RECORD_REVIEW_PERIOD_EXPRESSION, null);
}
}
public void onRemoveFrozenAspect(NodeRef nodeRef, QName aspectTypeQName)
{
if (nodeService.exists(nodeRef) == true &&
@@ -611,7 +623,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
nodeService.setProperty(nodeRef, PROP_RS_HOLD_REASON, null);
}
}
public void frozenAspectUpdateProperties(final NodeRef nodeRef, final Map<QName, Serializable> before, final Map<QName, Serializable> after)
{
AuthenticationUtil.RunAsWork<Void> work = new AuthenticationUtil.RunAsWork<Void>()
@@ -623,46 +635,46 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
{
// get the changed hold reason
String holdReason = (String)nodeService.getProperty(nodeRef, PROP_HOLD_REASON);
// get all the frozen items the hold node has and change the hold reason
List<ChildAssociationRef> holdAssocs = nodeService.getChildAssocs(nodeRef, ASSOC_FROZEN_RECORDS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : holdAssocs)
{
NodeRef frozenItem = assoc.getChildRef();
// ensure the search aspect is applied and set the hold reason
applySearchAspect(frozenItem);
nodeService.setProperty(frozenItem, PROP_RS_HOLD_REASON, holdReason);
}
}
return null;
}
};
AuthenticationUtil.runAs(work, AuthenticationUtil.getSystemUserName());
}
/**
* Updates the disposition schedule properties
*
*
* @param nodeRef
* @param before
* @param after
*/
public void dispositionSchedulePropertiesUpdate(NodeRef nodeRef, Map<QName, Serializable> before, Map<QName, Serializable> after)
{
if (this.nodeService.exists(nodeRef) == true)
if (nodeService.exists(nodeRef) == true)
{
// create the schedule object and get the record category for it
DispositionSchedule schedule = new DispositionScheduleImpl(this.recordsManagementServiceRegistry, this.nodeService, nodeRef);
NodeRef recordCategoryNode = this.nodeService.getPrimaryParent(schedule.getNodeRef()).getParentRef();
DispositionSchedule schedule = new DispositionScheduleImpl(recordsManagementServiceRegistry, nodeService, nodeRef);
NodeRef recordCategoryNode = nodeService.getPrimaryParent(schedule.getNodeRef()).getParentRef();
if (schedule.isRecordLevelDisposition())
{
for (NodeRef recordFolder : this.getRecordFolders(recordCategoryNode))
for (NodeRef recordFolder : getRecordFolders(recordCategoryNode))
{
for (NodeRef record : this.recordsManagementService.getRecords(recordFolder))
for (NodeRef record : recordService.getRecords(recordFolder))
{
applySearchAspect(record);
setDispositionScheduleProperties(record, schedule);
@@ -671,7 +683,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
}
else
{
for (NodeRef recordFolder : this.getRecordFolders(recordCategoryNode))
for (NodeRef recordFolder : getRecordFolders(recordCategoryNode))
{
applySearchAspect(recordFolder);
setDispositionScheduleProperties(recordFolder, schedule);
@@ -679,14 +691,14 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
}
}
}
private void setDispositionScheduleProperties(NodeRef recordOrFolder, DispositionSchedule schedule)
{
if (schedule != null)
{
this.nodeService.setProperty(recordOrFolder, PROP_RS_DISPOITION_AUTHORITY, schedule.getDispositionAuthority());
this.nodeService.setProperty(recordOrFolder, PROP_RS_DISPOITION_INSTRUCTIONS, schedule.getDispositionInstructions());
nodeService.setProperty(recordOrFolder, PROP_RS_DISPOITION_AUTHORITY, schedule.getDispositionAuthority());
nodeService.setProperty(recordOrFolder, PROP_RS_DISPOITION_INSTRUCTIONS, schedule.getDispositionInstructions());
if (logger.isDebugEnabled())
{
logger.debug("Set rma:recordSearchDispositionAuthority for node " + recordOrFolder + " to: " + schedule.getDispositionAuthority());
@@ -694,7 +706,7 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
}
}
}
/**
* This method compares the oldProps map against the newProps map and returns
* a set of QNames of the properties that have changed. Changed here means one of
@@ -722,25 +734,25 @@ public class RecordsManagementSearchBehaviour implements RecordsManagementModel
result.add(qn);
}
}
return result;
}
private List<NodeRef> getRecordFolders(NodeRef recordCategoryNode)
{
List<NodeRef> results = new ArrayList<NodeRef>(8);
List<ChildAssociationRef> folderAssocs = nodeService.getChildAssocs(recordCategoryNode,
List<ChildAssociationRef> folderAssocs = nodeService.getChildAssocs(recordCategoryNode,
ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef folderAssoc : folderAssocs)
{
NodeRef folder = folderAssoc.getChildRef();
if (this.recordsManagementService.isRecordFolder(folder))
if (recordFolderService.isRecordFolder(folder))
{
results.add(folder);
}
}
return results;
}
}

View File

@@ -20,6 +20,7 @@
package org.alfresco.module.org_alfresco_module_rm.record;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -39,12 +40,12 @@ public interface RecordService
* Disables the property editable check.
*/
void disablePropertyEditableCheck();
/**
* Enables the property editable check. By default this is always enabled.
*/
void enablePropertyEditableCheck();
/**
* Gets a list of all the record meta-data aspects
*
@@ -86,10 +87,10 @@ public interface RecordService
* @see #createRecord(NodeRef, NodeRef, boolean)
*/
void createRecord(NodeRef filePlan, NodeRef nodeRef);
/**
* Creates a new document as a unfiled record.
*
*
* @param filePlan
* @param name
* @param type
@@ -107,11 +108,11 @@ public interface RecordService
/**
* 'File' a new document that arrived in the file plan structure.
*
*
* @param nodeRef record
*/
void file(NodeRef record);
/**
* Hides a record within a collaboration site
*
@@ -126,13 +127,29 @@ public interface RecordService
* @param reason The reason for rejection
*/
void rejectRecord(NodeRef nodeRef, String reason);
/**
* Indicates whether a property of a record is editable for the current user or not.
*
*
* @param record record
* @param property property
* @return boolean true if editable, false otherwise.
*/
boolean isPropertyEditable(NodeRef record, QName property);
/**
* Indicates whether the given node (record or record folder) is a metadata stub or not.
*
* @param nodeRef node reference
* @return boolean true if a metadata stub, false otherwise
*/
boolean isMetadataStub(NodeRef nodeRef);
/**
* Gets a list of all the records within a record folder
*
* @param recordFolder record folder
* @return List<NodeRef> list of records in the record folder
*/
List<NodeRef> getRecords(NodeRef recordFolder);
}

View File

@@ -19,6 +19,7 @@
package org.alfresco.module.org_alfresco_module_rm.record;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
@@ -30,7 +31,6 @@ import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
@@ -43,13 +43,13 @@ import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementCustomM
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.security.ModelAccessDeniedException;
import org.alfresco.module.org_alfresco_module_rm.notification.RecordsManagementNotificationHelper;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.role.Role;
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordServiceImpl;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
@@ -78,6 +78,7 @@ import org.alfresco.service.cmr.security.OwnableService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.EqualsHelper;
import org.alfresco.util.ParameterCheck;
import org.apache.commons.lang.ArrayUtils;
@@ -105,13 +106,13 @@ public class RecordServiceImpl implements RecordService,
{
/** Logger */
private static Log logger = LogFactory.getLog(RecordServiceImpl.class);
/** Always edit property array */
private static final QName[] ALWAYS_EDIT_PROPERTIES = new QName[]
{
ContentModel.PROP_LAST_THUMBNAIL_MODIFICATION_DATA
};
private static final String[] ALWAYS_EDIT_URIS = new String[]
{
NamespaceService.SECURITY_MODEL_1_0_URI,
@@ -122,15 +123,15 @@ public class RecordServiceImpl implements RecordService,
NamespaceService.DICTIONARY_MODEL_1_0_URI,
NamespaceService.BPM_MODEL_1_0_URI,
NamespaceService.RENDITION_MODEL_1_0_URI
};
};
private static final String[] RECORD_MODEL_URIS = new String[]
{
RM_URI,
RM_CUSTOM_URI,
DOD5015Model.DOD_URI
};
private static final String[] NON_RECORD_MODEL_URIS = new String[]
{
NamespaceService.AUDIO_MODEL_1_0_URI,
@@ -142,7 +143,7 @@ public class RecordServiceImpl implements RecordService,
NamespaceService.REPOSITORY_VIEW_1_0_URI
};
/** Application context */
private ApplicationContext applicationContext;
@@ -161,11 +162,9 @@ public class RecordServiceImpl implements RecordService,
/** Extended security service */
private ExtendedSecurityService extendedSecurityService;
/** Records management service */
private RecordsManagementService recordsManagementService;
/** Disposition service */
private DispositionService dispositionService;
// FIXME
//private DispositionService dispositionService;
/** File plan service */
private FilePlanService filePlanService;
@@ -178,22 +177,22 @@ public class RecordServiceImpl implements RecordService,
/** Ownable service */
private OwnableService ownableService;
/** Capability service */
private CapabilityService capabilityService;
/** Rule service */
private RuleService ruleService;
/** File folder service */
private FileFolderService fileFolderService;
/** Behaviour filter */
@SuppressWarnings("unused")
private BehaviourFilter behaviourFilter;
/** Record folder service */
// FIXME
//private RecordFolderService recordFolderService;
/** List of available record meta-data aspects */
private Set<QName> recordMetaDataAspects;
private Set<QName> recordMetaDataAspects;
/** Behaviours */
private JavaBehaviour onCreateChildAssociation = new JavaBehaviour(
@@ -255,21 +254,13 @@ public class RecordServiceImpl implements RecordService,
this.extendedSecurityService = extendedSecurityService;
}
/**
* @param recordsManagementService records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param dispositionService disposition service
*/
public void setDispositionService(DispositionService dispositionService)
{
this.dispositionService = dispositionService;
}
// public void setDispositionService(DispositionService dispositionService)
// {
// this.dispositionService = dispositionService;
// }
/**
* @param filePlanService file plan service
@@ -302,7 +293,7 @@ public class RecordServiceImpl implements RecordService,
{
this.ownableService = ownableService;
}
/**
* @param capabilityService capability service
*/
@@ -310,7 +301,7 @@ public class RecordServiceImpl implements RecordService,
{
this.capabilityService = capabilityService;
}
/**
* @param ruleService rule service
*/
@@ -318,7 +309,7 @@ public class RecordServiceImpl implements RecordService,
{
this.ruleService = ruleService;
}
/**
* @param fileFolderService file folder service
*/
@@ -326,14 +317,14 @@ public class RecordServiceImpl implements RecordService,
{
this.fileFolderService = fileFolderService;
}
/**
* @param behaviourFilter behaviour filter
* @param recordFolderService record folder service
*/
public void setBehaviourFilter(BehaviourFilter behaviourFilter)
{
this.behaviourFilter = behaviourFilter;
}
// public void setRecordFolderService(RecordFolderService recordFolderService)
// {
// this.recordFolderService = recordFolderService;
// }
/**
* Init method
@@ -346,26 +337,26 @@ public class RecordServiceImpl implements RecordService,
ContentModel.ASSOC_CONTAINS,
onCreateChildAssociation);
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnUpdatePropertiesPolicy.QNAME,
ASPECT_RECORD,
NodeServicePolicies.OnUpdatePropertiesPolicy.QNAME,
ASPECT_RECORD,
onUpdateProperties);
policyComponent.bindAssociationBehaviour(
NodeServicePolicies.BeforeDeleteChildAssociationPolicy.QNAME,
ContentModel.TYPE_FOLDER,
ContentModel.ASSOC_CONTAINS,
ContentModel.ASSOC_CONTAINS,
onDeleteDeclaredRecordLink);
// Handle the special case when we are dealing with new records that are being added via a file protocol
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnAddAspectPolicy.QNAME,
ContentModel.ASPECT_NO_CONTENT,
NodeServicePolicies.OnAddAspectPolicy.QNAME,
ContentModel.ASPECT_NO_CONTENT,
new JavaBehaviour(this, "onAddAspect", NotificationFrequency.EVERY_EVENT));
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnRemoveAspectPolicy.QNAME,
ContentModel.ASPECT_NO_CONTENT,
NodeServicePolicies.OnRemoveAspectPolicy.QNAME,
ContentModel.ASPECT_NO_CONTENT,
new JavaBehaviour(this, "onRemoveAspect", NotificationFrequency.EVERY_EVENT));
}
/**
* @see org.alfresco.repo.node.NodeServicePolicies.OnRemoveAspectPolicy#onRemoveAspect(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
*/
@@ -402,16 +393,16 @@ public class RecordServiceImpl implements RecordService,
{
switchNames(nodeRef);
}
/**
* Helper method to switch the name of the record around. Used to support record creation via
* file protocols.
*
*
* @param nodeRef node reference (record)
*/
private void switchNames(NodeRef nodeRef)
{
try
try
{
if (nodeService.hasAspect(nodeRef, ASPECT_RECORD) == true)
{
@@ -423,22 +414,22 @@ public class RecordServiceImpl implements RecordService,
nodeService.setProperty(nodeRef, PROP_ORIGIONAL_NAME, name);
}
}
}
catch (FileExistsException e)
}
catch (FileExistsException e)
{
if (logger.isDebugEnabled() == true)
{
logger.debug(e.getMessage());
}
}
catch (InvalidNodeRefException e)
catch (InvalidNodeRefException e)
{
if (logger.isDebugEnabled() == true)
{
logger.debug(e.getMessage());
}
}
catch (FileNotFoundException e)
}
catch (FileNotFoundException e)
{
if (logger.isDebugEnabled() == true)
{
@@ -464,9 +455,9 @@ public class RecordServiceImpl implements RecordService,
try
{
NodeRef nodeRef = childAssocRef.getChildRef();
if (nodeService.exists(nodeRef) == true &&
if (nodeService.exists(nodeRef) == true &&
nodeService.hasAspect(nodeRef, ContentModel.ASPECT_TEMPORARY) == false &&
nodeService.getType(nodeRef).equals(TYPE_RECORD_FOLDER) == false &&
nodeService.getType(nodeRef).equals(TYPE_RECORD_FOLDER) == false &&
nodeService.getType(nodeRef).equals(TYPE_RECORD_CATEGORY) == false)
{
if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_NO_CONTENT) == true)
@@ -490,15 +481,15 @@ public class RecordServiceImpl implements RecordService,
{
onCreateChildAssociation.enable();
}
return null;
}
}, AuthenticationUtil.getSystemUserName());
}
/**
* Ensure that the user only updates record properties that they have permission to.
*
*
* @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, java.util.Map)
*/
@Override
@@ -520,15 +511,15 @@ public class RecordServiceImpl implements RecordService,
{
beforeValue = before.get(property);
}
Serializable afterValue = null;
if (after != null)
{
afterValue = after.get(property);
}
boolean propertyUnchanged = false;
if (beforeValue != null && afterValue != null &&
if (beforeValue != null && afterValue != null &&
beforeValue instanceof Date && afterValue instanceof Date)
{
// deal with date values
@@ -539,7 +530,7 @@ public class RecordServiceImpl implements RecordService,
// otherwise
propertyUnchanged = EqualsHelper.nullSafeEquals(beforeValue, afterValue);
}
if (propertyUnchanged == false &&
isPropertyEditable(nodeRef, property) == false)
{
@@ -558,12 +549,12 @@ public class RecordServiceImpl implements RecordService,
onUpdateProperties.enable();
}
}
/**
* Looking specifically at linked content that was declared a record from a non-rm site.
* When the site or the folder that the link was declared in is deleted we need to remove
* When the site or the folder that the link was declared in is deleted we need to remove
* the extended security property accounts in the tree
*
*
* @param childAssocRef
*/
public void onDeleteDeclaredRecordLink(ChildAssociationRef childAssocRef)
@@ -571,15 +562,15 @@ public class RecordServiceImpl implements RecordService,
// Is the deleted child association not a primary association?
// Does the deleted child association have the rma:recordOriginatingDetails aspect?
// Is the parent of the deleted child association a folder (cm:folder)?
if (!childAssocRef.isPrimary() &&
nodeService.hasAspect(childAssocRef.getChildRef(), ASPECT_RECORD_ORIGINATING_DETAILS) &&
if (!childAssocRef.isPrimary() &&
nodeService.hasAspect(childAssocRef.getChildRef(), ASPECT_RECORD_ORIGINATING_DETAILS) &&
nodeService.getType(childAssocRef.getParentRef()).equals(ContentModel.TYPE_FOLDER))
{
// ..then remove the extended readers and writers up the tree for this remaining node
extendedSecurityService.removeExtendedSecurity(childAssocRef.getChildRef(), extendedSecurityService.getExtendedReaders(childAssocRef.getChildRef()), extendedSecurityService.getExtendedWriters(childAssocRef.getChildRef()), true);
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#disablePropertyEditableCheck()
*/
@@ -588,7 +579,7 @@ public class RecordServiceImpl implements RecordService,
{
onUpdateProperties.disable();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#enablePropertyEditableCheck()
*/
@@ -663,7 +654,7 @@ public class RecordServiceImpl implements RecordService,
ParameterCheck.mandatory("filePlan", filePlan);
ParameterCheck.mandatory("nodeRef", nodeRef);
ParameterCheck.mandatory("isLinked", isLinked);
// first we do a sanity check to ensure that the user has at least write permissions on the document
if (permissionService.hasPermission(nodeRef, PermissionService.WRITE) != AccessStatus.ALLOWED)
{
@@ -683,7 +674,7 @@ public class RecordServiceImpl implements RecordService,
public Void doWork() throws Exception
{
if (nodeService.hasAspect(nodeRef, ASPECT_RECORD) == false)
{
{
// disable delete rules
ruleService.disableRuleType("outbound");
try
@@ -694,34 +685,34 @@ public class RecordServiceImpl implements RecordService,
{
throw new AlfrescoRuntimeException("Unable to create record, because new record container could not be found.");
}
// get the documents readers
Long aclId = nodeService.getNodeAclId(nodeRef);
Set<String> readers = permissionService.getReaders(aclId);
Set<String> writers = permissionService.getWriters(aclId);
// add the current owner to the list of extended writers
String owner = ownableService.getOwner(nodeRef);
// remove the owner
ownableService.setOwner(nodeRef, OwnableService.NO_OWNER);
// get the documents primary parent assoc
ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(nodeRef);
// move the document into the file plan
nodeService.moveNode(nodeRef, newRecordContainer, ContentModel.ASSOC_CONTAINS, parentAssoc.getQName());
// save the information about the originating details
Map<QName, Serializable> aspectProperties = new HashMap<QName, Serializable>(3);
aspectProperties.put(PROP_RECORD_ORIGINATING_LOCATION, (Serializable) parentAssoc.getParentRef());
aspectProperties.put(PROP_RECORD_ORIGINATING_USER_ID, userId);
aspectProperties.put(PROP_RECORD_ORIGINATING_CREATION_DATE, new Date());
nodeService.addAspect(nodeRef, ASPECT_RECORD_ORIGINATING_DETAILS, aspectProperties);
// make the document a record
makeRecord(nodeRef);
if (isLinked == true)
{
// turn off rules
@@ -730,12 +721,12 @@ public class RecordServiceImpl implements RecordService,
{
// maintain the original primary location
nodeService.addChild(parentAssoc.getParentRef(), nodeRef, parentAssoc.getTypeQName(), parentAssoc.getQName());
// set the extended security
Set<String> combinedWriters = new HashSet<String>(writers);
combinedWriters.add(owner);
combinedWriters.add(AuthenticationUtil.getFullyAuthenticatedUser());
extendedSecurityService.addExtendedSecurity(nodeRef, readers, combinedWriters);
}
finally
@@ -754,7 +745,7 @@ public class RecordServiceImpl implements RecordService,
}
});
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecord(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map, org.alfresco.service.cmr.repository.ContentReader)
*/
@@ -763,30 +754,30 @@ public class RecordServiceImpl implements RecordService,
{
ParameterCheck.mandatory("filePlan", filePlan);
ParameterCheck.mandatory("name", name);
// if none set the default record type is cm:content
if (type == null)
{
type = ContentModel.TYPE_CONTENT;
}
// TODO ensure that the type is a sub-type of cm:content
// get the unfiled record container for the file plan
NodeRef unfiledContainer = filePlanService.getUnfiledContainer(filePlan);
if (unfiledContainer == null)
{
throw new AlfrescoRuntimeException("Unable to create record, because unfiled container could not be found.");
}
// create the new record
NodeRef record = fileFolderService.create(unfiledContainer, name, type).getNodeRef();
// set the properties
if (properties != null)
{
nodeService.addProperties(record, properties);
}
// set the content
if (reader != null)
{
@@ -795,10 +786,10 @@ public class RecordServiceImpl implements RecordService,
writer.setMimetype(reader.getMimetype());
writer.putContent(reader);
}
// make record
makeRecord(record);
return record;
}
@@ -813,12 +804,12 @@ public class RecordServiceImpl implements RecordService,
try
{
// get the record id
String recordId = identifierService.generateIdentifier(ASPECT_RECORD,
String recordId = identifierService.generateIdentifier(ASPECT_RECORD,
nodeService.getPrimaryParent(document).getParentRef());
// get the record name
String name = (String)nodeService.getProperty(document, ContentModel.PROP_NAME);
// rename the record
int dotIndex = name.lastIndexOf(".");
String prefix = name;
@@ -827,20 +818,20 @@ public class RecordServiceImpl implements RecordService,
{
prefix = name.substring(0, dotIndex);
postfix = name.substring(dotIndex);
}
}
String recordName = prefix + " (" + recordId + ")" + postfix;
fileFolderService.rename(document, recordName);
if (logger.isDebugEnabled() == true)
{
logger.debug("Rename " + name + " to " + recordName);
}
// add the record aspect
Map<QName, Serializable> props = new HashMap<QName, Serializable>(2);
props.put(PROP_IDENTIFIER, recordId);
props.put(PROP_ORIGIONAL_NAME, name);
nodeService.addAspect(document, RecordsManagementModel.ASPECT_RECORD, props);
nodeService.addAspect(document, RecordsManagementModel.ASPECT_RECORD, props);
}
catch (FileNotFoundException e)
{
@@ -850,7 +841,7 @@ public class RecordServiceImpl implements RecordService,
{
ruleService.enableRules();
}
}
/**
@@ -869,8 +860,9 @@ public class RecordServiceImpl implements RecordService,
if (childAssocRef != null)
{
NodeRef parent = childAssocRef.getParentRef();
if (parent != null &&
recordsManagementService.isRecordFolder(parent) == true)
//FIXME
RecordFolderService recordFolderService = (RecordFolderService) applicationContext.getBean("RecordFolderService");
if (parent != null && recordFolderService.isRecordFolder(parent) == true)
{
result = true;
}
@@ -921,6 +913,8 @@ public class RecordServiceImpl implements RecordService,
// initialise disposition details
if (nodeService.hasAspect(record, ASPECT_DISPOSITION_LIFECYCLE) == false)
{
//FIXME
DispositionService dispositionService = (DispositionService)applicationContext.getBean("DispositionService");
DispositionSchedule di = dispositionService.getDispositionSchedule(record);
if (di != null && di.isRecordLevelDisposition() == true)
{
@@ -985,14 +979,14 @@ public class RecordServiceImpl implements RecordService,
{
ruleService.disableRules();
try
{
{
// get record property values
Map<QName, Serializable> properties = nodeService.getProperties(nodeRef);
String recordId = (String)properties.get(PROP_IDENTIFIER);
String recordId = (String)properties.get(PROP_IDENTIFIER);
String documentOwner = (String)properties.get(PROP_RECORD_ORIGINATING_USER_ID);
String origionalName = (String)properties.get(PROP_ORIGIONAL_NAME);
NodeRef originatingLocation = (NodeRef)properties.get(PROP_RECORD_ORIGINATING_LOCATION);
// first remove the secondary link association
List<ChildAssociationRef> parentAssocs = nodeService.getParentAssocs(nodeRef);
for (ChildAssociationRef childAssociationRef : parentAssocs)
@@ -1003,7 +997,7 @@ public class RecordServiceImpl implements RecordService,
break;
}
}
// remove all RM related aspects from the node
Set<QName> aspects = nodeService.getAspects(nodeRef);
for (QName aspect : aspects)
@@ -1014,39 +1008,39 @@ public class RecordServiceImpl implements RecordService,
nodeService.removeAspect(nodeRef, aspect);
}
}
// get the records primary parent association
ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(nodeRef);
// move the record into the collaboration site
nodeService.moveNode(nodeRef, originatingLocation, ContentModel.ASSOC_CONTAINS, parentAssoc.getQName());
// rename to the origional name
if (origionalName != null)
{
fileFolderService.rename(nodeRef, origionalName);
if (logger.isDebugEnabled() == true)
{
String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
logger.debug("Rename " + name + " to " + origionalName);
}
}
// save the information about the rejection details
Map<QName, Serializable> aspectProperties = new HashMap<QName, Serializable>(3);
aspectProperties.put(PROP_RECORD_REJECTION_USER_ID, userId);
aspectProperties.put(PROP_RECORD_REJECTION_DATE, new Date());
aspectProperties.put(PROP_RECORD_REJECTION_REASON, reason);
nodeService.addAspect(nodeRef, ASPECT_RECORD_REJECTION_DETAILS, aspectProperties);
// Restore the owner of the document
// Restore the owner of the document
if (StringUtils.isBlank(documentOwner))
{
throw new AlfrescoRuntimeException("Unable to find the creator of document.");
}
ownableService.setOwner(nodeRef, documentOwner);
// send an email to the record creator
notificationHelper.recordRejectedEmailNotification(nodeRef, recordId, documentOwner);
}
@@ -1068,46 +1062,46 @@ public class RecordServiceImpl implements RecordService,
{
ParameterCheck.mandatory("record", record);
ParameterCheck.mandatory("property", property);
if (isRecord(record) == false)
{
throw new AlfrescoRuntimeException("Can not check if the property " + property.toString() + " is editable, because node reference is not a record.");
}
if (logger.isDebugEnabled() == true)
{
logger.debug("Checking whether property " + property.toString() + " is editable for user " + AuthenticationUtil.getRunAsUser());
}
// DEBUG ...
FilePlanService fps = (FilePlanService)applicationContext.getBean("filePlanService");
FilePlanRoleService fprs = (FilePlanRoleService)applicationContext.getBean("filePlanRoleService");
PermissionService ps = (PermissionService)applicationContext.getBean("permissionService");
NodeRef filePlan = fps.getFilePlan(record);
NodeRef filePlan = fps.getFilePlan(record);
Set<Role> roles = fprs.getRolesByUser(filePlan, AuthenticationUtil.getRunAsUser());
if (logger.isDebugEnabled() == true)
{
logger.debug(" ... users roles");
}
for (Role role : roles)
{
if (logger.isDebugEnabled() == true)
{
logger.debug(" ... user has role " + role.getName() + " with capabilities ");
}
for (Capability cap : role.getCapabilities())
{
if (logger.isDebugEnabled() == true)
{
logger.debug(" ... " + cap.getName());
}
}
}
}
if (logger.isDebugEnabled() == true)
{
logger.debug(" ... user has the following set permissions on the file plan");
@@ -1115,14 +1109,14 @@ public class RecordServiceImpl implements RecordService,
Set<AccessPermission> perms = ps.getAllSetPermissions(filePlan);
for (AccessPermission perm : perms)
{
if (logger.isDebugEnabled() == true &&
if (logger.isDebugEnabled() == true &&
(perm.getPermission().contains(RMPermissionModel.EDIT_NON_RECORD_METADATA) ||
perm.getPermission().contains(RMPermissionModel.EDIT_RECORD_METADATA)))
{
logger.debug(" ... " + perm.getAuthority() + " - " + perm.getPermission() + " - " + perm.getAccessStatus().toString());
}
}
}
if (ps.hasPermission(filePlan, RMPermissionModel.EDIT_NON_RECORD_METADATA).equals(AccessStatus.ALLOWED))
{
if (logger.isDebugEnabled() == true)
@@ -1130,9 +1124,9 @@ public class RecordServiceImpl implements RecordService,
logger.debug(" ... user has the edit non record metadata permission on the file plan");
}
}
// END DEBUG ...
boolean result = alwaysEditProperty(property);
if (result == true)
{
@@ -1149,17 +1143,17 @@ public class RecordServiceImpl implements RecordService,
AccessStatus accessNonRecord = capabilityService.getCapabilityAccessState(record, RMPermissionModel.EDIT_NON_RECORD_METADATA);
AccessStatus accessDeclaredRecord = capabilityService.getCapabilityAccessState(record, RMPermissionModel.EDIT_DECLARED_RECORD_METADATA);
AccessStatus accessRecord = capabilityService.getCapabilityAccessState(record, RMPermissionModel.EDIT_RECORD_METADATA);
if (AccessStatus.ALLOWED.equals(accessNonRecord) == true)
{
if (logger.isDebugEnabled() == true)
{
logger.debug(" ... user has edit nonrecord metadata capability");
}
allowNonRecordEdit = true;
}
if (AccessStatus.ALLOWED.equals(accessRecord) == true ||
AccessStatus.ALLOWED.equals(accessDeclaredRecord) == true)
{
@@ -1167,29 +1161,29 @@ public class RecordServiceImpl implements RecordService,
{
logger.debug(" ... user has edit record or declared metadata capability");
}
allowRecordEdit = true;
}
if (allowNonRecordEdit == true && allowRecordEdit == true)
{
if (logger.isDebugEnabled() == true)
{
logger.debug(" ... so all properties can be edited.");
}
result = true;
}
else if (allowNonRecordEdit == true && allowRecordEdit == false)
{
// can only edit non record properties
if (isRecordMetadata(property) == false)
if (isRecordMetadata(property) == false)
{
if (logger.isDebugEnabled() == true)
{
logger.debug(" ... property is not considered record metadata so editable.");
}
result = true;
}
else
@@ -1209,9 +1203,9 @@ public class RecordServiceImpl implements RecordService,
{
logger.debug(" ... property is considered record metadata so editable.");
}
result = true;
}
}
else
{
if (logger.isDebugEnabled() == true)
@@ -1224,17 +1218,17 @@ public class RecordServiceImpl implements RecordService,
}
return result;
}
/**
* Helper method that indicates whether a property is considered record metadata or not.
*
* @param property property
*
* @param property property
* @return boolea true if record metadata, false otherwise
*/
private boolean isRecordMetadata(QName property)
{
boolean result = ArrayUtils.contains(RECORD_MODEL_URIS, property.getNamespaceURI());
if (result == false && ArrayUtils.contains(NON_RECORD_MODEL_URIS, property.getNamespaceURI()) == false)
{
PropertyDefinition def = dictionaryService.getProperty(property);
@@ -1247,13 +1241,13 @@ public class RecordServiceImpl implements RecordService,
}
}
}
return result;
}
/**
* Determines whether the property should always be allowed to be edited or not.
*
*
* @param property
* @return
*/
@@ -1263,22 +1257,58 @@ public class RecordServiceImpl implements RecordService,
ArrayUtils.contains(ALWAYS_EDIT_PROPERTIES, property) ||
isProtectedProperty(property));
}
/**
* Helper method to determine whether a property is protected at a dictionary definition
* level.
*
*
* @param property property qualified name
* @return booelan true if protected, false otherwise
*/
private boolean isProtectedProperty(QName property)
{
boolean result = false;
boolean result = false;
PropertyDefinition def = dictionaryService.getProperty(property);
if (def != null)
{
result = def.isProtected();
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isMetadataStub(NodeRef)
*/
@Override
public boolean isMetadataStub(NodeRef nodeRef)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
return nodeService.hasAspect(nodeRef, ASPECT_GHOSTED);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#getRecords(NodeRef)
*/
@Override
public List<NodeRef> getRecords(NodeRef recordFolder)
{
ParameterCheck.mandatory("recordFolder", recordFolder);
List<NodeRef> result = new ArrayList<NodeRef>(1);
//FIXME
RecordFolderService recordFolderService = (RecordFolderService) applicationContext.getBean("RecordFolderService");
if (recordFolderService.isRecordFolder(recordFolder) == true)
{
List<ChildAssociationRef> assocs = this.nodeService.getChildAssocs(recordFolder, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef child = assoc.getChildRef();
if (isRecord(child) == true)
{
result.add(child);
}
}
}
return result;
}
}

View File

@@ -18,15 +18,114 @@
*/
package org.alfresco.module.org_alfresco_module_rm.recordfolder;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName;
/**
* Record folder service interface
*
* TODO move methods from RecordManagementService
*
*
* @author Roy Wetherall
* @since 2.1
*/
public interface RecordFolderService
{
// TODO see RecordManagementService for Record Folder methods that need moving into this interface
/**
* @param nodeRef
*/
void initialiseRecordFolder(NodeRef nodeRef);
/**
* Indicates whether the given node is a record folder or not.
*
* @param nodeRef node reference
* @return boolean true if record folder, false otherwise
*/
boolean isRecordFolder(NodeRef nodeRef);
/**
* Indicates whether the contents of a record folder are all declared.
*
* @param nodeRef node reference (record folder)
* @return boolean true if record folder contents are declared, false otherwise
*/
boolean isRecordFolderDeclared(NodeRef nodeRef);
/**
* Indicates whether a record folder is closed or not.
*
* @param nodeRef node reference (record folder)
* @return boolean true if record folder is closed, false otherwise
*
* @since 2.0
*/
boolean isRecordFolderClosed(NodeRef nodeRef);
/**
* Create a record folder in the rm container. The record folder will take the name and type
* provided.
*
* @param rmContainer records management container
* @param name name
* @param type type
* @return NodeRef node reference of record folder
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type);
/**
* Create a record folder in the rm container. The record folder will take the name, type and
* properties provided.
*
* @param rmContainer records management container
* @param name name
* @param type type
* @param properties properties
* @return NodeRef node reference of record folder
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, QName type, Map<QName, Serializable> properties);
/**
* Create a record folder in the rm container. The record folder will take the name provided.
* Type defaults to rm:recordFolder.
*
* @param rmContainer records management container
* @param name name
* @return NodeRef node reference of record folder
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name);
/**
* Create a record folder in the rm container. The record folder will take the name and
* properties provided. Type defaults to rm:recordFolder.
*
* @param rmContainer records management container
* @param name name
* @param properties properties
* @return NodeRef node reference of record folder
*/
NodeRef createRecordFolder(NodeRef rmContainer, String name, Map<QName, Serializable> properties);
/**
* Get all the record folders that a record is filed into.
*
* @param record the record node reference
* @return List list of folder record node references
*/
// TODO rename to List<NodeRef> getParentRecordFolders(NodeRef record);
List<NodeRef> getRecordFolders(NodeRef record);
// TODO NodeRef getRecordFolderByPath(String path);
// TODO NodeRef getRecordFolderById(String id);
// TODO NodeRef getRecordFolderByName(NodeRef parent, String name);
// TODO void deleteRecordFolder(NodeRef recordFolder);
// TODO List<NodeRef> getParentRecordsManagementContainers(NodeRef container); // also applicable to record folders
// TODO rename to getContainedRecords(NodeRef recordFolder);
}

View File

@@ -18,11 +18,19 @@
*/
package org.alfresco.module.org_alfresco_module_rm.recordfolder;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
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.util.ServiceBaseImpl;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
@@ -30,42 +38,59 @@ import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.ParameterCheck;
import org.springframework.extensions.surf.util.I18NUtil;
/**
* Record Folder Service Implementation
*
*
* @author Roy Wetherall
* @since 2.1
*/
public class RecordFolderServiceImpl extends ServiceBaseImpl
implements RecordFolderService,
implements RecordFolderService,
RecordsManagementModel,
NodeServicePolicies.OnCreateChildAssociationPolicy
{
/** I18N */
private final static String MSG_RECORD_FOLDER_EXPECTED = "rm.service.record-folder-expected";
private final static String MSG_PARENT_RECORD_FOLDER_ROOT = "rm.service.parent-record-folder-root";
private final static String MSG_PARENT_RECORD_FOLDER_TYPE = "rm.service.parent-record-folder-type";
private final static String MSG_RECORD_FOLDER_TYPE = "rm.service.record-folder-type";
/** Policy component */
private PolicyComponent policyComponent;
/** Disposition service */
private DispositionService dispositionService;
/** Record Service */
private RecordService recordService;
/** File Plan Service */
private FilePlanService filePlanService;
/** Behaviours */
private JavaBehaviour onCreateChildAssociation
= new JavaBehaviour(this,
"onCreateChildAssociation",
private JavaBehaviour onCreateChildAssociation
= new JavaBehaviour(this,
"onCreateChildAssociation",
NotificationFrequency.FIRST_EVENT);
private JavaBehaviour onCreateChildAssociationInRecordFolderFolder
= new JavaBehaviour(this,
"onCreateChildAssociationInRecordFolder",
private JavaBehaviour onCreateChildAssociationInRecordFolderFolder
= new JavaBehaviour(this,
"onCreateChildAssociationInRecordFolder",
NotificationFrequency.FIRST_EVENT);
/**
* @param policyComponent policy component
* @param policyComponent policy component
*/
public void setPolicyComponent(PolicyComponent policyComponent)
{
this.policyComponent = policyComponent;
}
/**
* @param dispositionService disposition service
*/
@@ -73,21 +98,37 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
{
this.dispositionService = dispositionService;
}
/**
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/**
* Init method
*/
public void init()
{
policyComponent.bindAssociationBehaviour(
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_CATEGORY,
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_CATEGORY,
ContentModel.ASSOC_CONTAINS,
onCreateChildAssociation);
policyComponent.bindAssociationBehaviour(
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_FOLDER,
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_FOLDER,
ContentModel.ASSOC_CONTAINS,
onCreateChildAssociationInRecordFolderFolder);
}
@@ -101,10 +142,10 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
NodeRef nodeRef = childAssocRef.getChildRef();
if (nodeService.exists(nodeRef) == true)
{
initialiseRecordFolder(nodeRef);
initialiseRecordFolder(nodeRef);
}
}
/**
* Prevent folders being created within existing record folders.
*/
@@ -118,7 +159,7 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
{
throw new AlfrescoRuntimeException("You can't create a folder within an exisiting record folder.");
}
// ensure nothing is being added to a closed record folder
NodeRef recordFolder = childAssocRef.getParentRef();
Boolean isClosed = (Boolean) this.nodeService.getProperty(recordFolder, PROP_IS_CLOSED);
@@ -128,11 +169,11 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
}
}
}
/**
*
* @param nodeRef
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#initialiseRecordFolder(NodeRef)
*/
@Override
public void initialiseRecordFolder(NodeRef nodeRef)
{
// initialise disposition details
@@ -146,4 +187,169 @@ public class RecordFolderServiceImpl extends ServiceBaseImpl
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#isRecordFolder(NodeRef)
*/
@Override
public boolean isRecordFolder(NodeRef nodeRef)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
return instanceOf(nodeRef, TYPE_RECORD_FOLDER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#isRecordFolderDeclared(NodeRef)
*/
@Override
public boolean isRecordFolderDeclared(NodeRef nodeRef)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
// Check we have a record folder
if (isRecordFolder(nodeRef) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_EXPECTED));
}
boolean result = true;
// Check that each record in the record folder in declared
List<NodeRef> records = recordService.getRecords(nodeRef);
for (NodeRef record : records)
{
if (recordService.isDeclared(record) == false)
{
result = false;
break;
}
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#isRecordFolderClosed(NodeRef)
*/
@Override
public boolean isRecordFolderClosed(NodeRef nodeRef)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
// Check we have a record folder
if (isRecordFolder(nodeRef) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_EXPECTED));
}
return ((Boolean)this.nodeService.getProperty(nodeRef, PROP_IS_CLOSED)).booleanValue();
}
@Override
public NodeRef createRecordFolder(NodeRef rmContainer, String name,
QName type)
{
ParameterCheck.mandatory("rmContainer", rmContainer);
ParameterCheck.mandatoryString("name", name);
ParameterCheck.mandatory("type", type);
return createRecordFolder(rmContainer, name, type, null);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#createRecordFolder(NodeRef, String, QName, Map)
*/
@Override
public NodeRef createRecordFolder(NodeRef rmContainer, String name,
QName type, Map<QName, Serializable> properties)
{
ParameterCheck.mandatory("rmContainer", rmContainer);
ParameterCheck.mandatoryString("name", name);
ParameterCheck.mandatory("type", type);
ParameterCheck.mandatory("properties", properties);
// Check that we are not trying to create a record folder in a root container
if (filePlanService.isFilePlan(rmContainer) == true)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_PARENT_RECORD_FOLDER_ROOT));
}
// Check that the parent is a container
QName parentType = nodeService.getType(rmContainer);
if (TYPE_RECORD_CATEGORY.equals(parentType) == false &&
dictionaryService.isSubClass(parentType, TYPE_RECORD_CATEGORY) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_PARENT_RECORD_FOLDER_TYPE, parentType.toString()));
}
// Check that the the provided type is a sub-type of rm:recordFolder
if (TYPE_RECORD_FOLDER.equals(type) == false &&
dictionaryService.isSubClass(type, TYPE_RECORD_FOLDER) == false)
{
throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_RECORD_FOLDER_TYPE, type.toString()));
}
Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
if (properties != null && properties.size() != 0)
{
props.putAll(properties);
}
props.put(ContentModel.PROP_NAME, name);
return nodeService.createNode(
rmContainer,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name),
type,
props).getChildRef();
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#createRecordFolder(NodeRef, String)
*/
@Override
public NodeRef createRecordFolder(NodeRef rmContainer, String name)
{
ParameterCheck.mandatory("rmContainer", rmContainer);
ParameterCheck.mandatoryString("name", name);
// TODO defaults to rm:recordFolder, but in future could auto-detect sub-type of folder based on context
return createRecordFolder(rmContainer, name, TYPE_RECORD_FOLDER);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService#createRecordFolder(NodeRef, String, Map)
*/
@Override
public NodeRef createRecordFolder(NodeRef rmContainer, String name,
Map<QName, Serializable> properties)
{
ParameterCheck.mandatory("rmContainer", rmContainer);
ParameterCheck.mandatoryString("name", name);
ParameterCheck.mandatory("properties", properties);
return createRecordFolder(rmContainer, name, TYPE_RECORD_FOLDER, properties);
}
@Override
public List<NodeRef> getRecordFolders(NodeRef record)
{
ParameterCheck.mandatory("record", record);
List<NodeRef> result = new ArrayList<NodeRef>(1);
if (recordService.isRecord(record) == true)
{
List<ChildAssociationRef> assocs = this.nodeService.getParentAssocs(record, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef parent = assoc.getParentRef();
if (isRecordFolder(parent) == true)
{
result.add(parent);
}
}
}
return result;
}
}

View File

@@ -23,7 +23,6 @@ import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
@@ -36,22 +35,21 @@ import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
/**
*
*
* @author Neil McErlean
*/
public abstract class AbstractRmWebScript extends DeclarativeWebScript
{
protected NodeService nodeService;
protected RecordsManagementService rmService;
protected DispositionService dispositionService;
protected NamespaceService namespaceService;
/**
* Parses the request and providing it's valid returns the NodeRef.
*
*
* @param req The webscript request
* @return The NodeRef passed in the request
*
*
* @author Gavin Cornwell
*/
protected NodeRef parseRequestForNodeRef(WebScriptRequest req)
@@ -62,28 +60,18 @@ public abstract class AbstractRmWebScript extends DeclarativeWebScript
String storeType = templateVars.get("store_type");
String storeId = templateVars.get("store_id");
String nodeId = templateVars.get("id");
// create the NodeRef and ensure it is valid
StoreRef storeRef = new StoreRef(storeType, storeId);
NodeRef nodeRef = new NodeRef(storeRef, nodeId);
if (!this.nodeService.exists(nodeRef))
{
throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Unable to find node: " +
throw new WebScriptException(HttpServletResponse.SC_NOT_FOUND, "Unable to find node: " +
nodeRef.toString());
}
return nodeRef;
}
/**
* Sets the RecordsManagementService instance
*
* @param rmService The RecordsManagementService instance
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
return nodeRef;
}
/**
@@ -93,10 +81,10 @@ public abstract class AbstractRmWebScript extends DeclarativeWebScript
{
this.dispositionService = dispositionService;
}
/**
* Sets the NodeService instance
*
*
* @param nodeService The NodeService instance
*/
public void setNodeService(NodeService nodeService)
@@ -106,7 +94,7 @@ public abstract class AbstractRmWebScript extends DeclarativeWebScript
/**
* Sets the NamespaceService instance
*
*
* @param namespaceService The NamespaceService instance
*/
public void setNamespaceService(NamespaceService namespaceService)
@@ -116,7 +104,7 @@ public abstract class AbstractRmWebScript extends DeclarativeWebScript
/**
* This method checks if the json object contains an entry with the specified name.
*
*
* @param json the json object.
* @param paramName the name to check for.
* @throws WebScriptException if the specified entry is missing.
@@ -132,7 +120,7 @@ public abstract class AbstractRmWebScript extends DeclarativeWebScript
/**
* This method checks if the json object contains entries with the specified names.
*
*
* @param json the json object.
* @param paramNames the names to check for.
* @throws WebScriptException if any of the specified entries are missing.

View File

@@ -327,7 +327,7 @@ public class BootstrapTestDataGet extends DeclarativeWebScript
{
// Fire action to "set-up" the folder correctly
logger.info("Setting up bootstraped record folder: " + folderName);
RecordFolderServiceImpl recordService = (RecordFolderServiceImpl)applicationContext.getBean("recordFolderService");
RecordFolderServiceImpl recordService = (RecordFolderServiceImpl)applicationContext.getBean("RecordFolderService");
recordService.initialiseRecordFolder(recordFolder);
}
}

View File

@@ -28,21 +28,19 @@ import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminSe
import org.alfresco.service.cmr.dictionary.AssociationDefinition;
import org.alfresco.service.cmr.dictionary.ChildAssociationDefinition;
import org.alfresco.service.namespace.QName;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
/**
* Implementation for Java backed webscript to update RM custom reference definitions.
* There is currently only support for updating the label (for bidirectional references) or
* the source/target (for parent/child references).
*
*
* @author Neil McErlean
*/
public class CustomReferenceDefinitionPut extends AbstractRmWebScript
@@ -53,11 +51,8 @@ public class CustomReferenceDefinitionPut extends AbstractRmWebScript
private static final String SOURCE = "source";
private static final String LABEL = "label";
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(CustomReferenceDefinitionPut.class);
private RecordsManagementAdminService rmAdminService;
public void setRecordsManagementAdminService(RecordsManagementAdminService rmAdminService)
{
this.rmAdminService = rmAdminService;
@@ -74,7 +69,7 @@ public class CustomReferenceDefinitionPut extends AbstractRmWebScript
try
{
json = new JSONObject(new JSONTokener(req.getContent().getContent()));
ftlModel = updateCustomReference(req, json);
}
catch (IOException iox)
@@ -92,10 +87,10 @@ public class CustomReferenceDefinitionPut extends AbstractRmWebScript
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
iae.getMessage(), iae);
}
return ftlModel;
}
/**
* Applies custom properties.
*/
@@ -104,12 +99,12 @@ public class CustomReferenceDefinitionPut extends AbstractRmWebScript
{
Map<String, Object> result = new HashMap<String, Object>();
Map<String, Serializable> params = new HashMap<String, Serializable>();
for (Iterator iter = json.keys(); iter.hasNext(); )
{
String nextKeyString = (String)iter.next();
Serializable nextValue = (Serializable)json.get(nextKeyString);
params.put(nextKeyString, nextValue);
}
@@ -125,11 +120,11 @@ public class CustomReferenceDefinitionPut extends AbstractRmWebScript
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"Could not find reference definition for: " + refId);
}
String newLabel = (String)params.get(LABEL);
String newSource = (String)params.get(SOURCE);
String newTarget = (String)params.get(TARGET);
// Determine whether it's a bidi or a p/c ref
AssociationDefinition assocDef = rmAdminService.getCustomReferenceDefinitions().get(refQName);
if (assocDef == null)
@@ -137,7 +132,7 @@ public class CustomReferenceDefinitionPut extends AbstractRmWebScript
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"Could not find reference definition for: " + refId);
}
if (assocDef instanceof ChildAssociationDefinition)
{
if (newSource != null || newTarget != null)
@@ -149,11 +144,11 @@ public class CustomReferenceDefinitionPut extends AbstractRmWebScript
{
rmAdminService.updateCustomAssocDefinition(refQName, newLabel);
}
result.put(URL, req.getServicePath());
result.put("refId", refQName.getLocalName());
result.put("success", Boolean.TRUE);
return result;
}
}

View File

@@ -30,8 +30,6 @@ import org.alfresco.service.cmr.dictionary.ClassDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
@@ -39,24 +37,20 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
/**
* This class provides the implementation for the customisable.get webscript.
*
*
* @author Roy Wetherall
*/
public class CustomisableGet extends DeclarativeWebScript
{
/** Logger */
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(CustomisableGet.class);
/** Records management admin service */
private RecordsManagementAdminService rmAdminService;
/** Dictionary service */
private DictionaryService dictionaryService;
/** Namespace service */
private NamespaceService namespaceService;
/**
* @param rmAdminService records management admin service
*/
@@ -64,11 +58,11 @@ public class CustomisableGet extends DeclarativeWebScript
{
this.rmAdminService = rmAdminService;
}
/**
* @param namespaceService namespace service
*/
public void setNamespaceService(NamespaceService namespaceService)
public void setNamespaceService(NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
@@ -76,7 +70,7 @@ public class CustomisableGet extends DeclarativeWebScript
/**
* @param dictionaryService dictionary service
*/
public void setDictionaryService(DictionaryService dictionaryService)
public void setDictionaryService(DictionaryService dictionaryService)
{
this.dictionaryService = dictionaryService;
}
@@ -87,7 +81,7 @@ public class CustomisableGet extends DeclarativeWebScript
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
Set<QName> qnames = rmAdminService.getCustomisable();
ArrayList<Item> items = new ArrayList<Item>(qnames.size());
for (QName qname : qnames)
@@ -102,11 +96,11 @@ public class CustomisableGet extends DeclarativeWebScript
title = qname.getLocalName();
}
boolean isAspect = definition.isAspect();
items.add(new Item(name, isAspect, title));
}
}
// Sort the customisable types and aspects by title
Collections.sort(items, new Comparator<Item>()
{
@@ -115,11 +109,11 @@ public class CustomisableGet extends DeclarativeWebScript
{
return o1.title.compareToIgnoreCase(o2.title);
}});
model.put("items", items);
model.put("items", items);
return model;
}
/**
* Model items
*/
@@ -128,36 +122,36 @@ public class CustomisableGet extends DeclarativeWebScript
private String name;
private boolean isAspect;
private String title;
public Item(String name, boolean isAspect, String title)
{
this.name = name;
this.isAspect = isAspect;
this.title = title;
}
public String getName()
{
return name;
}
public boolean getIsAspect()
{
return isAspect;
}
public String getTitle()
{
return title;
}
@Override
public int hashCode()
{
int var_code = (null == name ? 0 : name.hashCode());
return 31 + var_code;
}
@Override
public boolean equals(Object obj)
{
@@ -170,5 +164,5 @@ public class CustomisableGet extends DeclarativeWebScript
return this.name.equals(((Item)obj).name);
}
}
}
}
}

View File

@@ -28,7 +28,6 @@ import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
@@ -50,8 +49,8 @@ import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.springframework.extensions.webscripts.WrappingWebScriptRequest;
import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest;
import org.springframework.extensions.webscripts.servlet.FormData.FormField;
import org.springframework.extensions.webscripts.servlet.WebScriptServletRequest;
import org.springframework.util.FileCopyUtils;
/**
@@ -73,7 +72,6 @@ public class ImportPost extends DeclarativeWebScript
protected NodeService nodeService;
protected DictionaryService dictionaryService;
protected ImporterService importerService;
protected RecordsManagementService rmService;
protected FilePlanRoleService filePlanRoleService;
protected FilePlanService filePlanService;
@@ -113,16 +111,6 @@ public class ImportPost extends DeclarativeWebScript
this.filePlanRoleService = filePlanRoleService;
}
/**
* Sets the RecordsManagementService instance
*
* @param rmService The RecordsManagementService instance
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* @param filePlanService file plan service
*/

View File

@@ -25,7 +25,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService;
@@ -54,7 +53,6 @@ import org.springframework.util.StringUtils;
*/
public class ListOfValuesGet extends DeclarativeWebScript
{
protected RecordsManagementService rmService;
protected RecordsManagementActionService rmActionService;
protected RecordsManagementAuditService rmAuditService;
protected RecordsManagementEventService rmEventService;
@@ -62,16 +60,6 @@ public class ListOfValuesGet extends DeclarativeWebScript
protected DictionaryService ddService;
protected NamespaceService namespaceService;
/**
* Sets the RecordsManagementService instance
*
* @param rmService The RecordsManagementService instance
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* Sets the RecordsManagementActionService instance
*

View File

@@ -26,7 +26,6 @@ import java.util.Date;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
@@ -59,7 +58,6 @@ public class TransferReportGet extends BaseTransferWebScript
protected static final String REPORT_FILE_SUFFIX = ".json";
protected DictionaryService ddService;
protected RecordsManagementService rmService;
protected DispositionService dispositionService;
protected ContentStreamer contentStreamer;
@@ -83,16 +81,6 @@ public class TransferReportGet extends BaseTransferWebScript
this.dispositionService = dispositionService;
}
/**
* Sets the RecordsManagementService instance
*
* @param rmService RecordsManagementService instance
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* @param contentStreamer
*/

View File

@@ -31,7 +31,6 @@ import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
@@ -77,7 +76,6 @@ public class TransferReportPost extends BaseTransferWebScript
protected DictionaryService ddService;
protected RecordsManagementActionService rmActionService;
protected RecordsManagementService rmService;
protected DispositionService dispositionService;
protected ContentService contentService;
@@ -91,16 +89,6 @@ public class TransferReportPost extends BaseTransferWebScript
this.ddService = ddService;
}
/**
* Sets the RecordsManagementService instance
*
* @param rmService RecordsManagementService instance
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* Sets the disposition service
*

View File

@@ -26,7 +26,6 @@ import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.role.Role;
@@ -42,7 +41,7 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
/**
* Implementation for Java backed webscript to return user rights report.
*
*
* @author Gavin Cornwell
*/
public class UserRightsReportGet extends DeclarativeWebScript
@@ -50,48 +49,39 @@ public class UserRightsReportGet extends DeclarativeWebScript
protected AuthorityService authorityService;
protected PersonService personService;
protected NodeService nodeService;
protected RecordsManagementService rmService;
protected FilePlanRoleService filePlanRoleService;
protected FilePlanService filePlanService;
/**
* Sets the AuthorityService instance
*
* @param authorityService AuthorityService instance
*
* @param authorityService AuthorityService instance
*/
public void setAuthorityService(AuthorityService authorityService)
{
this.authorityService = authorityService;
}
/**
* Sets the PersonService instance
*
* @param personService PersonService instance
*
* @param personService PersonService instance
*/
public void setPersonService(PersonService personService)
{
this.personService = personService;
}
/**
* Sets the NodeService instance
*
* @param nodeService NodeService instance
*
* @param nodeService NodeService instance
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
this.nodeService = nodeService;
}
/**
* @param recordsManagementService records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.rmService = recordsManagementService;
}
/**
* @param filePlanRoleService file plan role service
*/
@@ -99,15 +89,15 @@ public class UserRightsReportGet extends DeclarativeWebScript
{
this.filePlanRoleService = filePlanRoleService;
}
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/*
* @see org.alfresco.web.scripts.DeclarativeWebScript#executeImpl(org.alfresco.web.scripts.WebScriptRequest, org.alfresco.web.scripts.Status, org.alfresco.web.scripts.Cache)
*/
@@ -115,19 +105,19 @@ public class UserRightsReportGet extends DeclarativeWebScript
protected Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
NodeRef filePlanNode = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID);
if (filePlanNode == null)
{
status.setCode(HttpServletResponse.SC_BAD_REQUEST,
status.setCode(HttpServletResponse.SC_BAD_REQUEST,
"The default RM site could not be found.");
return null;
}
// construct all the maps etc. needed to build the model
// construct all the maps etc. needed to build the model
Map<String, UserModel> usersMap = new HashMap<String, UserModel>(8);
Map<String, RoleModel> rolesMap = new HashMap<String, RoleModel>(8);
Map<String, GroupModel> groupsMap = new HashMap<String, GroupModel>(8);
// iterate over all the roles for the file plan and construct models
Set<Role> roles = filePlanRoleService.getRoles(filePlanNode);
for (Role role : roles)
@@ -140,12 +130,12 @@ public class UserRightsReportGet extends DeclarativeWebScript
roleModel = new RoleModel(role);
rolesMap.put(roleName, roleModel);
}
// get the users for the current RM role
String group = role.getRoleGroupName();
Set<String> users = authorityService.getContainedAuthorities(AuthorityType.USER, group, true);
roleModel.setUsers(users);
// setup a user model object for each user
for (String userName : users)
{
@@ -153,30 +143,30 @@ public class UserRightsReportGet extends DeclarativeWebScript
if (userModel == null)
{
NodeRef userRef = this.personService.getPerson(userName);
userModel = new UserModel(userName,
(String)this.nodeService.getProperty(userRef, ContentModel.PROP_FIRSTNAME),
userModel = new UserModel(userName,
(String)this.nodeService.getProperty(userRef, ContentModel.PROP_FIRSTNAME),
(String)this.nodeService.getProperty(userRef, ContentModel.PROP_LASTNAME));
usersMap.put(userName, userModel);
}
userModel.addRole(roleName);
}
// get the groups for the cuurent RM role
Set<String> groups = authorityService.getContainedAuthorities(AuthorityType.GROUP, group, false);
roleModel.setGroups(groups);
// setup a user model object for each user in each group
for (String groupName : groups)
{
GroupModel groupModel = groupsMap.get(groupName);
if (groupModel == null)
{
groupModel = new GroupModel(groupName,
groupModel = new GroupModel(groupName,
authorityService.getAuthorityDisplayName(groupName));
groupsMap.put(groupName, groupModel);
}
// get users in each group
Set<String> groupUsers = this.authorityService.getContainedAuthorities(AuthorityType.USER, groupName, true);
for (String userName : groupUsers)
@@ -185,31 +175,31 @@ public class UserRightsReportGet extends DeclarativeWebScript
if (userModel == null)
{
NodeRef userRef = this.personService.getPerson(userName);
userModel = new UserModel(userName,
(String)this.nodeService.getProperty(userRef, ContentModel.PROP_FIRSTNAME),
userModel = new UserModel(userName,
(String)this.nodeService.getProperty(userRef, ContentModel.PROP_FIRSTNAME),
(String)this.nodeService.getProperty(userRef, ContentModel.PROP_LASTNAME));
usersMap.put(userName, userModel);
}
userModel.addGroup(groupName);
userModel.addRole(roleName);
groupModel.addUser(userName);
}
}
}
// add all the lists data to a Map
Map<String, Object> reportModel = new HashMap<String, Object>(4);
reportModel.put("users", usersMap);
reportModel.put("roles", rolesMap);
reportModel.put("groups", groupsMap);
// create model object with the lists model
Map<String, Object> model = new HashMap<String, Object>(1);
model.put("report", reportModel);
return model;
}
/**
* Class to represent a role for use in a Freemarker template.
*
@@ -219,43 +209,43 @@ public class UserRightsReportGet extends DeclarativeWebScript
{
private Set<String> users = new HashSet<String>(8);
private Set<String> groups = new HashSet<String>(8);
public RoleModel(Role role)
{
super(role.getName(), role.getDisplayLabel(), role.getCapabilities(), role.getRoleGroupName());
}
public void addUser(String username)
{
this.users.add(username);
}
public void addGroup(String groupName)
{
this.groups.add(groupName);
}
public void setUsers(Set<String> users)
{
this.users = users;
}
public void setGroups(Set<String> groups)
{
this.groups = groups;
}
public Set<String> getUsers()
{
return this.users;
}
public Set<String> getGroups()
{
return this.groups;
}
}
/**
* Class to represent a user for use in a Freemarker template.
*
@@ -268,7 +258,7 @@ public class UserRightsReportGet extends DeclarativeWebScript
private String lastName;
private Set<String> roles;
private Set<String> groups;
public UserModel(String userName, String firstName, String lastName)
{
this.userName = userName;
@@ -297,23 +287,23 @@ public class UserRightsReportGet extends DeclarativeWebScript
{
return this.roles;
}
public Set<String> getGroups()
{
return this.groups;
}
public void addRole(String roleName)
{
this.roles.add(roleName);
}
public void addGroup(String groupName)
{
this.groups.add(groupName);
}
}
/**
* Class to represent a group for use in a Freemarker template.
*
@@ -324,7 +314,7 @@ public class UserRightsReportGet extends DeclarativeWebScript
private String name;
private String label;
private Set<String> users;
public GroupModel(String name, String label)
{
this.name = name;
@@ -346,7 +336,7 @@ public class UserRightsReportGet extends DeclarativeWebScript
{
return this.users;
}
public void addUser(String userName)
{
this.users.add(userName);

View File

@@ -27,25 +27,20 @@ import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Records management event delete web script
*
*
* @author Roy Wetherall
*/
public class RmEventDelete extends DeclarativeWebScript
{
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmEventDelete.class);
/** Reccords management event service */
private RecordsManagementEventService rmEventService;
/**
* Set the records management event service
*
*
* @param rmEventService
*/
public void setRecordsManagementEventService(RecordsManagementEventService rmEventService)
@@ -60,7 +55,7 @@ public class RmEventDelete extends DeclarativeWebScript
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
// Event name
Map<String, String> templateVars = req.getServiceMatch().getTemplateVars();
String eventName = templateVars.get("eventname");
@@ -68,16 +63,16 @@ public class RmEventDelete extends DeclarativeWebScript
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "No event name was provided on the URL.");
}
// Check the event exists
if (rmEventService.existsEvent(eventName) == false)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "The event " + eventName + " does not exist.");
}
// Remove the event
rmEventService.removeEvent(eventName);
return model;
}
}

View File

@@ -28,25 +28,20 @@ import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Records management event GET web script
*
*
* @author Roy Wetherall
*/
public class RmEventGet extends DeclarativeWebScript
{
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmEventGet.class);
/** Reccords management event service */
private RecordsManagementEventService rmEventService;
/**
* Set the records management event service
*
*
* @param rmEventService
*/
public void setRecordsManagementEventService(RecordsManagementEventService rmEventService)
@@ -58,7 +53,7 @@ public class RmEventGet extends DeclarativeWebScript
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
// Event name
Map<String, String> templateVars = req.getServiceMatch().getTemplateVars();
String eventName = templateVars.get("eventname");
@@ -66,17 +61,17 @@ public class RmEventGet extends DeclarativeWebScript
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "No event name was provided on the URL.");
}
// Check the event exists
if (rmEventService.existsEvent(eventName) == false)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "The event " + eventName + " does not exist.");
}
// Get the event
RecordsManagementEvent event = rmEventService.getEvent(eventName);
model.put("event", event);
return model;
}
}

View File

@@ -28,25 +28,20 @@ import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Records management event types GET web script
*
*
* @author Roy Wetherall
*/
public class RmEventTypesGet extends DeclarativeWebScript
{
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmEventTypesGet.class);
/** Reccords management event service */
private RecordsManagementEventService rmEventService;
/**
* Set the records management event service
*
*
* @param rmEventService
*/
public void setRecordsManagementEventService(RecordsManagementEventService rmEventService)
@@ -58,11 +53,11 @@ public class RmEventTypesGet extends DeclarativeWebScript
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
// Get the events
List<RecordsManagementEventType> events = rmEventService.getEventTypes();
model.put("eventtypes", events);
return model;
}
}

View File

@@ -28,25 +28,20 @@ import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Records management events GET web script
*
*
* @author Roy Wetherall
*/
public class RmEventsGet extends DeclarativeWebScript
{
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmEventsGet.class);
/** Reccords management event service */
private RecordsManagementEventService rmEventService;
/**
* Set the records management event service
*
*
* @param rmEventService
*/
public void setRecordsManagementEventService(RecordsManagementEventService rmEventService)
@@ -58,11 +53,11 @@ public class RmEventsGet extends DeclarativeWebScript
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
// Get the events
List<RecordsManagementEvent> events = rmEventService.getEvents();
model.put("events", events);
return model;
}
}

View File

@@ -22,8 +22,6 @@ import java.util.HashMap;
import java.util.Map;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
@@ -31,15 +29,11 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
/**
* Delete role web script
*
*
* @author Roy Wetherall
*/
public class RmRoleDelete extends RoleDeclarativeWebScript
{
/** Logger */
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmRoleDelete.class);
/**
* @see org.springframework.extensions.webscripts.DeclarativeWebScript#executeImpl(org.springframework.extensions.webscripts.WebScriptRequest, org.springframework.extensions.webscripts.Status, org.springframework.extensions.webscripts.Cache)
*/
@@ -47,7 +41,7 @@ public class RmRoleDelete extends RoleDeclarativeWebScript
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
// Role name
Map<String, String> templateVars = req.getServiceMatch().getTemplateVars();
String roleParam = templateVars.get("rolename");
@@ -55,23 +49,23 @@ public class RmRoleDelete extends RoleDeclarativeWebScript
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "No role name was provided on the URL.");
}
// get the file plan
NodeRef filePlan = getFilePlan(req);
if (filePlan == null)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "File plan does not exist.");
}
// Check that the role exists
if (filePlanRoleService.existsRole(filePlan, roleParam) == false)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND,
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"The role " + roleParam + " does not exist on the records managment root " + filePlan.toString());
}
filePlanRoleService.deleteRole(filePlan, roleParam);
return model;
}
}

View File

@@ -22,8 +22,6 @@ import java.util.HashMap;
import java.util.Map;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
@@ -31,19 +29,16 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
/**
* Role GET web script API
*
*
* @author Roy Wetherall
*/
public class RmRoleGet extends RoleDeclarativeWebScript
{
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmRoleGet.class);
@Override
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
// Role name
Map<String, String> templateVars = req.getServiceMatch().getTemplateVars();
String roleParam = templateVars.get("rolename");
@@ -51,24 +46,24 @@ public class RmRoleGet extends RoleDeclarativeWebScript
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "No role name was provided on the URL.");
}
// get the file plan
NodeRef filePlan = getFilePlan(req);
if (filePlan == null)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "File plan does not exist.");
}
// Check that the role exists
if (filePlanRoleService.existsRole(filePlan, roleParam) == false)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND,
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"The role " + roleParam + " does not exist on the records managment root " + filePlan);
}
RoleItem item = new RoleItem(filePlanRoleService.getRole(filePlan, roleParam));
model.put("role", item);
return model;
}
}

View File

@@ -28,8 +28,6 @@ import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.role.Role;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -40,17 +38,14 @@ import org.springframework.extensions.webscripts.WebScriptException;
import org.springframework.extensions.webscripts.WebScriptRequest;
/**
*
*
*
*
* @author Roy Wetherall
*/
public class RmRolePut extends RoleDeclarativeWebScript
{
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmRolePut.class);
private CapabilityService capabilityService;
public void setCapabilityService(CapabilityService capabilityService)
{
this.capabilityService = capabilityService;
@@ -59,7 +54,7 @@ public class RmRolePut extends RoleDeclarativeWebScript
@Override
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
Map<String, Object> model = new HashMap<String, Object>();
JSONObject json = null;
try
{
@@ -70,38 +65,38 @@ public class RmRolePut extends RoleDeclarativeWebScript
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "No role name was provided on the URL.");
}
json = new JSONObject(new JSONTokener(req.getContent().getContent()));
String name = json.getString("name");
// TODO check
String displayLabel = json.getString("displayLabel");
// TODO check
JSONArray capabilitiesArray = json.getJSONArray("capabilities");
Set<Capability> capabilites = new HashSet<Capability>(capabilitiesArray.length());
for (int i = 0; i < capabilitiesArray.length(); i++)
{
Capability capability = capabilityService.getCapability(capabilitiesArray.getString(i));
Capability capability = capabilityService.getCapability(capabilitiesArray.getString(i));
capabilites.add(capability);
}
// get the file plan
NodeRef filePlan = getFilePlan(req);
if (filePlan == null)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "File plan does not exist.");
}
// Check that the role exists
if (filePlanRoleService.existsRole(filePlan, roleParam) == false)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND,
throw new WebScriptException(Status.STATUS_NOT_FOUND,
"The role " + roleParam + " does not exist on the records managment root " + filePlan);
}
Role role = filePlanRoleService.updateRole(filePlan, name, displayLabel, capabilites);
Role role = filePlanRoleService.updateRole(filePlan, name, displayLabel, capabilites);
model.put("role", new RoleItem(role));
}
catch (IOException iox)
{
@@ -113,7 +108,7 @@ public class RmRolePut extends RoleDeclarativeWebScript
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"Could not parse JSON from req.", je);
}
return model;
}
}

View File

@@ -24,8 +24,6 @@ import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.role.Role;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
@@ -38,10 +36,6 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
*/
public class RmRolesGet extends RoleDeclarativeWebScript
{
/** Logger */
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmRolesGet.class);
/**
* @see org.springframework.extensions.webscripts.DeclarativeWebScript#executeImpl(org.springframework.extensions.webscripts.WebScriptRequest, org.springframework.extensions.webscripts.Status, org.springframework.extensions.webscripts.Cache)
*/
@@ -57,7 +51,7 @@ public class RmRolesGet extends RoleDeclarativeWebScript
{
throw new WebScriptException(Status.STATUS_FOUND, "File plan does not exist.");
}
// get the includesystem parameter
boolean includeSystem = false;
String includeSystemValue = req.getParameter("is");

View File

@@ -28,8 +28,6 @@ import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService;
import org.alfresco.module.org_alfresco_module_rm.role.Role;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -41,16 +39,13 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
/**
* RM Roles Post implementation
*
*
* @author Roy Wetherall
*/
public class RmRolesPost extends RoleDeclarativeWebScript
{
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(RmRolesPost.class);
private CapabilityService capabilityService;
public void setCapabilityService(CapabilityService capabilityService)
{
this.capabilityService = capabilityService;
@@ -59,7 +54,7 @@ public class RmRolesPost extends RoleDeclarativeWebScript
@Override
public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache)
{
Map<String, Object> model = new HashMap<String, Object>();
Map<String, Object> model = new HashMap<String, Object>();
JSONObject json = null;
try
{
@@ -68,25 +63,25 @@ public class RmRolesPost extends RoleDeclarativeWebScript
// TODO check
String displayString = json.getString("displayLabel");
// TODO check
JSONArray capabilitiesArray = json.getJSONArray("capabilities");
Set<Capability> capabilites = new HashSet<Capability>(capabilitiesArray.length());
for (int i = 0; i < capabilitiesArray.length(); i++)
{
Capability capability = capabilityService.getCapability(capabilitiesArray.getString(i));
Capability capability = capabilityService.getCapability(capabilitiesArray.getString(i));
capabilites.add(capability);
}
// get the file plan
NodeRef filePlan = getFilePlan(req);
if (filePlan == null)
{
throw new WebScriptException(Status.STATUS_NOT_FOUND, "File plan does not exist.");
}
Role role = filePlanRoleService.createRole(filePlan, name, displayString, capabilites);
Role role = filePlanRoleService.createRole(filePlan, name, displayString, capabilites);
model.put("role", new RoleItem(role));
}
catch (IOException iox)
{
@@ -98,7 +93,7 @@ public class RmRolesPost extends RoleDeclarativeWebScript
throw new WebScriptException(Status.STATUS_BAD_REQUEST,
"Could not parse JSON from req.", je);
}
return model;
}
}

View File

@@ -45,7 +45,7 @@ import org.alfresco.util.ParameterCheck;
/**
* Extended security service implementation.
*
*
* @author Roy Wetherall
* @since 2.1
*/
@@ -57,19 +57,19 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
/** Ad hoc properties used for reference counting */
private final static QName PROP_EXTENDED_READER_ROLE = QName.createQName(RM_URI, "extendedReaderRole");
private final static QName PROP_EXTENDED_WRITER_ROLE = QName.createQName(RM_URI, "extendedWriterRole");
/** Policy component */
private PolicyComponent policyComponent;
/** Record service */
private RecordService recordService;
/** File plan service */
private FilePlanService filePlanService;
/** File plan role service */
private FilePlanRoleService filePlanRoleService;
/**
* @param policyComponent policy component
*/
@@ -77,7 +77,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
this.policyComponent = policyComponent;
}
/**
* @param recordService record service
*/
@@ -85,7 +85,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
this.recordService = recordService;
}
/**
* @param filePlanService file plan service
*/
@@ -93,7 +93,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
this.filePlanService = filePlanService;
}
/**
* @param filePlanRoleService file plan role service
*/
@@ -101,18 +101,18 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
this.filePlanRoleService = filePlanRoleService;
}
/**
* Init method
*/
public void init()
{
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnMoveNodePolicy.QNAME,
ASPECT_EXTENDED_SECURITY,
NodeServicePolicies.OnMoveNodePolicy.QNAME,
ASPECT_EXTENDED_SECURITY,
new JavaBehaviour(this, "onMoveNode", NotificationFrequency.TRANSACTION_COMMIT));
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService#hasExtendedSecurity(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -120,7 +120,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
return nodeService.hasAspect(nodeRef, ASPECT_EXTENDED_SECURITY);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#getExtendedReaders(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -129,16 +129,16 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
public Set<String> getExtendedReaders(NodeRef nodeRef)
{
Set<String> result = null;
Map<String, Integer> readerMap = (Map<String, Integer>)nodeService.getProperty(nodeRef, PROP_READERS);
if (readerMap != null)
{
result = readerMap.keySet();
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService#getExtendedWriters(org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -147,13 +147,13 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
public Set<String> getExtendedWriters(NodeRef nodeRef)
{
Set<String> result = null;
Map<String, Integer> map = (Map<String, Integer>)nodeService.getProperty(nodeRef, PROP_WRITERS);
if (map != null)
{
result = map.keySet();
}
return result;
}
@@ -165,7 +165,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
addExtendedSecurity(nodeRef, readers, writers, true);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService#addExtendedSecurity(org.alfresco.service.cmr.repository.NodeRef, java.util.Set, java.util.Set, boolean)
*/
@@ -174,45 +174,45 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
ParameterCheck.mandatory("nodeRef", nodeRef);
ParameterCheck.mandatory("applyToParents", applyToParents);
if (nodeRef != null)
{
addExtendedSecurityImpl(nodeRef, readers, writers, applyToParents);
}
}
@SuppressWarnings("unchecked")
private void addExtendedSecurityImpl(NodeRef nodeRef, Set<String> readers, Set<String> writers, boolean applyToParents)
{
ParameterCheck.mandatory("nodeRef", nodeRef);
ParameterCheck.mandatory("applyToParents", applyToParents);
// add the aspect if missing
if (nodeService.hasAspect(nodeRef, ASPECT_EXTENDED_SECURITY) == false)
{
nodeService.addAspect(nodeRef, ASPECT_EXTENDED_SECURITY, null);
}
// update the readers map
if (readers != null && readers.size() != 0)
{
// get reader map
Map<String, Integer> readersMap = (Map<String, Integer>)nodeService.getProperty(nodeRef, PROP_READERS);
// set the readers property (this will in turn apply the aspect if required)
nodeService.setProperty(nodeRef, PROP_READERS, (Serializable)addToMap(readersMap, readers));
}
// update the writers map
if (writers != null && writers.size() != 0)
{
// get writer map
Map<String, Integer> writersMap = (Map<String, Integer>)nodeService.getProperty(nodeRef, PROP_WRITERS);
// set the writers property (this will in turn apply the aspect if required)
nodeService.setProperty(nodeRef, PROP_WRITERS, (Serializable)addToMap(writersMap, writers));
}
// apply the readers to any renditions of the content
if (recordService.isRecord(nodeRef) == true)
{
@@ -223,12 +223,12 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
addExtendedSecurityImpl(child, readers, writers, false);
}
}
// add to the extended security roles
addExtendedSecurityRoles(nodeRef, readers, writers);
if (applyToParents == true)
{
{
// apply the extended readers up the file plan primary hierarchy
NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef();
if (parent != null &&
@@ -237,11 +237,11 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
addExtendedSecurityImpl(parent, readers, null, applyToParents);
addExtendedSecurityImpl(parent, writers, null, applyToParents);
}
}
}
}
/**
*
*
* @param nodeRef
* @param readers
* @param writers
@@ -249,13 +249,13 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
private void addExtendedSecurityRoles(NodeRef nodeRef, Set<String> readers, Set<String> writers)
{
NodeRef filePlan = filePlanService.getFilePlan(nodeRef);
addExtendedSecurityRolesImpl(filePlan, readers, PROP_EXTENDED_READER_ROLE, FilePlanRoleService.ROLE_EXTENDED_READERS);
addExtendedSecurityRolesImpl(filePlan, writers, PROP_EXTENDED_WRITER_ROLE, FilePlanRoleService.ROLE_EXTENDED_WRITERS);
}
}
/**
*
*
* @param filePlan
* @param authorities
* @param propertyName
@@ -268,9 +268,9 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
// get the reference count
Map<String, Integer> referenceCountMap = (Map<String, Integer>)nodeService.getProperty(filePlan, propertyName);
for (String authority : authorities)
{
{
if (authority.equals(PermissionService.ALL_AUTHORITIES) == false &&
authority.equals(PermissionService.OWNER_AUTHORITY) == false)
{
@@ -282,57 +282,55 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
}
}
}
// update the reference count
nodeService.setProperty(filePlan, propertyName, (Serializable)addToMap(referenceCountMap, authorities));
}
}
}
@SuppressWarnings("unused")
private void removeExtendedSecurityRoles(NodeRef nodeRef, Set<String> readers, Set<String> writers)
{
NodeRef filePlan = filePlanService.getFilePlan(nodeRef);
removeExtendedSecurityRolesImpl(filePlan, readers, PROP_EXTENDED_READER_ROLE, FilePlanRoleService.ROLE_EXTENDED_READERS);
removeExtendedSecurityRolesImpl(filePlan, writers, PROP_EXTENDED_WRITER_ROLE, FilePlanRoleService.ROLE_EXTENDED_WRITERS);
}
@SuppressWarnings("unchecked")
private void removeExtendedSecurityRolesImpl(NodeRef filePlan, Set<String> authorities, QName propertyName, String roleName)
{
if (authorities != null)
{
// get the reference count
Map<String, Integer> referenceCountMap = (Map<String, Integer>)nodeService.getProperty(filePlan, propertyName);
for (String authority : authorities)
{
if (authority.equals(PermissionService.ALL_AUTHORITIES) == false)
{
if (referenceCountMap == null)
{
// remove the authority from the role
filePlanRoleService.unassignRoleFromAuthority(filePlan, roleName, authority);
}
else
{
Integer count = referenceCountMap.get(authority);
if (count == null || count == 1)
{
// remove the authority from the role
filePlanRoleService.unassignRoleFromAuthority(filePlan, roleName, authority);
}
}
}
}
// update the reference count
nodeService.setProperty(filePlan, propertyName, (Serializable)removeFromMap(referenceCountMap, authorities));
}
}
// private void removeExtendedSecurityRoles(NodeRef nodeRef, Set<String> readers, Set<String> writers)
// {
// NodeRef filePlan = filePlanService.getFilePlan(nodeRef);
//
// removeExtendedSecurityRolesImpl(filePlan, readers, PROP_EXTENDED_READER_ROLE, FilePlanRoleService.ROLE_EXTENDED_READERS);
// removeExtendedSecurityRolesImpl(filePlan, writers, PROP_EXTENDED_WRITER_ROLE, FilePlanRoleService.ROLE_EXTENDED_WRITERS);
// }
//
// private void removeExtendedSecurityRolesImpl(NodeRef filePlan, Set<String> authorities, QName propertyName, String roleName)
// {
// if (authorities != null)
// {
// // get the reference count
// Map<String, Integer> referenceCountMap = (Map<String, Integer>)nodeService.getProperty(filePlan, propertyName);
//
// for (String authority : authorities)
// {
// if (authority.equals(PermissionService.ALL_AUTHORITIES) == false)
// {
// if (referenceCountMap == null)
// {
// // remove the authority from the role
// filePlanRoleService.unassignRoleFromAuthority(filePlan, roleName, authority);
// }
// else
// {
// Integer count = referenceCountMap.get(authority);
// if (count == null || count == 1)
// {
// // remove the authority from the role
// filePlanRoleService.unassignRoleFromAuthority(filePlan, roleName, authority);
// }
// }
// }
// }
//
// // update the reference count
// nodeService.setProperty(filePlan, propertyName, (Serializable)removeFromMap(referenceCountMap, authorities));
// }
// }
/**
*
*
* @param map
* @param keys
* @return
@@ -344,7 +342,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
// create map
map = new HashMap<String, Integer>(7);
}
for (String key : keys)
{
if (key.equals(PermissionService.ALL_AUTHORITIES) == false)
@@ -362,24 +360,24 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
}
}
}
return map;
}
@Override
public void removeExtendedSecurity(NodeRef nodeRef, Set<String> readers, Set<String> writers)
{
removeExtendedSecurity(nodeRef, readers, writers, true);
removeExtendedSecurity(nodeRef, readers, writers, true);
}
@Override
public void removeExtendedSecurity(NodeRef nodeRef, Set<String> readers, Set<String>writers, boolean applyToParents)
{
if (hasExtendedSecurity(nodeRef) == true)
{
removeExtendedSecurityImpl(nodeRef, readers, writers);
// remove the readers from any renditions of the content
if (recordService.isRecord(nodeRef) == true)
{
@@ -390,7 +388,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
removeExtendedSecurityImpl(child, readers, writers);
}
}
if (applyToParents == true)
{
// apply the extended readers up the file plan primary hierarchy
@@ -400,16 +398,16 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
removeExtendedSecurity(parent, readers, null, applyToParents);
removeExtendedSecurity(parent, writers, null, applyToParents);
}
}
}
}
}
/**
* Removes a set of readers and writers from a node reference.
* <p>
* Removes the aspect and resets the property to null if all readers and writers are removed.
*
*
* @param nodeRef node reference
* @param readers {@link Set} of readers
* @param writers {@link Set} of writers
@@ -419,17 +417,17 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
{
Map<String, Integer> readersMap = (Map<String, Integer>)nodeService.getProperty(nodeRef, PROP_READERS);
nodeService.setProperty(nodeRef, PROP_READERS, (Serializable)removeFromMap(readersMap, readers));
Map<String, Integer> writersMap = (Map<String, Integer>)nodeService.getProperty(nodeRef, PROP_WRITERS);
nodeService.setProperty(nodeRef, PROP_WRITERS, (Serializable)removeFromMap(writersMap, writers));
if (readersMap == null && writersMap == null)
{
// remove the aspect
nodeService.removeAspect(nodeRef, ASPECT_EXTENDED_SECURITY);
}
}
}
private Map<String, Integer> removeFromMap(Map<String, Integer> map, Set<String> keys)
{
if (map != null && keys != null && keys.size() != 0)
@@ -456,29 +454,29 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
}
}
}
// reset the map to null if now empty
if (map != null && map.isEmpty() == true)
{
map = null;
}
return map;
}
@Override
public void removeAllExtendedSecurity(NodeRef nodeRef)
{
removeAllExtendedSecurity(nodeRef, true);
}
@Override
public void removeAllExtendedSecurity(NodeRef nodeRef, boolean applyToParents)
{
if (hasExtendedSecurity(nodeRef) == true)
{
removeExtendedSecurity(nodeRef, getExtendedReaders(nodeRef), getExtendedWriters(nodeRef));
}
removeExtendedSecurity(nodeRef, getExtendedReaders(nodeRef), getExtendedWriters(nodeRef));
}
}
/**
@@ -487,7 +485,7 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
@Override
public void onMoveNode(final ChildAssociationRef origAssoc, final ChildAssociationRef newAssoc)
{
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
{
@Override
public Void doWork() throws Exception
@@ -495,13 +493,13 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl
NodeRef record = newAssoc.getChildRef();
NodeRef newParent = newAssoc.getParentRef();
NodeRef oldParent = origAssoc.getParentRef();
Set<String> readers = getExtendedReaders(record);
Set<String> writers = getExtendedWriters(record);
addExtendedSecurity(newParent, readers, writers);
removeExtendedSecurity(oldParent, readers, writers);
return null;
}
});

View File

@@ -23,11 +23,11 @@ import java.util.List;
import java.util.Set;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
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.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
@@ -48,7 +48,7 @@ import org.apache.commons.logging.LogFactory;
/**
* File plan permission service.
*
*
* @author Roy Wetherall
* @since 2.1
*/
@@ -62,18 +62,18 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
/** Policy component */
protected PolicyComponent policyComponent;
/** Records management service */
protected RecordsManagementService recordsManagementService;
/** File plan service */
protected FilePlanService filePlanService;
/** Record service */
protected RecordService recordService;
/** Record folder service */
protected RecordFolderService recordFolderService;
/** Logger */
protected static Log logger = LogFactory.getLog(FilePlanPermissionServiceImpl.class);
/**
* Initialisation method
*/
@@ -88,23 +88,23 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
TYPE_RECORD_FOLDER,
new JavaBehaviour(this, "onCreateRecordFolder", NotificationFrequency.TRANSACTION_COMMIT));
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnAddAspectPolicy.QNAME,
ASPECT_RECORD,
NodeServicePolicies.OnAddAspectPolicy.QNAME,
ASPECT_RECORD,
new JavaBehaviour(this, "onAddRecord", NotificationFrequency.TRANSACTION_COMMIT));
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnMoveNodePolicy.QNAME,
ASPECT_RECORD,
NodeServicePolicies.OnMoveNodePolicy.QNAME,
ASPECT_RECORD,
new JavaBehaviour(this, "onMoveRecord", NotificationFrequency.TRANSACTION_COMMIT));
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnCreateNodePolicy.QNAME,
TYPE_HOLD,
NodeServicePolicies.OnCreateNodePolicy.QNAME,
TYPE_HOLD,
new JavaBehaviour(this, "onCreateHoldTransfer", NotificationFrequency.TRANSACTION_COMMIT));
policyComponent.bindClassBehaviour(
NodeServicePolicies.OnCreateNodePolicy.QNAME,
TYPE_TRANSFER,
NodeServicePolicies.OnCreateNodePolicy.QNAME,
TYPE_TRANSFER,
new JavaBehaviour(this, "onCreateHoldTransfer", NotificationFrequency.TRANSACTION_COMMIT));
}
/**
* @param permissionService permission service
*/
@@ -112,7 +112,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
this.permissionService = permissionService;
}
/**
* @param nodeService node service
*/
@@ -120,7 +120,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
this.nodeService = nodeService;
}
/**
* @param policyComponent policy component
*/
@@ -128,15 +128,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
this.policyComponent = policyComponent;
}
/**
* @param recordsManagementService records management service
*/
public void setRecordsManagementService(RecordsManagementService recordsManagementService)
{
this.recordsManagementService = recordsManagementService;
}
/**
* @param filePlanService file plan service
*/
@@ -144,7 +136,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
this.filePlanService = filePlanService;
}
/**
* @param recordService record service
*/
@@ -153,6 +145,14 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
this.recordService = recordService;
}
/**
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* @param childAssocRef
*/
@@ -208,7 +208,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
public void onCreateRecordFolder(ChildAssociationRef childAssocRef)
{
final NodeRef folderNodeRef = childAssocRef.getChildRef();
// initialise the permissions
setUpPermissions(folderNodeRef);
@@ -245,12 +245,12 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
}, AuthenticationUtil.getSystemUserName());
}
}
/**
* Sets ups records permission when aspect is added.
*
*
* @see NodeServicePolicies.OnAddAspectPolicy#onAddAspect(NodeRef, QName)
*
*
* @param record
* @param aspectTypeQName
*/
@@ -262,18 +262,18 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
if (nodeService.exists(record) == true && nodeService.hasAspect(record, aspectTypeQName) == true)
{
NodeRef recordFolder = nodeService.getPrimaryParent(record).getParentRef();
NodeRef recordFolder = nodeService.getPrimaryParent(record).getParentRef();
initialiseRecordPermissions(record, recordFolder);
}
return null;
}
}, AuthenticationUtil.getSystemUserName());
}, AuthenticationUtil.getSystemUserName());
}
/**
* Sets up permissions for transfer and hold objects
*
*
* @param childAssocRef
*/
public void onCreateHoldTransfer(final ChildAssociationRef childAssocRef)
@@ -286,7 +286,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
if (nodeService.exists(nodeRef) == true)
{
setUpPermissions(nodeRef);
NodeRef parent = childAssocRef.getParentRef();
Set<AccessPermission> perms = permissionService.getAllSetPermissions(parent);
for (AccessPermission perm : perms)
@@ -308,24 +308,24 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
}
}
}
return null;
}
});
}
/**
* Initialise the record permissions for the given parent.
*
*
* NOTE: method is public so it can be accessed via the associated patch bean.
*
* @param record record
*
* @param record record
* @param parent records permission parent
*/
public void initialiseRecordPermissions(NodeRef record, NodeRef parent)
{
setUpPermissions(record);
Set<AccessPermission> perms = permissionService.getAllSetPermissions(parent);
for (AccessPermission perm : perms)
{
@@ -345,12 +345,12 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
allow);
}
}
}
/**
* onMoveRecord behaviour
*
*
* @param sourceAssocRef source association reference
* @param destinationAssocRef destination association reference
*/
@@ -364,7 +364,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
if (nodeService.exists(record) == true && nodeService.hasAspect(record, ASPECT_RECORD) == true)
{
Set<AccessPermission> keepPerms = new HashSet<AccessPermission>(5);
// record any permissions specifically set on the record (ie any filling or record_file permisions not on the parent)
Set<AccessPermission> origionalParentPerms = permissionService.getAllSetPermissions(sourceAssocRef.getParentRef());
Set<AccessPermission> origionalRecordPerms= permissionService.getAllSetPermissions(record);
@@ -374,7 +374,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(perm.getAuthority()) == false)
{
if ((perm.getPermission().equals(RMPermissionModel.FILING) == true ||
perm.getPermission().equals(RMPermissionModel.FILE_RECORDS) == true) &&
perm.getPermission().equals(RMPermissionModel.FILE_RECORDS) == true) &&
origionalParentPerms.contains(perm) == false)
{
// then we can assume this is a permission we want to preserve
@@ -382,20 +382,20 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
}
}
}
// clear all existing permissions and start again
permissionService.deletePermissions(record);
// re-setup the records permissions
initialiseRecordPermissions(record, destinationAssocRef.getParentRef());
// re-add keep'er permissions
for (AccessPermission keeper : keepPerms)
{
setPermission(record, keeper.getAuthority(), keeper.getPermission());
}
}
return null;
}
}, AuthenticationUtil.getSystemUserName());
@@ -424,7 +424,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
}
}, AuthenticationUtil.getSystemUserName());
}
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#setPermission(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String, boolean)
@@ -443,8 +443,8 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
setPermissionDown(nodeRef, authority, permission);
}
else if (filePlanService.isFilePlanContainer(nodeRef) == true ||
recordsManagementService.isRecordFolder(nodeRef) == true ||
else if (filePlanService.isFilePlanContainer(nodeRef) == true ||
recordFolderService.isRecordFolder(nodeRef) == true ||
recordService.isRecord(nodeRef) == true)
{
setReadPermissionUp(nodeRef, authority);
@@ -477,17 +477,17 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
setReadPermissionUpImpl(parent, authority);
}
}
/**
* Helper method used to set the read permission up the hierarchy
*
*
* @param nodeRef node reference
* @param authority authority
*/
private void setReadPermissionUpImpl(NodeRef nodeRef, String authority)
{
setPermissionImpl(nodeRef, authority, RMPermissionModel.READ_RECORDS);
NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef();
if (parent != null && filePlanService.isFilePlanComponent(parent) == true)
{
@@ -509,16 +509,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
// set permissions
setPermissionImpl(nodeRef, authority, permission);
if (filePlanService.isFilePlanContainer(nodeRef) == true ||
recordsManagementService.isRecordFolder(nodeRef) == true)
{
recordFolderService.isRecordFolder(nodeRef) == true)
{
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef child = assoc.getChildRef();
if (filePlanService.isFilePlanContainer(child) == true ||
recordsManagementService.isRecordFolder(child) == true ||
recordFolderService.isRecordFolder(child) == true ||
recordService.isRecord(child) == true ||
instanceOf(child, TYPE_HOLD) == true ||
instanceOf(child, TYPE_TRANSFER) == true)
@@ -562,16 +562,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
{
// Delete permission on this node
permissionService.deletePermission(nodeRef, authority, permission);
if (filePlanService.isFilePlanContainer(nodeRef) == true ||
recordsManagementService.isRecordFolder(nodeRef) == true)
recordFolderService.isRecordFolder(nodeRef) == true)
{
List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL);
for (ChildAssociationRef assoc : assocs)
{
NodeRef child = assoc.getChildRef();
if (filePlanService.isFilePlanContainer(child) == true ||
recordsManagementService.isRecordFolder(child) == true ||
recordFolderService.isRecordFolder(child) == true ||
recordService.isRecord(child) == true||
instanceOf(child, TYPE_HOLD) == true ||
instanceOf(child, TYPE_TRANSFER) == true)

View File

@@ -28,7 +28,7 @@ import org.apache.commons.logging.LogFactory;
/**
* Reviewed action.
*
*
* @author Neil McErlean
*/
public class ReviewedAction extends RMActionExecuterAbstractBase
@@ -36,7 +36,7 @@ public class ReviewedAction extends RMActionExecuterAbstractBase
private static Log logger = LogFactory.getLog(ReviewedAction.class);
/**
*
*
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action,
* org.alfresco.service.cmr.repository.NodeRef)
*/
@@ -50,19 +50,19 @@ public class ReviewedAction extends RMActionExecuterAbstractBase
{
reviewRecord(actionedUponNodeRef, vrDef);
}
else if (recordsManagementService.isRecordFolder(actionedUponNodeRef) == true)
else if (recordFolderService.isRecordFolder(actionedUponNodeRef) == true)
{
for (NodeRef record : recordsManagementService.getRecords(actionedUponNodeRef))
for (NodeRef record : recordService.getRecords(actionedUponNodeRef))
{
reviewRecord(record, vrDef);
}
}
}
}
/**
* Make record as reviewed.
*
*
* @param nodeRef
* @param vrDef
*/
@@ -82,7 +82,7 @@ public class ReviewedAction extends RMActionExecuterAbstractBase
.append(nodeRef);
logger.debug(msg.toString());
}
this.nodeService.setProperty(nodeRef, PROP_REVIEW_AS_OF, reviewAsOf);
//TODO And record previous review date, time, user
}

View File

@@ -24,11 +24,11 @@ import java.util.HashMap;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService;
import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService;
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.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.module.org_alfresco_module_rm.security.FilePlanAuthenticationService;
import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
@@ -46,11 +46,11 @@ import org.alfresco.util.PropertyMap;
/**
* Vital record service interface implementation.
*
*
* @author Roy Wetherall
* @since 2.0
*/
public class VitalRecordServiceImpl implements VitalRecordService,
public class VitalRecordServiceImpl implements VitalRecordService,
RecordsManagementModel,
NodeServicePolicies.OnUpdatePropertiesPolicy,
NodeServicePolicies.OnCreateChildAssociationPolicy
@@ -58,15 +58,15 @@ public class VitalRecordServiceImpl implements VitalRecordService,
/** Services */
private NodeService nodeService;
private PolicyComponent policyComponent;
private RecordsManagementService rmService;
private RecordsManagementActionService rmActionService;
private FilePlanAuthenticationService filePlanAuthenticationService;
private FilePlanService filePlanService;
private RecordFolderService recordFolderService;
/** Behaviours */
private JavaBehaviour onUpdateProperties;
private JavaBehaviour onCreateChildAssociation;
/**
* @param nodeService node service
*/
@@ -74,7 +74,7 @@ public class VitalRecordServiceImpl implements VitalRecordService,
{
this.nodeService = nodeService;
}
/**
* @param policyComponent policy component
*/
@@ -82,15 +82,7 @@ public class VitalRecordServiceImpl implements VitalRecordService,
{
this.policyComponent = policyComponent;
}
/**
* @param rmService records management service
*/
public void setRecordsManagementService(RecordsManagementService rmService)
{
this.rmService = rmService;
}
/**
* @param rmActionService records management action service
*/
@@ -98,20 +90,28 @@ public class VitalRecordServiceImpl implements VitalRecordService,
{
this.rmActionService = rmActionService;
}
public void setFilePlanAuthenticationService(FilePlanAuthenticationService filePlanAuthenticationService)
{
this.filePlanAuthenticationService = filePlanAuthenticationService;
}
/**
* @param filePlanService file plan service
*/
public void setFilePlanService(FilePlanService filePlanService)
public void setFilePlanService(FilePlanService filePlanService)
{
this.filePlanService = filePlanService;
}
/**
* @param recordFolderService
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* Init method.
*/
@@ -122,16 +122,16 @@ public class VitalRecordServiceImpl implements VitalRecordService,
NodeServicePolicies.OnUpdatePropertiesPolicy.QNAME,
ASPECT_VITAL_RECORD_DEFINITION,
onUpdateProperties);
onCreateChildAssociation = new JavaBehaviour(this, "onCreateChildAssociation", NotificationFrequency.TRANSACTION_COMMIT);
onCreateChildAssociation = new JavaBehaviour(this, "onCreateChildAssociation", NotificationFrequency.TRANSACTION_COMMIT);
policyComponent.bindAssociationBehaviour(
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_FOLDER,
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_FOLDER,
ContentModel.ASSOC_CONTAINS,
onCreateChildAssociation);
policyComponent.bindAssociationBehaviour(
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_CATEGORY,
NodeServicePolicies.OnCreateChildAssociationPolicy.QNAME,
TYPE_RECORD_CATEGORY,
ContentModel.ASSOC_CONTAINS,
onCreateChildAssociation);
}
@@ -142,7 +142,7 @@ public class VitalRecordServiceImpl implements VitalRecordService,
@Override
public void onUpdateProperties(final NodeRef nodeRef, Map<QName, Serializable> before, Map<QName, Serializable> after)
{
if (nodeService.exists(nodeRef) == true &&
if (nodeService.exists(nodeRef) == true &&
nodeService.hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT) == true)
{
// check that vital record definition has been changed in the first place
@@ -160,9 +160,9 @@ public class VitalRecordServiceImpl implements VitalRecordService,
}}
);
}
}
}
}
/**
* @see org.alfresco.repo.node.NodeServicePolicies.OnCreateChildAssociationPolicy#onCreateChildAssociation(org.alfresco.service.cmr.repository.ChildAssociationRef, boolean)
*/
@@ -174,7 +174,7 @@ public class VitalRecordServiceImpl implements VitalRecordService,
if (nodeService.exists(nodeRef) == true)
{
onCreateChildAssociation.disable();
onUpdateProperties.disable();
onUpdateProperties.disable();
try
{
AuthenticationUtil.runAsSystem(new RunAsWork<Void>()
@@ -183,11 +183,11 @@ public class VitalRecordServiceImpl implements VitalRecordService,
public Void doWork() throws Exception
{
if (filePlanService.isRecordCategory(nodeRef) == true ||
rmService.isRecordFolder(nodeRef) == true)
recordFolderService.isRecordFolder(nodeRef) == true)
{
inheritVitalRecordDefinition(nodeRef);
}
return null;
}
});
@@ -195,15 +195,15 @@ public class VitalRecordServiceImpl implements VitalRecordService,
finally
{
onCreateChildAssociation.enable();
onUpdateProperties.enable();
onUpdateProperties.enable();
}
}
}
}
/**
* Helper method to set the inherited vital record definition details.
*
*
* @param nodeRef node reference
*/
private void inheritVitalRecordDefinition(NodeRef nodeRef)
@@ -212,12 +212,12 @@ public class VitalRecordServiceImpl implements VitalRecordService,
Period currentReviewPeriod = (Period)nodeService.getProperty(nodeRef, PROP_REVIEW_PERIOD);
if (currentReviewPeriod == null ||
PERIOD_NONE.equals(currentReviewPeriod) == true)
{
{
// get the immediate parent
NodeRef parentRef = nodeService.getPrimaryParent(nodeRef).getParentRef();
// is the parent a record category
if (parentRef != null &&
if (parentRef != null &&
FilePlanComponentKind.RECORD_CATEGORY.equals(filePlanService.getFilePlanComponentKind(parentRef)) == true)
{
// is the child a record category or folder
@@ -226,22 +226,22 @@ public class VitalRecordServiceImpl implements VitalRecordService,
kind.equals(FilePlanComponentKind.RECORD_FOLDER) == true)
{
// set the vital record definition values to match that of the parent
nodeService.setProperty(nodeRef,
PROP_VITAL_RECORD_INDICATOR,
nodeService.setProperty(nodeRef,
PROP_VITAL_RECORD_INDICATOR,
nodeService.getProperty(parentRef, PROP_VITAL_RECORD_INDICATOR));
nodeService.setProperty(nodeRef,
PROP_REVIEW_PERIOD,
nodeService.setProperty(nodeRef,
PROP_REVIEW_PERIOD,
nodeService.getProperty(parentRef, PROP_REVIEW_PERIOD));
}
}
}
}
}
/**
* Helper method used by services with access to the private bean to initialise vital record details.
*
*
* TODO consider what (if any of this) should be on the public interface
*
*
* @param nodeRef node reference to initialise with vital record details
*/
public void initialiseVitalRecord(NodeRef nodeRef)
@@ -255,7 +255,7 @@ public class VitalRecordServiceImpl implements VitalRecordService,
{
Map<QName, Serializable> reviewProps = new HashMap<QName, Serializable>(1);
reviewProps.put(RecordsManagementModel.PROP_REVIEW_AS_OF, reviewAsOf);
if (nodeService.hasAspect(nodeRef, ASPECT_VITAL_RECORD) == false)
{
nodeService.addAspect(nodeRef, RecordsManagementModel.ASPECT_VITAL_RECORD, reviewProps);
@@ -267,7 +267,7 @@ public class VitalRecordServiceImpl implements VitalRecordService,
nodeService.setProperties(nodeRef, props);
}
}
}
}
else
{
// if we are re-filling then remove the vital aspect if it is not longer a vital record
@@ -277,14 +277,14 @@ public class VitalRecordServiceImpl implements VitalRecordService,
}
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getVitalRecordDefinition(org.alfresco.service.cmr.repository.NodeRef)
* @see VitalRecordService#getVitalRecordDefinition(NodeRef)
*/
public VitalRecordDefinition getVitalRecordDefinition(NodeRef nodeRef)
{
VitalRecordDefinition result = null;
FilePlanComponentKind kind = filePlanService.getFilePlanComponentKind(nodeRef);
if (FilePlanComponentKind.RECORD.equals(kind) == true)
{
@@ -297,28 +297,28 @@ public class VitalRecordServiceImpl implements VitalRecordService,
result = VitalRecordDefinitionImpl.create(nodeService, nodeRef);
}
}
return result;
}
/**
* Resolves the record vital definition.
* <p>
* NOTE: Currently we only support the resolution of the vital record definition from the
* NOTE: Currently we only support the resolution of the vital record definition from the
* primary record parent. ie the record folder the record was originally filed within.
* <p>
* TODO: Add an algorithm to resolve the correct vital record definition when a record is filed in many
* record folders.
*
*
* @param record
* @return VitalRecordDefinition
*/
private VitalRecordDefinition resolveVitalRecordDefinition(NodeRef record)
{
NodeRef parent = nodeService.getPrimaryParent(record).getParentRef();
return getVitalRecordDefinition(parent);
return getVitalRecordDefinition(parent);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService#setVitalRecordDefintion(org.alfresco.service.cmr.repository.NodeRef, boolean, org.alfresco.service.cmr.repository.Period)
*/
@@ -328,16 +328,16 @@ public class VitalRecordServiceImpl implements VitalRecordService,
// Check params
ParameterCheck.mandatory("nodeRef", nodeRef);
ParameterCheck.mandatory("enabled", enabled);
// Set the properties (will automatically add the vital record definition aspect)
nodeService.setProperty(nodeRef, PROP_VITAL_RECORD_INDICATOR, enabled);
nodeService.setProperty(nodeRef, PROP_REVIEW_PERIOD, reviewPeriod);
return new VitalRecordDefinitionImpl(enabled, reviewPeriod);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#isVitalRecord(org.alfresco.service.cmr.repository.NodeRef)
* @see VitalRecordService#isVitalRecord(NodeRef)
*/
public boolean isVitalRecord(NodeRef nodeRef)
{

View File

@@ -20,7 +20,6 @@ package org.alfresco.workflow.requestInfo;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.util.ParameterCheck;
import org.springframework.extensions.surf.util.I18NUtil;
@@ -92,16 +91,15 @@ public class RequestInfoNotifier implements TaskListener
* @param recordName The name of the record
* @return Returns the email subject
*/
@SuppressWarnings("unused")
private String getEmailSubject(String recordName)
{
StringBuilder sb = new StringBuilder();
sb.append(I18NUtil.getMessage("activitiReviewPooled.workflow.email.subject"));
sb.append(" '");
sb.append(recordName);
sb.append("'");
return sb.toString();
}
// private String getEmailSubject(String recordName)
// {
// StringBuilder sb = new StringBuilder();
// sb.append(I18NUtil.getMessage("activitiReviewPooled.workflow.email.subject"));
// sb.append(" '");
// sb.append(recordName);
// sb.append("'");
// return sb.toString();
// }
/**
* Helper method for building the email body
@@ -109,18 +107,17 @@ public class RequestInfoNotifier implements TaskListener
* @param recordName The name of the record
* @return Returns the email body
*/
@SuppressWarnings("unused")
private String getEmailBody(String recordName)
{
StringBuilder sb = new StringBuilder();
sb.append(I18NUtil.getMessage("activitiReviewPooled.workflow.email.body1"));
sb.append(" '");
sb.append(AuthenticationUtil.getFullyAuthenticatedUser());
sb.append("' ");
sb.append(I18NUtil.getMessage("activitiReviewPooled.workflow.email.body2"));
sb.append(" '");
sb.append(recordName);
sb.append("'.");
return sb.toString();
}
// private String getEmailBody(String recordName)
// {
// StringBuilder sb = new StringBuilder();
// sb.append(I18NUtil.getMessage("activitiReviewPooled.workflow.email.body1"));
// sb.append(" '");
// sb.append(AuthenticationUtil.getFullyAuthenticatedUser());
// sb.append("' ");
// sb.append(I18NUtil.getMessage("activitiReviewPooled.workflow.email.body2"));
// sb.append(" '");
// sb.append(recordName);
// sb.append("'.");
// return sb.toString();
// }
}