diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml
index 5989e204a8..88749a35c5 100644
--- a/config/alfresco/core-services-context.xml
+++ b/config/alfresco/core-services-context.xml
@@ -483,6 +483,12 @@
+
+
+
+
+
+
diff --git a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java
index 02b7581739..352c58cd26 100644
--- a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java
+++ b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java
@@ -47,6 +47,10 @@ import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.rule.RuleService;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
+import org.alfresco.service.cmr.security.AccessPermission;
+import org.alfresco.service.cmr.security.AccessStatus;
+import org.alfresco.service.cmr.security.AuthenticationService;
+import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
@@ -73,6 +77,12 @@ public class CopyServiceImpl implements CopyService
/** Rule service */
private RuleService ruleService;
+
+ /** Permission service */
+ private PermissionService permissionService;
+
+ /** Authentication service */
+ private AuthenticationService authenticationService;
/** Policy delegates */
private ClassPolicyDelegate onCopyNodeDelegate;
@@ -128,6 +138,26 @@ public class CopyServiceImpl implements CopyService
this.ruleService = ruleService;
}
+ /**
+ * Set the permission service
+ *
+ * @param permissionService the permission service
+ */
+ public void setPermissionService(PermissionService permissionService)
+ {
+ this.permissionService = permissionService;
+ }
+
+ /**
+ * Sets the authentication service
+ *
+ * @param authenticationService the authentication service
+ */
+ public void setAuthenticationService(AuthenticationService authenticationService)
+ {
+ this.authenticationService = authenticationService;
+ }
+
/**
* Initialise method
*/
@@ -395,6 +425,9 @@ public class CopyServiceImpl implements CopyService
// Copy the associations
copyAssociations(destinationNodeRef, copyDetails, copyChildren, copiedChildren);
+
+ // Copy permissions
+ copyPermissions(sourceNodeRef, destinationNodeRef);
}
finally
{
@@ -404,6 +437,34 @@ public class CopyServiceImpl implements CopyService
return destinationNodeRef;
}
+ /**
+ * Copies the permissions of the source node reference onto the destination node reference
+ *
+ * @param sourceNodeRef the source node reference
+ * @param destinationNodeRef the destination node reference
+ */
+ private void copyPermissions(NodeRef sourceNodeRef, NodeRef destinationNodeRef)
+ {
+ // Get the permission details of the source node reference
+ Set permissions = this.permissionService.getAllSetPermissions(sourceNodeRef);
+ boolean includeInherited = this.permissionService.getInheritParentPermissions(sourceNodeRef);
+
+ AccessStatus writePermission = permissionService.hasPermission(destinationNodeRef, PermissionService.CHANGE_PERMISSIONS);
+ if (this.authenticationService.isCurrentUserTheSystemUser() || writePermission.equals(AccessStatus.ALLOWED))
+ {
+ // Set the permission values on the destination node
+ for (AccessPermission permission : permissions)
+ {
+ this.permissionService.setPermission(
+ destinationNodeRef,
+ permission.getAuthority(),
+ permission.getPermission(),
+ permission.getAccessStatus().equals(AccessStatus.ALLOWED));
+ }
+ this.permissionService.setInheritParentPermissions(destinationNodeRef, includeInherited);
+ }
+ }
+
/**
* Gets the copy details. This calls the appropriate policies that have been registered
* against the node and aspect types in order to pick-up any type specific copy behaviour.
diff --git a/source/java/org/alfresco/repo/jscript/Node.java b/source/java/org/alfresco/repo/jscript/Node.java
index 8fe97a8c2b..59987af97c 100644
--- a/source/java/org/alfresco/repo/jscript/Node.java
+++ b/source/java/org/alfresco/repo/jscript/Node.java
@@ -847,56 +847,68 @@ public final class Node implements Serializable
for (String key : this.properties.keySet())
{
Serializable value = (Serializable)this.properties.get(key);
- if (value instanceof Node)
- {
- // convert back to NodeRef
- value = ((Node)value).getNodeRef();
- }
- else if (value instanceof ScriptContentData)
- {
- // convert back to ContentData
- value = ((ScriptContentData)value).contentData;
- }
- else if (value instanceof Wrapper)
- {
- // unwrap a Java object from a JavaScript wrapper
- value = (Serializable)((Wrapper)value).unwrap();
- }
- else if (value instanceof ScriptableObject)
- {
- // a scriptable object will probably indicate a multi-value property
- // set using a JavaScript Array object
- ScriptableObject values = (ScriptableObject)value;
-
- // convert JavaScript array of values to a List of Serializable objects
- Object[] propIds = values.getIds();
- List propValues = new ArrayList(propIds.length);
- for (int i=0; i propValues = new ArrayList(propIds.length);
+ for (int i=0; i