From 315eb8ce1601887470e0a3b8727254b95be4e48b Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Thu, 6 Sep 2012 10:40:18 +0000 Subject: [PATCH] RM-486 (RM Data Set Service) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@41313 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-service-context.xml | 73 ++++ .../dataset/DataSet.java | 27 ++ .../dataset/DataSetBase.java | 90 +++++ .../dataset/DataSetService.java | 32 ++ .../dataset/DataSetServiceImpl.java | 368 ++++++++++++++++++ 5 files changed, 590 insertions(+) create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSet.java create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetBase.java create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetService.java create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetServiceImpl.java diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 2711f6edbd..1bc9237751 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -988,4 +988,77 @@ + + + + + + + + + + + + + + + + + + org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService + + + + + + + + + + + + + + + + + + + + ${server.transaction.mode.default} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSet.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSet.java new file mode 100644 index 0000000000..6b1cd590c9 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSet.java @@ -0,0 +1,27 @@ +package org.alfresco.module.org_alfresco_module_rm.dataset; + +public interface DataSet +{ + + /** + * Gets the label of the data set + * + * @return String the label of the data set + */ + String getLabel(); + + /** + * Gets the id of the data set + * + * @return String the id of the data set + */ + String getId(); + + /** + * Gets the path of the data set + * + * @return String the path of the data set + */ + String getPath(); + +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetBase.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetBase.java new file mode 100644 index 0000000000..6ae54279b7 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetBase.java @@ -0,0 +1,90 @@ +package org.alfresco.module.org_alfresco_module_rm.dataset; + +public class DataSetBase implements DataSet +{ + + /** Data set service */ + private DataSetService dataSetService; + + /** Data set label */ + private String label; + + /** Data set id */ + private String id; + + /** Data set path */ + private String path; + + /** + * Sets the data set service + * + * @param dataSetService the data set service + */ + public void setDataSetService(DataSetService dataSetService) + { + this.dataSetService = dataSetService; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSet#getLabel() + */ + public String getLabel() + { + return this.label; + } + + /** + * Sets the label of the data set service + * + * @param label the label + */ + public void setLabel(String label) + { + this.label = label; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSet#getId() + */ + public String getId() + { + return this.id; + } + + /** + * Sets the id of the data set service + * + * @param id the id + */ + public void setId(String id) + { + this.id = id; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSet#getPath() + */ + public String getPath() + { + return this.path; + } + + /** + * Sets the path of the data set service + * + * @param path the path + */ + public void setPath(String path) + { + this.path = path; + } + + /** + * Registers the data set implementation with the data set service. + */ + public void register() + { + this.dataSetService.register(this); + } + +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetService.java new file mode 100644 index 0000000000..eaf93db240 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetService.java @@ -0,0 +1,32 @@ +package org.alfresco.module.org_alfresco_module_rm.dataset; + +import java.util.Map; + +import org.alfresco.service.cmr.repository.NodeRef; + +public interface DataSetService +{ + + /** + * Register a data set implementation with the service + * + * @param dataSet the data set + */ + void register(DataSet dataSet); + + /** + * Gets the details of all available data sets. + * + * @return Map details of all available data sets + */ + Map getDataSets(); + + /** + * Loads the data set with the specified id into the specified file plan + * + * @param dataSetId the id of the data set which will be imported + * @param filePlan the file plan which the data set will load into + */ + void loadDataSet(String dataSetId, NodeRef filePlan); + +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetServiceImpl.java new file mode 100644 index 0000000000..e1a2e9dbff --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/dataset/DataSetServiceImpl.java @@ -0,0 +1,368 @@ +package org.alfresco.module.org_alfresco_module_rm.dataset; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.HashMap; +import java.util.Map; +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.RecordsManagementActionService; +import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; +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; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementSearchBehaviour; +import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService; +import org.alfresco.module.org_alfresco_module_rm.security.Role; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.cmr.security.AuthorityService; +import org.alfresco.service.cmr.security.AuthorityType; +import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.cmr.view.ImporterService; +import org.alfresco.service.cmr.view.Location; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class DataSetServiceImpl implements DataSetService, RecordsManagementModel +{ + + /** Logger */ + private static Log logger = LogFactory.getLog(DataSetServiceImpl.class); + + /** Registered data set implementations */ + private Map dataSets = new HashMap(); + + /** Spaces store */ + private static final StoreRef SPACES_STORE = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, + "SpacesStore"); + + /** Importer service */ + private ImporterService importerService; + + /** Search service */ + private SearchService searchService; + + /** Node service */ + private NodeService nodeService; + + /** Records management service */ + private RecordsManagementService recordsManagementService; + + /** Records management action service */ + private RecordsManagementActionService recordsManagementActionService; + + /** Permission service */ + private PermissionService permissionService; + + /** Authority service */ + private AuthorityService authorityService; + + /** Records management security service */ + private RecordsManagementSecurityService recordsManagementSecurityService; + + /** Records management search behaviour */ + private RecordsManagementSearchBehaviour recordsManagementSearchBehaviour; + + /** Disposition service */ + private DispositionService dispositionService; + + /** + * Set importer service + * + * @param importerService the importer service + */ + public void setImporterService(ImporterService importerService) + { + this.importerService = importerService; + } + + /** + * Set search service + * + * @param searchService the search service + */ + public void setSearchService(SearchService searchService) + { + this.searchService = searchService; + } + + /** + * Set node service + * + * @param nodeService the node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * Set records management service + * + * @param recordsManagementService the records management service + */ + public void setRecordsManagementService(RecordsManagementService recordsManagementService) + { + this.recordsManagementService = recordsManagementService; + } + + /** + * Set records management action service + * + * @param recordsManagementActionService the records management action + * service + */ + public void setRecordsManagementActionService( + RecordsManagementActionService recordsManagementActionService) + { + this.recordsManagementActionService = recordsManagementActionService; + } + + /** + * Set permission service + * + * @param permissionService the permission service + */ + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; + } + + /** + * Set authority service + * + * @param authorityService the authority service + */ + public void setAuthorityService(AuthorityService authorityService) + { + this.authorityService = authorityService; + } + + /** + * Set records management security service + * + * @param recordsManagementSecurityService the records management security + * service + */ + public void setRecordsManagementSecurityService( + RecordsManagementSecurityService recordsManagementSecurityService) + { + this.recordsManagementSecurityService = recordsManagementSecurityService; + } + + /** + * Set records management search behaviour + * + * @param recordsManagementSearchBehaviour the records management search + * behaviour + */ + public void setRecordsManagementSearchBehaviour( + RecordsManagementSearchBehaviour recordsManagementSearchBehaviour) + { + this.recordsManagementSearchBehaviour = recordsManagementSearchBehaviour; + } + + /** + * Set disposition service + * + * @param dispositionService the disposition service + */ + public void setDispositionService(DispositionService dispositionService) + { + this.dispositionService = dispositionService; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService#register(org.alfresco.module.org_alfresco_module_rm.dataset.DataSet) + */ + @Override + public void register(DataSet dataSet) + { + this.dataSets.put(dataSet.getId(), dataSet); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService#getDataSets() + */ + @Override + public Map getDataSets() + { + return this.dataSets; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.dataset.DataSetService#loadDataSet(java.lang.String, + * org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + public void loadDataSet(String dataSetId, NodeRef filePlan) + { + // Get the data set + DataSet dataSet = getDataSets().get(dataSetId); + + // Import the RM test data ACP into the the provided file plan node reference + InputStream is = DataSetServiceImpl.class.getClassLoader().getResourceAsStream( + dataSet.getPath()); + if (is == null) + { + throw new AlfrescoRuntimeException("The '" + dataSet.getLabel() + + "' import file could not be found!"); + } + + // Import view + Reader viewReader = new InputStreamReader(is); + Location location = new Location(filePlan); + importerService.importView(viewReader, location, null, null); + + // Patch data + DataSetServiceImpl.patchLoadedData(searchService, nodeService, recordsManagementService, + recordsManagementActionService, permissionService, authorityService, + recordsManagementSecurityService, recordsManagementSearchBehaviour, + dispositionService); + } + + /** + * Temp method to patch AMP'ed data + * + * @param searchService + * @param nodeService + * @param recordsManagementService + * @param recordsManagementActionService + */ + private static void patchLoadedData(final SearchService searchService, + final NodeService nodeService, final RecordsManagementService recordsManagementService, + final RecordsManagementActionService recordsManagementActionService, + final PermissionService permissionService, final AuthorityService authorityService, + final RecordsManagementSecurityService recordsManagementSecurityService, + final RecordsManagementSearchBehaviour recordManagementSearchBehaviour, + final DispositionService dispositionService) + { + AuthenticationUtil.RunAsWork runAsWork = new AuthenticationUtil.RunAsWork() + { + public Object doWork() throws Exception + { + java.util.List rmRoots = recordsManagementService.getFilePlans(); + logger.info("Bootstraping " + rmRoots.size() + " rm roots ..."); + for (NodeRef rmRoot : rmRoots) + { + if (permissionService.getInheritParentPermissions(rmRoot) == true) + { + logger.info("Updating permissions for rm root: " + rmRoot); + permissionService.setInheritParentPermissions(rmRoot, false); + } + + String allRoleShortName = "AllRoles" + rmRoot.getId(); + String allRoleGroupName = authorityService.getName(AuthorityType.GROUP, + allRoleShortName); + + if (authorityService.authorityExists(allRoleGroupName) == false) + { + logger.info("Creating all roles group for root node: " + rmRoot.toString()); + + // Create "all" role group for root node + String allRoles = authorityService.createAuthority(AuthorityType.GROUP, + allRoleShortName, "All Roles", null); + + // Put all the role groups in it + Set roles = recordsManagementSecurityService.getRoles(rmRoot); + for (Role role : roles) + { + logger.info(" - adding role group " + role.getRoleGroupName() + + " to all roles group"); + authorityService.addAuthority(allRoles, role.getRoleGroupName()); + } + + // Set the permissions + permissionService.setPermission(rmRoot, allRoles, RMPermissionModel.READ_RECORDS, + true); + } + } + + // Make sure all the containers do not inherit permissions + ResultSet rs = searchService.query(SPACES_STORE, SearchService.LANGUAGE_LUCENE, + "TYPE:\"rma:recordsManagementContainer\""); + try + { + logger.info("Bootstraping " + rs.length() + " record containers ..."); + + for (NodeRef container : rs.getNodeRefs()) + { + String containerName = (String) nodeService.getProperty(container, + ContentModel.PROP_NAME); + + // Set permissions + if (permissionService.getInheritParentPermissions(container) == true) + { + logger.info("Updating permissions for record container: " + containerName); + permissionService.setInheritParentPermissions(container, false); + } + } + } + finally + { + rs.close(); + } + + // fix up the test dataset to fire initial events for disposition + // schedules + rs = searchService.query(SPACES_STORE, SearchService.LANGUAGE_LUCENE, + "TYPE:\"rma:recordFolder\""); + try + { + logger.info("Bootstraping " + rs.length() + " record folders ..."); + + for (NodeRef recordFolder : rs.getNodeRefs()) + { + String folderName = (String) nodeService.getProperty(recordFolder, + ContentModel.PROP_NAME); + + // Set permissions + if (permissionService.getInheritParentPermissions(recordFolder) == true) + { + logger.info("Updating permissions for record folder: " + folderName); + permissionService.setInheritParentPermissions(recordFolder, false); + } + + if (nodeService.hasAspect(recordFolder, ASPECT_DISPOSITION_LIFECYCLE) == false) + { + // See if the folder has a disposition schedule that needs + // to be applied + DispositionSchedule ds = dispositionService + .getDispositionSchedule(recordFolder); + if (ds != null) + { + // Fire action to "set-up" the folder correctly + logger.info("Setting up bootstraped record folder: " + folderName); + recordsManagementActionService.executeRecordsManagementAction(recordFolder, + "setupRecordFolder"); + } + } + + // fixup the search behaviour aspect for the record folder + logger.info("Setting up search aspect for record folder: " + folderName); + recordManagementSearchBehaviour.fixupSearchAspect(recordFolder); + } + } + finally + { + rs.close(); + } + + return null; + } + }; + + AuthenticationUtil.runAs(runAsWork, AuthenticationUtil.getAdminUserName()); + + } + +}