From 90a63d7c71e75f66c974f8defbd9d02a4e4cdf8b Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 17 Sep 2013 00:52:58 +0000 Subject: [PATCH] RM-895: Ensure RM actions with side effects don't try and execute if things are frozen RM-965: Unable to declare a record from the repository view. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@55371 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-action-context.xml | 1 + .../action/impl/AddRecordTypeAction.java | 6 +- .../action/impl/CloseRecordFolderAction.java | 40 +++---- .../action/impl/CompleteEventAction.java | 70 ++++++------ .../action/impl/DeclareRecordAction.java | 4 +- .../action/impl/DelegateAction.java | 17 ++- .../action/impl/FileToAction.java | 3 +- .../action/impl/OpenRecordFolderAction.java | 55 +++++----- .../action/impl/RejectAction.java | 1 + .../action/impl/UndeclareRecordAction.java | 35 +++--- .../model/security/ModelSecurityService.java | 12 ++- .../security/ModelSecurityServiceImpl.java | 22 ++++ .../role/FilePlanRoleServiceImpl.java | 2 +- .../security/ExtendedSecurityServiceImpl.java | 3 +- .../repo/rule/ExtendedRuleServiceImpl.java | 102 +++++++++++++++--- 15 files changed, 256 insertions(+), 117 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml index e974983d32..20672a5092 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml @@ -918,6 +918,7 @@ + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/AddRecordTypeAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/AddRecordTypeAction.java index fe2c8074b3..6fe4da7a43 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/AddRecordTypeAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/AddRecordTypeAction.java @@ -58,8 +58,10 @@ public class AddRecordTypeAction extends RMActionExecuterAbstractBase */ @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) - { - if (recordService.isRecord(actionedUponNodeRef)) + { + if (nodeService.exists(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false && + recordService.isRecord(actionedUponNodeRef) == true) { String recordTypes = (String) action.getParameterValue(PARAM_ADD_RECORD_TYPES); String[] types = recordTypes.split(","); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CloseRecordFolderAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CloseRecordFolderAction.java index e027913bb2..b879e35d2a 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CloseRecordFolderAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CloseRecordFolderAction.java @@ -38,7 +38,7 @@ public class CloseRecordFolderAction extends RMActionExecuterAbstractBase /** I18N */ private static final String MSG_CLOSE_RECORD_FOLDER_NOT_FOLDER = "rm.action.close-record-folder-not-folder"; - + /** Parameter names */ public static final String PARAM_CLOSE_PARENT = "closeParent"; @@ -49,29 +49,31 @@ public class CloseRecordFolderAction extends RMActionExecuterAbstractBase @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { - // TODO check that the user in question has the correct permissions to close a records folder + if (nodeService.exists(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false) + { + if (recordService.isRecord(actionedUponNodeRef)) + { + ChildAssociationRef assocRef = nodeService.getPrimaryParent(actionedUponNodeRef); + if (assocRef != null) + { + actionedUponNodeRef = assocRef.getParentRef(); + } + } - if (recordService.isRecord(actionedUponNodeRef)) - { - ChildAssociationRef assocRef = nodeService.getPrimaryParent(actionedUponNodeRef); - if (assocRef != null) + if (this.recordsManagementService.isRecordFolder(actionedUponNodeRef) == true) { - actionedUponNodeRef = assocRef.getParentRef(); + Boolean isClosed = (Boolean) this.nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED); + if (Boolean.FALSE.equals(isClosed) == true) + { + this.nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, true); + } } - } - - if (this.recordsManagementService.isRecordFolder(actionedUponNodeRef) == true) - { - Boolean isClosed = (Boolean)this.nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED); - if (Boolean.FALSE.equals(isClosed) == true) + else { - this.nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, true); + if (logger.isWarnEnabled()) + logger.warn(I18NUtil.getMessage(MSG_CLOSE_RECORD_FOLDER_NOT_FOLDER, actionedUponNodeRef.toString())); } } - else - { - if (logger.isWarnEnabled()) - logger.warn(I18NUtil.getMessage(MSG_CLOSE_RECORD_FOLDER_NOT_FOLDER, actionedUponNodeRef.toString())); - } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CompleteEventAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CompleteEventAction.java index b1c58fa56f..2d94bb510d 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CompleteEventAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CompleteEventAction.java @@ -62,46 +62,50 @@ public class CompleteEventAction extends RMActionExecuterAbstractBase @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { - String eventName = (String)action.getParameterValue(PARAM_EVENT_NAME); - String eventCompletedBy = (String)action.getParameterValue(PARAM_EVENT_COMPLETED_BY); - Date eventCompletedAt = (Date)action.getParameterValue(PARAM_EVENT_COMPLETED_AT); - - if (this.nodeService.hasAspect(actionedUponNodeRef, ASPECT_DISPOSITION_LIFECYCLE) == true) + if (nodeService.exists(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false) { - // Get the next disposition action - DispositionAction da = this.dispositionService.getNextDispositionAction(actionedUponNodeRef); - if (da != null) + String eventName = (String)action.getParameterValue(PARAM_EVENT_NAME); + String eventCompletedBy = (String)action.getParameterValue(PARAM_EVENT_COMPLETED_BY); + Date eventCompletedAt = (Date)action.getParameterValue(PARAM_EVENT_COMPLETED_AT); + + if (this.nodeService.hasAspect(actionedUponNodeRef, ASPECT_DISPOSITION_LIFECYCLE) == true) { - // Get the disposition event - EventCompletionDetails event = getEvent(da, eventName); - if (event != null) + // Get the next disposition action + DispositionAction da = this.dispositionService.getNextDispositionAction(actionedUponNodeRef); + if (da != null) { - if (eventCompletedAt == null) + // Get the disposition event + EventCompletionDetails event = getEvent(da, eventName); + if (event != null) { - eventCompletedAt = new Date(); + if (eventCompletedAt == null) + { + eventCompletedAt = new Date(); + } + + if (eventCompletedBy == null) + { + eventCompletedBy = AuthenticationUtil.getRunAsUser(); + } + + // Update the event so that it is complete + NodeRef eventNodeRef = event.getNodeRef(); + Map props = this.nodeService.getProperties(eventNodeRef); + props.put(PROP_EVENT_EXECUTION_COMPLETE, true); + props.put(PROP_EVENT_EXECUTION_COMPLETED_AT, eventCompletedAt); + props.put(PROP_EVENT_EXECUTION_COMPLETED_BY, eventCompletedBy); + this.nodeService.setProperties(eventNodeRef, props); + + // Check to see if the events eligible property needs to be updated + updateEventEligible(da); + } - - if (eventCompletedBy == null) + else { - eventCompletedBy = AuthenticationUtil.getRunAsUser(); + // RM-695: Commenting error handling out. If the current disposition stage does not define the event being completed nothing should happen. + // throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_EVENT_NO_DISP_LC, eventName)); } - - // Update the event so that it is complete - NodeRef eventNodeRef = event.getNodeRef(); - Map props = this.nodeService.getProperties(eventNodeRef); - props.put(PROP_EVENT_EXECUTION_COMPLETE, true); - props.put(PROP_EVENT_EXECUTION_COMPLETED_AT, eventCompletedAt); - props.put(PROP_EVENT_EXECUTION_COMPLETED_BY, eventCompletedBy); - this.nodeService.setProperties(eventNodeRef, props); - - // Check to see if the events eligible property needs to be updated - updateEventEligible(da); - - } - else - { - // RM-695: Commenting error handling out. If the current disposition stage does not define the event being completed nothing should happen. - // throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_EVENT_NO_DISP_LC, eventName)); } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java index 82b26ed7b6..b731d952e7 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DeclareRecordAction.java @@ -61,7 +61,9 @@ public class DeclareRecordAction extends RMActionExecuterAbstractBase @Override protected void executeImpl(final Action action, final NodeRef actionedUponNodeRef) { - if (recordService.isRecord(actionedUponNodeRef) == true) + if (nodeService.exists(actionedUponNodeRef) == true && + recordService.isRecord(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false) { if (recordService.isDeclared(actionedUponNodeRef) == false) { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DelegateAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DelegateAction.java index 44e40094f1..c5fd59857a 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DelegateAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DelegateAction.java @@ -39,6 +39,9 @@ public class DelegateAction extends RMActionExecuterAbstractBase /** Delegate action executer*/ private ActionExecuter delegateActionExecuter; + /** should we check whether the node is frozen */ + private boolean checkFrozen = false; + /** * @param delegateActionExecuter delegate action executer */ @@ -46,6 +49,14 @@ public class DelegateAction extends RMActionExecuterAbstractBase { this.delegateActionExecuter = delegateActionExecuter; } + + /** + * @param checkFrozen true if we check whether the actioned upon node reference is frozen, false otherwise + */ + public void setCheckFrozen(boolean checkFrozen) + { + this.checkFrozen = checkFrozen; + } /** * @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#executeImpl(org.alfresco.service.cmr.action.Action, org.alfresco.service.cmr.repository.NodeRef) @@ -53,7 +64,11 @@ public class DelegateAction extends RMActionExecuterAbstractBase @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { - delegateActionExecuter.execute(action, actionedUponNodeRef); + if (nodeService.exists(actionedUponNodeRef) == true && + (checkFrozen == false || freezeService.isFrozen(actionedUponNodeRef) == false)) + { + delegateActionExecuter.execute(action, actionedUponNodeRef); + } } /** diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileToAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileToAction.java index ac7132d962..ff313f5269 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileToAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileToAction.java @@ -72,7 +72,8 @@ public class FileToAction extends RMActionExecuterAbstractBase @Override protected void executeImpl(final Action action, final NodeRef actionedUponNodeRef) { - if (nodeService.exists(actionedUponNodeRef) == true) + if (nodeService.exists(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false) { if (recordService.isFiled(actionedUponNodeRef) == false) { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/OpenRecordFolderAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/OpenRecordFolderAction.java index 0dcb6f8a4f..3dcd4e3692 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/OpenRecordFolderAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/OpenRecordFolderAction.java @@ -36,6 +36,7 @@ public class OpenRecordFolderAction extends RMActionExecuterAbstractBase /** Logger */ private static Log logger = LogFactory.getLog(OpenRecordFolderAction.class); + /** I18N */ private static final String MSG_NO_OPEN_RECORD_FOLDER = "rm.action.no-open-record-folder"; /** Parameter names */ @@ -48,30 +49,34 @@ public class OpenRecordFolderAction extends RMActionExecuterAbstractBase @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { - // 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); - if (assocRef != null) - { - actionedUponNodeRef = assocRef.getParentRef(); - } - } - - if (this.recordsManagementService.isRecordFolder(actionedUponNodeRef) == true) - { - Boolean isClosed = (Boolean) this.nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED); - if (Boolean.TRUE.equals(isClosed) == true) - { - this.nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, false); - } - } - else - { - if (logger.isWarnEnabled()) - logger.warn(I18NUtil.getMessage(MSG_NO_OPEN_RECORD_FOLDER, actionedUponNodeRef.toString())); - } + if (nodeService.exists(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false) + { + // 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); + if (assocRef != null) + { + actionedUponNodeRef = assocRef.getParentRef(); + } + } + + if (this.recordsManagementService.isRecordFolder(actionedUponNodeRef) == true) + { + Boolean isClosed = (Boolean) this.nodeService.getProperty(actionedUponNodeRef, PROP_IS_CLOSED); + if (Boolean.TRUE.equals(isClosed) == true) + { + this.nodeService.setProperty(actionedUponNodeRef, PROP_IS_CLOSED, false); + } + } + else + { + if (logger.isWarnEnabled()) + logger.warn(I18NUtil.getMessage(MSG_NO_OPEN_RECORD_FOLDER, actionedUponNodeRef.toString())); + } + } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RejectAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RejectAction.java index 0dba20309d..cc2aacd104 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RejectAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/RejectAction.java @@ -48,6 +48,7 @@ public class RejectAction extends RMActionExecuterAbstractBase protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { if (nodeService.exists(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false && nodeService.getProperty(actionedUponNodeRef, PROP_RECORD_ORIGINATING_LOCATION) != null) { recordService.rejectRecord(actionedUponNodeRef, (String) action.getParameterValue(PARAM_REASON)); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/UndeclareRecordAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/UndeclareRecordAction.java index ad70dc57ed..40ccf95d07 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/UndeclareRecordAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/UndeclareRecordAction.java @@ -44,20 +44,25 @@ public class UndeclareRecordAction extends RMActionExecuterAbstractBase @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { - if (recordService.isRecord(actionedUponNodeRef) == true) - { - if (recordService.isDeclared(actionedUponNodeRef) == true) - { - // Remove the declared aspect - this.nodeService.removeAspect(actionedUponNodeRef, ASPECT_DECLARED_RECORD); - } - } - else - { - if (logger.isWarnEnabled()) - { - logger.warn(I18NUtil.getMessage(MSG_RECORDS_ONLY_UNDECLARED)); - } - } + if (nodeService.exists(actionedUponNodeRef) == true) + { + if (recordService.isRecord(actionedUponNodeRef) == true) + { + // repoen if already complete and not frozen + if (recordService.isDeclared(actionedUponNodeRef) == true && + freezeService.isFrozen(actionedUponNodeRef) == false) + { + // Remove the declared aspect + this.nodeService.removeAspect(actionedUponNodeRef, ASPECT_DECLARED_RECORD); + } + } + else + { + if (logger.isWarnEnabled()) + { + logger.warn(I18NUtil.getMessage(MSG_RECORDS_ONLY_UNDECLARED)); + } + } + } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityService.java index 5dc8db2285..6beaf4ce19 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityService.java @@ -32,7 +32,7 @@ import org.alfresco.service.namespace.QName; public interface ModelSecurityService { /** - * Sets whether model security is enabled or not. + * Sets whether model security is enabled globally or not. * * @param enabled */ @@ -45,6 +45,16 @@ public interface ModelSecurityService */ boolean isEnabled(); + /** + * Disable model security checks for the current thread. + */ + void disable(); + + /** + * Enable model security checks for the current thread. + */ + void enable(); + /** * Registers a protected model artifact with the service. * diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityServiceImpl.java index 9e0f85a4b3..153552f397 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/security/ModelSecurityServiceImpl.java @@ -153,6 +153,28 @@ public class ModelSecurityServiceImpl implements ModelSecurityService, this, onUpdatePropertiesBehaviour); } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.model.security.ModelSecurityService#disable() + */ + @Override + public void disable() + { + beforeAddAspectBehaviour.disable(); + beforeRemoveAspectBehaviour.disable(); + onUpdatePropertiesBehaviour.disable(); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.model.security.ModelSecurityService#enable() + */ + @Override + public void enable() + { + beforeAddAspectBehaviour.enable(); + beforeRemoveAspectBehaviour.enable(); + onUpdatePropertiesBehaviour.enable(); + } /** * @see org.alfresco.module.org_alfresco_module_rm.model.security.ModelSecurityService#register(org.alfresco.module.org_alfresco_module_rm.model.security.ProtectedModelArtifact) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java index e473009b9e..f034365883 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java @@ -74,7 +74,7 @@ import org.springframework.extensions.surf.util.I18NUtil; * @since 2.1 */ public class FilePlanRoleServiceImpl implements FilePlanRoleService, - RecordsManagementModel + RecordsManagementModel { /** I18N */ private static final String MSG_FIRST_NAME = "bootstrap.rmadmin.firstName"; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java index 1ec0acae86..0fa9ad8e19 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityServiceImpl.java @@ -271,7 +271,8 @@ public class ExtendedSecurityServiceImpl extends ServiceBaseImpl for (String authority : authorities) { - if (authority.equals(PermissionService.ALL_AUTHORITIES) == false) + if (authority.equals(PermissionService.ALL_AUTHORITIES) == false && + authority.equals(PermissionService.OWNER_AUTHORITY) == false) { if (referenceCountMap == null || referenceCountMap.containsKey(authority) == false) diff --git a/rm-server/source/java/org/alfresco/repo/rule/ExtendedRuleServiceImpl.java b/rm-server/source/java/org/alfresco/repo/rule/ExtendedRuleServiceImpl.java index dcfc7643da..6577209469 100644 --- a/rm-server/source/java/org/alfresco/repo/rule/ExtendedRuleServiceImpl.java +++ b/rm-server/source/java/org/alfresco/repo/rule/ExtendedRuleServiceImpl.java @@ -23,6 +23,7 @@ import java.util.Set; 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.security.ModelSecurityService; import org.alfresco.module.org_alfresco_module_rm.security.FilePlanAuthenticationService; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; @@ -39,36 +40,67 @@ import org.alfresco.service.namespace.QName; */ public class ExtendedRuleServiceImpl extends RuleServiceImpl { + /** indicates whether the rules should be run as rmadmin or not */ private boolean runAsRmAdmin = true; + /** ignore types */ private Set ignoredTypes = new HashSet(); + /** file plan service */ private FilePlanService filePlanService; + /** file plan authentication service */ private FilePlanAuthenticationService filePlanAuthenticationService; + /** node service */ protected NodeService nodeService; + /** model security service */ + protected ModelSecurityService modelSecurityService; + + /** + * @param runAsRmAdmin true if run rules as rmadmin, false otherwise + */ public void setRunAsRmAdmin(boolean runAsRmAdmin) { this.runAsRmAdmin = runAsRmAdmin; } + /** + * @param filePlanAuthenticationService file plan authentication service + */ public void setFilePlanAuthenticationService(FilePlanAuthenticationService filePlanAuthenticationService) { this.filePlanAuthenticationService = filePlanAuthenticationService; } + /** + * @param nodeService node service + */ public void setNodeService2(NodeService nodeService) { this.nodeService = nodeService; } + /** + * @param filePlanService file plan service + */ public void setFilePlanService(FilePlanService filePlanService) { this.filePlanService = filePlanService; } + + /** + * @param modelSecurityService model security service + */ + public void setModelSecurityService(ModelSecurityService modelSecurityService) + { + this.modelSecurityService = modelSecurityService; + } + /** + * Init method + */ @Override public void init() { @@ -81,10 +113,13 @@ public class ExtendedRuleServiceImpl extends RuleServiceImpl ignoredTypes.add(RecordsManagementModel.TYPE_EVENT_EXECUTION); } + /** + * @see org.alfresco.repo.rule.RuleServiceImpl#saveRule(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.rule.Rule) + */ @Override public void saveRule(final NodeRef nodeRef, final Rule rule) { - if (filePlanService.isFilePlanComponent(nodeRef) == true && runAsRmAdmin == true) + if (filePlanService.isFilePlanComponent(nodeRef) == true) { AuthenticationUtil.runAsSystem(new RunAsWork() { @@ -103,10 +138,13 @@ public class ExtendedRuleServiceImpl extends RuleServiceImpl } } + /** + * @see org.alfresco.repo.rule.RuleServiceImpl#removeRule(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.rule.Rule) + */ @Override public void removeRule(final NodeRef nodeRef, final Rule rule) { - if (filePlanService.isFilePlanComponent(nodeRef) == true && runAsRmAdmin == true) + if (filePlanService.isFilePlanComponent(nodeRef) == true) { AuthenticationUtil.runAsSystem(new RunAsWork() { @@ -125,27 +163,50 @@ public class ExtendedRuleServiceImpl extends RuleServiceImpl } } + /** + * @see org.alfresco.repo.rule.RuleServiceImpl#executeRule(org.alfresco.service.cmr.rule.Rule, org.alfresco.service.cmr.repository.NodeRef, java.util.Set) + */ @Override public void executeRule(final Rule rule, final NodeRef nodeRef, final Set executedRules) { QName typeQName = nodeService.getType(nodeRef); - if (filePlanService.isFilePlanComponent(nodeRef) == true - && isFilePlanComponentRule(rule) == true && runAsRmAdmin == true) + // check if this is a rm rule on a rm artifact + if (filePlanService.isFilePlanComponent(nodeRef) == true && + isFilePlanComponentRule(rule) == true) { + // ignore and if (isIgnoredType(typeQName) == false) - { - String user = AuthenticationUtil.getFullyAuthenticatedUser(); - try - { - AuthenticationUtil.setFullyAuthenticatedUser(filePlanAuthenticationService.getRmAdminUserName()); - ExtendedRuleServiceImpl.super.executeRule(rule, nodeRef, executedRules); - } - finally - { - AuthenticationUtil.setFullyAuthenticatedUser(user); - } - } + { + // disable model security whilst we execute the RM rule + //modelSecurityService.disable(); + //try + //{ + if (runAsRmAdmin == true) + { + // run as rmadmin + filePlanAuthenticationService.runAsRmAdmin(new RunAsWork() + { + @Override + public Void doWork() throws Exception + { + ExtendedRuleServiceImpl.super.executeRule(rule, nodeRef, executedRules); + return null; + } + }); + } + else + { + // run as current user + ExtendedRuleServiceImpl.super.executeRule(rule, nodeRef, executedRules); + } + //} + //finally + //{ + // enable model security + // modelSecurityService.enable(); + //} + } } else { @@ -154,6 +215,12 @@ public class ExtendedRuleServiceImpl extends RuleServiceImpl } } + /** + * Indicates whether the rule is a file plan component + * + * @param rule rule + * @return boolean true if rule is set on a file plan component, false otherwise + */ private boolean isFilePlanComponentRule(Rule rule) { NodeRef nodeRef = getOwningNodeRef(rule); @@ -161,7 +228,8 @@ public class ExtendedRuleServiceImpl extends RuleServiceImpl } /** - * @param typeQName + * @param typeQName type qname + * @return boolean true if ignore type, false otherwise */ private boolean isIgnoredType(QName typeQName) {