diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml index f9596bf37d..9e2b89842f 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml @@ -43,13 +43,13 @@ + + parent="compositeCapability"> @@ -62,6 +62,7 @@ + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-record-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-record-context.xml index 743a0f9ea3..7fdded0880 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-record-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-record-context.xml @@ -211,7 +211,7 @@ - + @@ -254,6 +254,7 @@ + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml index 25a396e069..822caf54b1 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml @@ -9,6 +9,22 @@ + + + + + + + + + + + + + + + + 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 d938d8bc73..3f9c036e60 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 @@ -1090,6 +1090,7 @@ org.alfresco.module.org_alfresco_module_rm.record.RecordService.isDeclared=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.isFiled=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecord=RM_ALLOW + org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecordFromContent=RM.Create.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.file=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.hideRecord=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.isPropertyEditable=RM.Read.0 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties index 7caecd7110..2eef2fb1e3 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties @@ -65,7 +65,7 @@ rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.rename=RM.Upd rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.move=RM.Move.0.1 rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.moveFrom=RM.Move.0.2 rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.copy=RM.Read.0,RM.Create.1.0 -rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.create=RM.Create.0.2 +rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.create=RM.Create.0 rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.delete=RM.Delete.0 rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.getNamePath=RM.Read.1 rm.methodsecurity.org.alfresco.service.cmr.model.FileFolderService.getNameOnlyPath=RM.Read.1 diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/ChangeOrDeleteReferencesCapability.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/ChangeOrDeleteReferencesCapability.java index baafa6a238..07fb58b887 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/ChangeOrDeleteReferencesCapability.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/ChangeOrDeleteReferencesCapability.java @@ -61,7 +61,7 @@ public class ChangeOrDeleteReferencesCapability extends DeclarativeCapability else { if (checkConditions(source) && - checkPermissions(source)) + checkPermissions(source)) { return AccessDecisionVoter.ACCESS_GRANTED; } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/CreateCapability.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/CreateCapability.java index d360c50516..3bfa54b817 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/CreateCapability.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/CreateCapability.java @@ -67,19 +67,18 @@ public class CreateCapability extends DeclarativeCapability @Override public int evaluate(NodeRef nodeRef) { - return evaluate(nodeRef, null, null, null); + return evaluate(nodeRef, null, null); } /** * Evaluate capability. * - * @param destination - * @param linkee - * @param type - * @param assocType + * @param destination destination node reference + * @param linkee linkee node reference, can be null + * @param assocType association type, can be null * @return */ - public int evaluate(NodeRef destination, NodeRef linkee, QName type, QName assocType) + public int evaluate(NodeRef destination, NodeRef linkee, QName assocType) { if (linkee != null) { @@ -95,8 +94,9 @@ public class CreateCapability extends DeclarativeCapability { if (linkee == null) { - if (recordService.isRecord(destination) && !recordService.isDeclared(destination) && - permissionService.hasPermission(destination, RMPermissionModel.FILE_RECORDS) == AccessStatus.ALLOWED) + if (recordService.isRecord(destination) && + !recordService.isDeclared(destination) && + permissionService.hasPermission(destination, RMPermissionModel.FILE_RECORDS) == AccessStatus.ALLOWED) { return AccessDecisionVoter.ACCESS_GRANTED; } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/UpdatePropertiesCapability.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/UpdatePropertiesCapability.java deleted file mode 100644 index f9bf96ef5f..0000000000 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/impl/UpdatePropertiesCapability.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2005-2014 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.module.org_alfresco_module_rm.capability.impl; - -import java.io.Serializable; -import java.util.Map; - -import org.alfresco.module.org_alfresco_module_rm.capability.declarative.DeclarativeCompositeCapability; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.namespace.QName; - -/** - * Update properties capability. - * - * @author andyh - */ -public class UpdatePropertiesCapability extends DeclarativeCompositeCapability -{ - /** - * Evaluate capability, taking into account the protected properties. - * - * @param nodeRef node reference - * @param properties updated properties, if no null - */ - public int evaluate(NodeRef nodeRef, Map properties) - { - // if ((properties != null) && (voter.includesProtectedPropertyChange(nodeRef, properties))) - // { - // return AccessDecisionVoter.ACCESS_DENIED; - // } - - return evaluate(nodeRef); - } -} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/ConfigAttributeDefinition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/ConfigAttributeDefinition.java index f955b1539f..0427a00ad4 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/ConfigAttributeDefinition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/ConfigAttributeDefinition.java @@ -30,11 +30,14 @@ import org.alfresco.service.namespace.NamespacePrefixResolver; import org.alfresco.service.namespace.QName; /** + * RM security configuration definition. + * * @author Roy Wetherall * @since 2.1 */ public class ConfigAttributeDefinition { + /** allowable RM security configurations */ public static final String RM = "RM"; public static final String RM_ALLOW = "RM_ALLOW"; public static final String RM_DENY = "RM_DENY"; @@ -42,18 +45,30 @@ public class ConfigAttributeDefinition public static final String RM_ABSTAIN = "RM_ABSTAIN"; public static final String RM_QUERY = "RM_QUERY"; + /** security type */ private String typeString; + /** policy name */ private String policyName; + /** simple permission reference */ private SimplePermissionReference required; + /** parameter position map */ private Map parameters = new HashMap(2, 1.0f); + /** is parent */ private boolean parent = false; + /** + * Default constructor + * + * @param attr configuration attribute instance + * @param namespacePrefixResolver namespace prefix resolver + */ public ConfigAttributeDefinition(ConfigAttribute attr, NamespacePrefixResolver namespacePrefixResolver) { + // tokenize configuration string StringTokenizer st = new StringTokenizer(attr.getAttribute(), ".", false); if (st.countTokens() < 1) { @@ -61,8 +76,13 @@ public class ConfigAttributeDefinition } typeString = st.nextToken(); - if (!(typeString.equals(RM) || typeString.equals(RM_ALLOW) || typeString.equals(RM_CAP) || typeString.equals(RM_DENY) || typeString.equals(RM_QUERY) || typeString - .equals(RM_ABSTAIN))) + // check that the configuration is valid + if (!(typeString.equals(RM) || + typeString.equals(RM_ALLOW) || + typeString.equals(RM_CAP) || + typeString.equals(RM_DENY) || + typeString.equals(RM_QUERY) || + typeString.equals(RM_ABSTAIN))) { throw new ACLEntryVoterException("Invalid type: must be ACL_NODE, ACL_PARENT or ACL_ALLOW"); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/CreatePolicy.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/CreatePolicy.java index ec7a11e6bf..373dabdaf3 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/CreatePolicy.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/CreatePolicy.java @@ -31,18 +31,25 @@ public class CreatePolicy extends AbstractBasePolicy Class[] params, ConfigAttributeDefinition cad) { - - NodeRef destination = getTestNode(invocation, params, cad.getParameters().get(0), cad.isParent()); - QName type = getType(invocation, params, cad.getParameters().get(1), cad.isParent()); - // linkee is not null for creating secondary child assocs - NodeRef linkee = getTestNode(invocation, params, cad.getParameters().get(1), cad.isParent()); + NodeRef linkee = null; QName assocType = null; - if(cad.getParameters().size() > 2) + + // get the destination node + NodeRef destination = getTestNode(invocation, params, cad.getParameters().get(0), cad.isParent()); + + if (cad.getParameters().size() > 1) { - assocType = getType(invocation, params, cad.getParameters().get(2), cad.isParent()); + // get the linkee when present + linkee = getTestNode(invocation, params, cad.getParameters().get(1), cad.isParent()); + + // get the assoc type + if(cad.getParameters().size() > 2) + { + assocType = getType(invocation, params, cad.getParameters().get(2), cad.isParent()); + } } - return ((CreateCapability)capabilityService.getCapability("Create")).evaluate(destination, linkee, type, assocType); + return ((CreateCapability)capabilityService.getCapability("Create")).evaluate(destination, linkee, assocType); } } \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/UpdatePropertiesPolicy.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/UpdatePropertiesPolicy.java index 59966ba584..13b8b724f5 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/UpdatePropertiesPolicy.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/policy/UpdatePropertiesPolicy.java @@ -18,13 +18,7 @@ */ package org.alfresco.module.org_alfresco_module_rm.capability.policy; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import org.alfresco.module.org_alfresco_module_rm.capability.impl.UpdatePropertiesCapability; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.namespace.QName; import org.aopalliance.intercept.MethodInvocation; public class UpdatePropertiesPolicy extends AbstractBasePolicy @@ -35,29 +29,8 @@ public class UpdatePropertiesPolicy extends AbstractBasePolicy Class[] params, ConfigAttributeDefinition cad) { - NodeRef updatee = getTestNode(invocation, params, cad.getParameters().get(0), cad.isParent()); - Map properties; - if (QName.class.isAssignableFrom(params[cad.getParameters().get(1)])) - { - // single update/delete - // We have a specific property - QName propertyQName = getQName(invocation, params, cad.getParameters().get(1)); - properties = new HashMap(1, 1.0f); - if (cad.getParameters().size() > 2) - { - properties.put(propertyQName, getProperty(invocation, params, cad.getParameters().get(2))); - } - else - { - properties.put(propertyQName, null); - } - } - else - { - properties = getProperties(invocation, params, cad.getParameters().get(1)); - } - - return ((UpdatePropertiesCapability)capabilityService.getCapability("UpdateProperties")).evaluate(updatee, properties); + NodeRef nodeRef = getTestNode(invocation, params, cad.getParameters().get(0), cad.isParent()); + return capabilityService.getCapability("UpdateProperties").evaluate(nodeRef); } } \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java index 6603a813b4..92a17e9b86 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java @@ -56,6 +56,14 @@ public interface RecordService * Disables the property editable check. */ void disablePropertyEditableCheck(); + + /** + * Disables the property editable check for a given node in this transaction only. + * + * @param nodeRef node reference + * @since 2.2 + */ + void disablePropertyEditableCheck(NodeRef nodeRef); /** * Enables the property editable check. By default this is always enabled. @@ -138,12 +146,13 @@ public interface RecordService * Creates a new document in the unfiled records container if the given node reference is a file plan * node reference otherwise the node reference will be used as the destination for the new record. * - * @param nodeRef - * @param name - * @param type - * @param properties + * @param parent parent node reference + * @param name name of the new record + * @param type content type, cm:content if null + * @param properties properties + * @param reader content reader */ - NodeRef createRecord(NodeRef nodeRef, String name, QName type, Map properties, ContentReader reader); + NodeRef createRecordFromContent(NodeRef parent, String name, QName type, Map properties, ContentReader reader); /** * Indicates whether the record is filed or not 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 54b32c9c32..6f62333c26 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 @@ -109,6 +109,9 @@ public class RecordServiceImpl extends BaseBehaviourBean { /** Logger */ private static Log logger = LogFactory.getLog(RecordServiceImpl.class); + + /** transation data key */ + private static final String IGNORE_ON_UPDATE = "ignoreOnUpdate"; /** I18N */ private static final String MSG_NODE_HAS_ASPECT = "rm.service.node-has-aspect"; @@ -335,8 +338,6 @@ public class RecordServiceImpl extends BaseBehaviourBean onDeleteDeclaredRecordLink); } - - /** * @see org.alfresco.repo.node.NodeServicePolicies.OnRemoveAspectPolicy#onRemoveAspect(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName) */ @@ -510,6 +511,15 @@ public class RecordServiceImpl extends BaseBehaviourBean { getBehaviour("onUpdateProperties").disable(); } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#disablePropertyEditableCheck(org.alfresco.service.cmr.repository.NodeRef) + */ + public void disablePropertyEditableCheck(NodeRef nodeRef) + { + Set ignoreOnUpdate = TransactionalResourceHelper.getSet(IGNORE_ON_UPDATE); + ignoreOnUpdate.add(nodeRef); + } /** * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#enablePropertyEditableCheck() @@ -537,7 +547,8 @@ public class RecordServiceImpl extends BaseBehaviourBean if (AuthenticationUtil.getFullyAuthenticatedUser() != null && !AuthenticationUtil.isRunAsUserTheSystemUser() && nodeService.exists(nodeRef) && - isRecord(nodeRef)) + isRecord(nodeRef) && + !TransactionalResourceHelper.getSet(IGNORE_ON_UPDATE).contains(nodeRef)) { for (Map.Entry entry : after.entrySet()) { @@ -560,9 +571,10 @@ public class RecordServiceImpl extends BaseBehaviourBean // otherwise propertyUnchanged = EqualsHelper.nullSafeEquals(beforeValue, afterValue); } - + if (!propertyUnchanged && - !isPropertyEditable(nodeRef, property)) + !(ContentModel.PROP_CONTENT.equals(property) && beforeValue == null) && + !isPropertyEditable(nodeRef, property)) { // the user can't edit the record property throw new ModelAccessDeniedException( @@ -814,19 +826,21 @@ public class RecordServiceImpl extends BaseBehaviourBean } /** - * @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) + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createNewRecord(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map, org.alfresco.service.cmr.repository.ContentReader) */ @Override - public NodeRef createRecord(NodeRef nodeRef, String name, QName type, Map properties, ContentReader reader) + public NodeRef createRecordFromContent(NodeRef parent, String name, QName type, Map properties, ContentReader reader) { - ParameterCheck.mandatory("nodeRef", nodeRef); + ParameterCheck.mandatory("nodeRef", parent); ParameterCheck.mandatory("name", name); - - NodeRef destination = nodeRef; - if (isFilePlan(nodeRef)) + + NodeRef record = null; + NodeRef destination = parent; + + if (isFilePlan(parent)) { // get the unfiled record container for the file plan - destination = filePlanService.getUnfiledContainer(nodeRef); + destination = filePlanService.getUnfiledContainer(parent); if (destination == null) { throw new AlfrescoRuntimeException("Unable to create record, because unfiled container could not be found."); @@ -838,24 +852,35 @@ public class RecordServiceImpl extends BaseBehaviourBean { type = ContentModel.TYPE_CONTENT; } - // TODO ensure that the type is a sub-type of cm:content - - // create the new record - NodeRef record = fileFolderService.create(destination, name, type).getNodeRef(); - - // set the properties - if (properties != null) + else if (!dictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT)) { - nodeService.addProperties(record, properties); + throw new AlfrescoRuntimeException("Record can only be created from a sub-type of cm:content."); } - - // set the content - if (reader != null) + + disablePropertyEditableCheck(); + try { - ContentWriter writer = fileFolderService.getWriter(record); - writer.setEncoding(reader.getEncoding()); - writer.setMimetype(reader.getMimetype()); - writer.putContent(reader); + // create the new record + record = fileFolderService.create(destination, name, type).getNodeRef(); + + // set the properties + if (properties != null) + { + nodeService.addProperties(record, properties); + } + + // set the content + if (reader != null) + { + ContentWriter writer = fileFolderService.getWriter(record); + writer.setEncoding(reader.getEncoding()); + writer.setMimetype(reader.getMimetype()); + writer.putContent(reader); + } + } + finally + { + enablePropertyEditableCheck(); } // Check if the "record" aspect has been applied already. @@ -882,6 +907,7 @@ public class RecordServiceImpl extends BaseBehaviourBean ParameterCheck.mandatory("document", document); ruleService.disableRules(); + disablePropertyEditableCheck(); try { // get the record id @@ -921,6 +947,7 @@ public class RecordServiceImpl extends BaseBehaviourBean finally { ruleService.enableRules(); + enablePropertyEditableCheck(); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java index e67a45884c..2b051c0133 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java @@ -116,10 +116,10 @@ public class ReportServiceImpl extends ServiceBaseImpl ParameterCheck.mandatory("nodeRef", nodeRef); ParameterCheck.mandatory("report", report); - return recordService.createRecord(nodeRef, - report.getReportName(), - report.getReportType(), - report.getReportProperties(), - report.getReportContent()); + return recordService.createRecordFromContent(nodeRef, + report.getReportName(), + report.getReportType(), + report.getReportProperties(), + report.getReportContent()); } } diff --git a/rm-server/source/java/org/alfresco/repo/model/filefolder/ExtendedFileFolderServiceImpl.java b/rm-server/source/java/org/alfresco/repo/model/filefolder/ExtendedFileFolderServiceImpl.java new file mode 100644 index 0000000000..51bff8301f --- /dev/null +++ b/rm-server/source/java/org/alfresco/repo/model/filefolder/ExtendedFileFolderServiceImpl.java @@ -0,0 +1,61 @@ +/** + * + */ +package org.alfresco.repo.model.filefolder; + +import org.alfresco.module.org_alfresco_module_rm.record.RecordService; +import org.alfresco.service.cmr.model.FileExistsException; +import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.QName; + +/** + * @author Roy Wetherall + */ +public class ExtendedFileFolderServiceImpl extends FileFolderServiceImpl +{ + protected RecordService recordService; + + public void setRecordService(RecordService recordService) + { + this.recordService = recordService; + } + + @Override + public FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) throws FileExistsException + { + FileInfo result = null; + + recordService.disablePropertyEditableCheck(); + try + { + result = super.create(parentNodeRef, name, typeQName); + } + finally + { + recordService.enablePropertyEditableCheck(); + recordService.disablePropertyEditableCheck(result.getNodeRef()); + } + + return result; + } + + @Override + public FileInfo create(NodeRef parentNodeRef, String name, QName typeQName, QName assocQName) throws FileExistsException + { + FileInfo result = null; + + recordService.disablePropertyEditableCheck(); + try + { + result = super.create(parentNodeRef, name, typeQName, assocQName); + } + finally + { + recordService.enablePropertyEditableCheck(); + recordService.disablePropertyEditableCheck(result.getNodeRef()); + } + + return result; + } +} diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java index ce88a9bce4..e1ff74ced6 100755 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java @@ -22,7 +22,7 @@ import org.alfresco.module.org_alfresco_module_rm.test.integration.disposition.D import org.alfresco.module.org_alfresco_module_rm.test.integration.dod.DoD5015TestSuite; import org.alfresco.module.org_alfresco_module_rm.test.integration.event.EventTestSuite; import org.alfresco.module.org_alfresco_module_rm.test.integration.issue.IssueTestSuite; -import org.alfresco.module.org_alfresco_module_rm.test.integration.record.RejectRecordTest; +import org.alfresco.module.org_alfresco_module_rm.test.integration.record.RecordTestSuite; import org.alfresco.module.org_alfresco_module_rm.test.integration.recordfolder.RecordFolderTestSuite; import org.alfresco.module.org_alfresco_module_rm.test.integration.report.ReportTestSuite; import org.junit.runner.RunWith; @@ -44,7 +44,7 @@ import org.junit.runners.Suite.SuiteClasses; EventTestSuite.class, ReportTestSuite.class, DispositionTestSuite.class, - RejectRecordTest.class, + RecordTestSuite.class, RecordFolderTestSuite.class }) public class IntegrationTestSuite diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CreateRecordTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CreateRecordTest.java new file mode 100644 index 0000000000..8ebcbea4f8 --- /dev/null +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/CreateRecordTest.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.test.integration.record; + +import java.util.HashSet; +import java.util.Set; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.capability.Capability; +import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; +import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.GUID; + +/** + * Create record tests. + * + * @author Roy Wetherall + * @since 2.2 + */ +public class CreateRecordTest extends BaseRMTestCase +{ + public void testCreateRecordCapabilityOnly() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + /** test data */ + String roleName = GUID.generate(); + String user = GUID.generate(); + NodeRef recordFolder; + NodeRef record; + + public void given() + { + // create role + Set capabilities = new HashSet(2); + capabilities.add(capabilityService.getCapability("ViewRecords")); + capabilities.add(capabilityService.getCapability("CreateRecords")); + filePlanRoleService.createRole(filePlan, roleName, roleName, capabilities); + + // create user and assign to role + createPerson(user, true); + filePlanRoleService.assignRoleToAuthority(filePlan, roleName, user); + + // create file plan structure + NodeRef rc = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(rc, GUID.generate()); + } + + public void when() + { + // give read and file permissions to user + filePlanPermissionService.setPermission(recordFolder, user, RMPermissionModel.FILING); + + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + record = recordService.createRecordFromContent(recordFolder, GUID.generate(), TYPE_CONTENT, null, null); + + return null; + } + }, user); + } + + public void then() + { + // check the details of the record + assertTrue(recordService.isRecord(record)); + } + }); + } + + /** + * @see + */ + public void testCreateRecordCapabilityOnlyFromFileFolderService() throws Exception + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + /** test data */ + String roleName = GUID.generate(); + String user = GUID.generate(); + NodeRef recordFolder; + NodeRef record; + + public void given() + { + // create role + Set capabilities = new HashSet(2); + capabilities.add(capabilityService.getCapability("ViewRecords")); + capabilities.add(capabilityService.getCapability("CreateRecords")); + filePlanRoleService.createRole(filePlan, roleName, roleName, capabilities); + + // create user and assign to role + createPerson(user, true); + filePlanRoleService.assignRoleToAuthority(filePlan, roleName, user); + + // create file plan structure + NodeRef rc = filePlanService.createRecordCategory(filePlan, GUID.generate()); + recordFolder = recordFolderService.createRecordFolder(rc, GUID.generate()); + } + + public void when() + { + // give read and file permissions to user + filePlanPermissionService.setPermission(recordFolder, user, RMPermissionModel.FILING); + + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + record = fileFolderService.create(recordFolder, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); + + ContentWriter writer = contentService.getWriter(record, ContentModel.TYPE_CONTENT, true); + writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); + writer.setEncoding("UTF-8"); + writer.putContent("Lucy Wetherall"); + + return null; + } + }, user); + } + + public void then() + { + // check the details of the record + assertTrue(recordService.isRecord(record)); + } + }); + } +} diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/RecordTestSuite.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/RecordTestSuite.java index 064882b873..7aace3f7f7 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/RecordTestSuite.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/record/RecordTestSuite.java @@ -31,7 +31,8 @@ import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses( { - RejectRecordTest.class + RejectRecordTest.class, + CreateRecordTest.class }) public class RecordTestSuite {