diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml index e6cc400c73..ba58d29116 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml @@ -7,8 +7,8 @@ - - + + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java index 2a35b12038..875ba76203 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java @@ -1214,7 +1214,7 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin */ public List getCustomReferencesTo(NodeRef node) { - return nodeService.getSourceAssocs(node, RegexQNamePattern.MATCH_ALL); + return nodeService.getSourceAssocs(node, null); } /** diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMSecurityCommon.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMSecurityCommon.java index 6cf009705e..f004cec040 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMSecurityCommon.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMSecurityCommon.java @@ -213,10 +213,6 @@ public class RMSecurityCommon implements ApplicationContextAware return result; } - // Get the file plan for the node - NodeRef filePlan = getFilePlanService().getFilePlan(nodeRef); - - if (permissionService.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS) == AccessStatus.DENIED) { // log message @@ -229,7 +225,9 @@ public class RMSecurityCommon implements ApplicationContextAware return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED); } - + + // Get the file plan for the node + NodeRef filePlan = getFilePlanService().getFilePlan(nodeRef); if (permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS) == AccessStatus.DENIED) { // log capability details diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index fae38b1c05..470c66ffdd 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -745,7 +745,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl private NodeRef getNextDispositionActionNodeRef(NodeRef nodeRef) { NodeRef result = null; - List assocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL); + List assocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, ASSOC_NEXT_DISPOSITION_ACTION, 1, true); if (assocs.size() != 0) { result = assocs.get(0).getChildRef(); @@ -838,7 +838,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef currentDispositionAction = null; if (nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE)) { - List assocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL); + List assocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, ASSOC_NEXT_DISPOSITION_ACTION); if (assocs.size() > 0) { currentDispositionAction = assocs.get(0).getChildRef(); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java index 316762938e..272375cc2f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java @@ -186,12 +186,22 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute Map props = new HashMap(1); props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE); - // execute disposition action - recordsManagementActionService.executeRecordsManagementAction(parent.getParentRef(), dispAction, props); - - if (logger.isDebugEnabled()) + try { - logger.debug("Processed action: " + dispAction + "on" + parent); + // execute disposition action + recordsManagementActionService.executeRecordsManagementAction(parent.getParentRef(), dispAction, props); + + if (logger.isDebugEnabled()) + { + logger.debug("Processed action: " + dispAction + "on" + parent); + } + } + catch (AlfrescoRuntimeException exception) + { + if (logger.isDebugEnabled()) + { + logger.debug(exception); + } } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index 148cbfa8b8..85131c6f19 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -710,17 +710,6 @@ public class RecordServiceImpl extends BaseBehaviourBean return result; } - /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef) - */ - @Override - public boolean isDeclared(NodeRef record) - { - ParameterCheck.mandatory("record", record); - - return nodeService.hasAspect(record, ASPECT_DECLARED_RECORD); - } - /** * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecord(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java index f7f6e4663c..fa129f936e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java @@ -86,7 +86,7 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut { if (nodeService == null) { - nodeService = (NodeService)applicationContext.getBean("nodeService"); + nodeService = (NodeService)applicationContext.getBean("dbNodeService"); } return nodeService; } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java index 529a43182f..0fc8ac9723 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java @@ -52,6 +52,9 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte /** Application context */ protected ApplicationContext applicationContext; + + /** internal node service */ + private NodeService internalNodeService; /** * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) @@ -77,6 +80,21 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { this.dictionaryService = dictionaryService; } + + /** + * Helper to get internal node service. + *

+ * Used for performance reasons. + */ + private NodeService getInternalNodeService() + { + if (internalNodeService == null) + { + internalNodeService = (NodeService)applicationContext.getBean("dbNodeService"); + } + + return internalNodeService; + } /** * Gets the file plan component kind from the given node reference @@ -196,12 +214,8 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte public boolean isFilePlanComponent(NodeRef nodeRef) { boolean result = false; - - // use the internal node service to prevent redirection of security checking. - NodeService myNodeService = (NodeService)applicationContext.getBean("nodeService"); - - if (myNodeService.exists(nodeRef) && - myNodeService.hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT)) + if (getInternalNodeService().exists(nodeRef) && + getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT)) { result = true; } @@ -264,7 +278,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { ParameterCheck.mandatory("nodeRef", nodeRef); - return nodeService.hasAspect(nodeRef, ASPECT_RECORD); + return getInternalNodeService().hasAspect(nodeRef, ASPECT_RECORD); } /** @@ -280,7 +294,8 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte ParameterCheck.mandatory("nodeRef", nodeRef); boolean isHold = false; - if (nodeService.exists(nodeRef) && instanceOf(nodeRef, TYPE_HOLD)) + if (getInternalNodeService().exists(nodeRef) && + instanceOf(nodeRef, TYPE_HOLD)) { isHold = true; } @@ -298,6 +313,18 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte return instanceOf(nodeRef, TYPE_TRANSFER); } + + /** + * Indicates whether a record is complete or not. + * + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isDeclared(NodeRef record) + { + ParameterCheck.mandatory("record", record); + + return getInternalNodeService().hasAspect(record, ASPECT_DECLARED_RECORD); + } /** * Gets the file plan that a given file plan component resides within. @@ -309,35 +336,23 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { NodeRef result = null; if (nodeRef != null) - { - RunAsWork runAsWork = new RunAsWork() + { + result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); + if (result == null) { - @Override - public NodeRef doWork() + if (instanceOf(nodeRef, TYPE_FILE_PLAN)) { - NodeRef result = (NodeRef)nodeService.getProperty(nodeRef, PROP_ROOT_NODEREF); - if (result == null) - { - if (instanceOf(nodeRef, TYPE_FILE_PLAN)) - { - result = nodeRef; - } - else - { - ChildAssociationRef parentAssocRef = nodeService.getPrimaryParent(nodeRef); - if (parentAssocRef != null) - { - result = getFilePlan(parentAssocRef.getParentRef()); - } - } - } - - return result; + result = nodeRef; } - - }; - - result = AuthenticationUtil.runAsSystem(runAsWork); + else + { + ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); + if (parentAssocRef != null) + { + result = getFilePlan(parentAssocRef.getParentRef()); + } + } + } } return result; @@ -352,15 +367,9 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte protected boolean instanceOf(NodeRef nodeRef, QName ofClassName) { ParameterCheck.mandatory("nodeRef", nodeRef); - ParameterCheck.mandatory("ofClassName", ofClassName); - boolean result = false; - if (nodeService.exists(nodeRef) && - (ofClassName.equals(nodeService.getType(nodeRef)) || - dictionaryService.isSubClass(nodeService.getType(nodeRef), ofClassName))) - { - result = true; - } - return result; + ParameterCheck.mandatory("ofClassName", ofClassName); + QName className = getInternalNodeService().getType(nodeRef); + return instanceOf(className, ofClassName); } /** diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index 70345de440..5a33ecc131 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -275,7 +275,8 @@ public class HoldServiceImplUnitTest extends BaseUnitTest @Test (expected=AlfrescoRuntimeException.class) public void addToHoldNotARecordFolderOrRecord() { - holdService.addToHold(hold, filePlanComponent); + NodeRef anotherThing = generateNodeRef(TYPE_RECORD_CATEGORY); + holdService.addToHold(hold, anotherThing); } @SuppressWarnings("unchecked") diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java index 8430654373..04f0a971e5 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java @@ -121,7 +121,7 @@ public class BaseUnitTest implements RecordsManagementModel MockitoAnnotations.initMocks(this); // setup application context - doReturn(mockedNodeService).when(mockedApplicationContext).getBean("nodeService"); + doReturn(mockedNodeService).when(mockedApplicationContext).getBean("dbNodeService"); // setup retrying transaction helper Answer doInTransactionAnswer = new Answer()