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
{