Author: tolusha
Date: 2011-07-21 08:52:33 -0400 (Thu, 21 Jul 2011)
New Revision: 4671
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/ACLInitializationHelper.java
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestWorkspaceStorageCacheInClusterMode.java
Log:
EXOJCR-1239: improve ACL permissions
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java 2011-07-21
09:39:19 UTC (rev 4670)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -21,6 +21,7 @@
import org.apache.ws.commons.util.Base64;
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.commons.utils.PrivilegedSystemHelper;
+import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
@@ -47,6 +48,7 @@
import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
import org.exoplatform.services.jcr.impl.util.io.FileCleanerHolder;
import org.exoplatform.services.jcr.impl.util.io.SpoolFile;
+import org.exoplatform.services.jcr.impl.xml.importing.ACLInitializationHelper;
import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -59,6 +61,7 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Stack;
import javax.jcr.NamespaceException;
@@ -326,6 +329,10 @@
int orderNumber = 0;
+ private String exoOwner;
+
+ private List<String> exoPrivileges;
+
HashMap<InternalQName, Integer> childNodesMap = new HashMap<InternalQName,
Integer>();
SVNodeData(QPath path, String identifier, String parentIdentifier, int version, int
orderNum)
@@ -343,6 +350,31 @@
this.mixinTypeNames = mixinTypeNames;
}
+ public String getExoOwner()
+ {
+ return exoOwner;
+ }
+
+ public List<String> getExoPrivileges()
+ {
+ return exoPrivileges;
+ }
+
+ public void setExoOwner(String exoOwner)
+ {
+ this.exoOwner = exoOwner;
+ }
+
+ public void setExoPrivileges(List<String> exoPrivileges)
+ {
+ this.exoPrivileges = exoPrivileges;
+ }
+
+ public void setACL(AccessControlList acl)
+ {
+ this.acl = acl;
+ }
+
/**
* Add name of child node.
*
@@ -624,6 +656,11 @@
SVNodeData currentNode = new SVNodeData(currentPath, exoId,
parentId, 0, orderNumber);
+ AccessControlList acl =
+ ACLInitializationHelper.initAcl(parents.size() == 0 ? null
: parents.peek().getACL(),
+ null, null);
+ currentNode.setACL(acl);
+
// push current node as parent
parents.push(currentNode);
@@ -738,7 +775,42 @@
}
parent.setMixinTypeNames(mixins);
}
+ else if
(currentProperty.getQPath().getName().equals(Constants.EXO_OWNER))
+ {
+ String exoOwner =
+ new
String(currentProperty.getValues().get(0).getAsByteArray(),
+ Constants.DEFAULT_ENCODING);
+ parent.setExoOwner(exoOwner);
+ SVNodeData curParent = parents.pop();
+
+ AccessControlList acl =
+ ACLInitializationHelper.initAcl(parents.size() == 0 ?
null : parents.peek().getACL(),
+ exoOwner, curParent.getExoPrivileges());
+ curParent.setACL(acl);
+
+ parents.push(curParent);
+ }
+ else if
(currentProperty.getQPath().getName().equals(Constants.EXO_PERMISSIONS))
+ {
+ List<String> exoPrivileges = new
ArrayList<String>();
+ for (int i = 0; i < currentProperty.getValues().size();
i++)
+ {
+ exoPrivileges.add(new
String(currentProperty.getValues().get(i).getAsByteArray(),
+ Constants.DEFAULT_ENCODING));
+ }
+ parent.setExoPrivileges(exoPrivileges);
+
+ SVNodeData curParent = parents.pop();
+
+ AccessControlList acl =
+ ACLInitializationHelper.initAcl(parents.size() == 0 ?
null : parents.peek().getACL(),
+ curParent.getExoOwner(), exoPrivileges);
+ curParent.setACL(acl);
+
+ parents.push(curParent);
+ }
+
// add property, no event fire, persisted, internally created,
root is ancestor to
// save
changes.add(new ItemState(currentProperty, ItemState.ADDED,
false, Constants.ROOT_PATH,
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java 2011-07-21
09:39:19 UTC (rev 4670)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/ACLInheritanceSupportedWorkspaceDataManager.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -18,7 +18,6 @@
*/
package org.exoplatform.services.jcr.impl.dataflow.persistent;
-import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
import org.exoplatform.services.jcr.dataflow.SharedDataManager;
import org.exoplatform.services.jcr.datamodel.ItemData;
@@ -27,7 +26,6 @@
import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.datamodel.QPathEntry;
import org.exoplatform.services.jcr.impl.core.itemfilters.QPathEntryFilter;
-import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -56,104 +54,12 @@
}
/**
- * Traverse items parents in persistent storage for ACL containing parent. Same work
is made in
- * SessionDataManager.getItemData(NodeData, QPathEntry[]) but for session scooped
items.
- *
- * @param node
- * - item
- * @return - parent or null
- * @throws RepositoryException
- */
- private AccessControlList getNearestACAncestorAcl(NodeData node) throws
RepositoryException
- {
-
- if (node.getParentIdentifier() != null)
- {
- NodeData parent = (NodeData)getItemData(node.getParentIdentifier());
- while (parent != null)
- {
- if (parent.getACL() != null)
- {
- // has an AC parent
- return parent.getACL();
- }
- // going up to the root
- parent = (NodeData)getItemData(parent.getParentIdentifier());
- }
- }
- return new AccessControlList();
- }
-
- /**
- * @param parent
- * - a parent, can be null (get item by id)
- * @param data
- * - an item data
- * @return - an item data with ACL was initialized
- * @throws RepositoryException
- */
- private ItemData initACL(NodeData parent, NodeData node) throws RepositoryException
- {
- if (node != null)
- {
- AccessControlList acl = node.getACL();
- if (acl == null)
- {
- if (parent != null)
- {
- // use parent ACL
- node =
- new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(), node
- .getPrimaryTypeName(), node.getMixinTypeNames(),
node.getOrderNumber(),
- node.getParentIdentifier(), parent.getACL());
- }
- else
- {
- // use nearest ancestor ACL... case of get by id
- node =
- new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(), node
- .getPrimaryTypeName(), node.getMixinTypeNames(),
node.getOrderNumber(),
- node.getParentIdentifier(), getNearestACAncestorAcl(node));
- }
- }
- else if (!acl.hasPermissions())
- {
- // use nearest ancestor permissions
- AccessControlList ancestorAcl = getNearestACAncestorAcl(node);
-
- node =
- new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(), node
- .getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(),
node.getParentIdentifier(),
- new AccessControlList(acl.getOwner(),
ancestorAcl.getPermissionEntries()));
- }
- else if (!acl.hasOwner())
- {
- // use nearest ancestor owner
- AccessControlList ancestorAcl = getNearestACAncestorAcl(node);
-
- node =
- new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(), node
- .getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(),
node.getParentIdentifier(),
- new AccessControlList(ancestorAcl.getOwner(),
acl.getPermissionEntries()));
-
- }
- }
-
- return node;
- }
-
- /**
* {@inheritDoc}
*/
// ------------ ItemDataConsumer impl ------------
public List<NodeData> getChildNodesData(NodeData parent) throws
RepositoryException
{
- final List<NodeData> nodes = persistentManager.getChildNodesData(parent);
- for (int i = 0; i < nodes.size(); i++)
- {
- nodes.set(i, (NodeData)initACL(parent, nodes.get(i)));
- }
- return nodes;
+ return persistentManager.getChildNodesData(parent);
}
/**
@@ -161,12 +67,7 @@
*/
public List<NodeData> getChildNodesData(NodeData parent,
List<QPathEntryFilter> patternFilters) throws RepositoryException
{
- final List<NodeData> nodes = persistentManager.getChildNodesData(parent,
patternFilters);
- for (int i = 0; i < nodes.size(); i++)
- {
- nodes.set(i, (NodeData)initACL(parent, nodes.get(i)));
- }
- return nodes;
+ return persistentManager.getChildNodesData(parent, patternFilters);
}
/**
@@ -198,8 +99,7 @@
*/
public ItemData getItemData(NodeData parent, QPathEntry name, ItemType itemType)
throws RepositoryException
{
- final ItemData item = persistentManager.getItemData(parent, name, itemType);
- return item != null && item.isNode() ? initACL(parent, (NodeData)item) :
item;
+ return persistentManager.getItemData(parent, name, itemType);
}
/**
@@ -207,8 +107,7 @@
*/
public ItemData getItemData(String identifier) throws RepositoryException
{
- final ItemData item = persistentManager.getItemData(identifier);
- return item != null && item.isNode() ? initACL(null, (NodeData)item) :
item;
+ return persistentManager.getItemData(identifier);
}
/**
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-07-21
09:39:19 UTC (rev 4670)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -19,6 +19,7 @@
package org.exoplatform.services.jcr.impl.dataflow.persistent;
import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
import
org.exoplatform.services.jcr.dataflow.persistent.MandatoryItemsPersistenceListener;
import org.exoplatform.services.jcr.dataflow.persistent.WorkspaceStorageCache;
@@ -36,6 +37,7 @@
import org.exoplatform.services.jcr.impl.backup.SuspendException;
import org.exoplatform.services.jcr.impl.backup.Suspendable;
import org.exoplatform.services.jcr.impl.core.itemfilters.QPathEntryFilter;
+import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import
org.exoplatform.services.jcr.impl.dataflow.session.TransactionableResourceManager;
import
org.exoplatform.services.jcr.impl.dataflow.session.TransactionableResourceManagerListener;
import org.exoplatform.services.jcr.impl.storage.SystemDataContainerHolder;
@@ -1551,6 +1553,14 @@
protected ItemData getPersistedItemData(String identifier) throws RepositoryException
{
ItemData data = super.getItemData(identifier);
+
+ // set ACL
+
+ if (data != null && data.isNode())
+ {
+ data = initACL(null, (NodeData)data);
+ }
+
if (cache.isEnabled())
{
if (data != null)
@@ -1920,6 +1930,96 @@
{
throw new RuntimeException(cause);
}
- }
+ }
}
+
+ /**
+ * Init ACL of the node.
+ *
+ * @param parent
+ * - a parent, can be null (get item by id)
+ * @param data
+ * - an item data
+ * @return - an item data with ACL was initialized
+ * @throws RepositoryException
+ */
+ private ItemData initACL(NodeData parent, NodeData node) throws RepositoryException
+ {
+ if (node != null)
+ {
+ AccessControlList acl = node.getACL();
+ if (acl == null)
+ {
+ if (parent != null)
+ {
+ // use parent ACL
+ node =
+ new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(),
+ node.getPrimaryTypeName(), node.getMixinTypeNames(),
node.getOrderNumber(),
+ node.getParentIdentifier(), parent.getACL());
+ }
+ else
+ {
+ // use nearest ancestor ACL... case of get by id
+ node =
+ new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(),
+ node.getPrimaryTypeName(), node.getMixinTypeNames(),
node.getOrderNumber(),
+ node.getParentIdentifier(), getNearestACAncestorAcl(node));
+ }
+ }
+ else if (!acl.hasPermissions())
+ {
+ // use nearest ancestor permissions
+ AccessControlList ancestorAcl = getNearestACAncestorAcl(node);
+
+ node =
+ new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(),
+ node.getPrimaryTypeName(), node.getMixinTypeNames(),
node.getOrderNumber(),
+ node.getParentIdentifier(), new AccessControlList(acl.getOwner(),
ancestorAcl.getPermissionEntries()));
+ }
+ else if (!acl.hasOwner())
+ {
+ // use nearest ancestor owner
+ AccessControlList ancestorAcl = getNearestACAncestorAcl(node);
+
+ node =
+ new TransientNodeData(node.getQPath(), node.getIdentifier(),
node.getPersistedVersion(),
+ node.getPrimaryTypeName(), node.getMixinTypeNames(),
node.getOrderNumber(),
+ node.getParentIdentifier(), new
AccessControlList(ancestorAcl.getOwner(), acl.getPermissionEntries()));
+
+ }
+ }
+
+ return node;
+ }
+
+ /**
+ * Traverse items parents in persistent storage for ACL containing parent. Same work
is made in
+ * SessionDataManager.getItemData(NodeData, QPathEntry[]) but for session scooped
items.
+ *
+ * @param node
+ * - item
+ * @return - parent or null
+ * @throws RepositoryException
+ */
+ private AccessControlList getNearestACAncestorAcl(NodeData node) throws
RepositoryException
+ {
+
+ if (node.getParentIdentifier() != null)
+ {
+ NodeData parent = (NodeData)getItemData(node.getParentIdentifier());
+ while (parent != null)
+ {
+ if (parent.getACL() != null)
+ {
+ // has an AC parent
+ return parent.getACL();
+ }
+ // going up to the root
+ parent = (NodeData)getItemData(parent.getParentIdentifier());
+ }
+ }
+ return new AccessControlList();
+ }
+
}
\ No newline at end of file
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/ACLInitializationHelper.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/ACLInitializationHelper.java
(rev 0)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/ACLInitializationHelper.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2011 eXo Platform SAS.
+ *
+ * This 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 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.xml.importing;
+
+import org.exoplatform.services.jcr.access.AccessControlEntry;
+import org.exoplatform.services.jcr.access.AccessControlList;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * @author <a href="abazko(a)exoplatform.com">Anatoliy Bazko</a>
+ * @version $Id: ACLInitializationHelper.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class ACLInitializationHelper
+{
+
+ public static AccessControlList initAcl(AccessControlList parentACL, String owner,
List<String> exoPermissions)
+ {
+ boolean isOwneable = owner != null;
+ boolean isPrivilegeable = exoPermissions != null;
+
+ AccessControlList acl;
+ if (isOwneable)
+ {
+ // has own owner
+ if (isPrivilegeable)
+ {
+ // and permissions
+ acl = new AccessControlList(owner, readACLPermisions(exoPermissions));
+ }
+ else if (parentACL != null)
+ {
+ // use permissions from existed parent
+ acl = new AccessControlList(owner, parentACL.hasPermissions() ?
parentACL.getPermissionEntries() : null);
+ }
+ else
+ {
+ // have to search nearest ancestor permissions in ACL manager
+ // acl = new AccessControlList(owner,
+ // traverseACLPermissions(cpid));
+ acl = new AccessControlList(owner, null);
+ }
+ }
+ else if (isPrivilegeable)
+ {
+ // has own permissions
+ if (isOwneable)
+ {
+ // and owner
+ acl = new AccessControlList(owner, readACLPermisions(exoPermissions));
+ }
+ else if (parentACL != null)
+ {
+ // use owner from existed parent
+ acl = new AccessControlList(parentACL.getOwner(),
readACLPermisions(exoPermissions));
+ }
+ else
+ {
+ // have to search nearest ancestor owner in ACL manager
+ // acl = new AccessControlList(traverseACLOwner(cpid),
+ // readACLPermisions(cid));
+ acl = new AccessControlList(null, readACLPermisions(exoPermissions));
+ }
+ }
+ else
+ {
+ if (parentACL != null)
+ // construct ACL from existed parent ACL
+ acl =
+ new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions()
+ ? parentACL.getPermissionEntries() : null);
+ else
+ // have to search nearest ancestor owner and permissions in ACL manager
+ // acl = traverseACL(cpid);
+ acl = null;
+ }
+ return acl;
+ }
+
+ /**
+ * Return permission values or throw an exception. We assume the node is
+ * mix:privilegeable.
+ */
+ private static List<AccessControlEntry> readACLPermisions(List<String>
exoPermissions)
+ {
+ List<AccessControlEntry> naPermissions = new
ArrayList<AccessControlEntry>();
+
+ for (String perm : exoPermissions)
+ {
+ StringTokenizer parser = new StringTokenizer(perm,
AccessControlEntry.DELIMITER);
+ naPermissions.add(new AccessControlEntry(parser.nextToken(),
parser.nextToken()));
+ }
+
+ return naPermissions;
+ }
+
+}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java 2011-07-21
09:39:19 UTC (rev 4670)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -18,8 +18,6 @@
*/
package org.exoplatform.services.jcr.impl.xml.importing;
-import org.exoplatform.services.jcr.access.AccessControlEntry;
-import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
@@ -27,7 +25,6 @@
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
-import org.exoplatform.services.jcr.datamodel.IllegalACLException;
import org.exoplatform.services.jcr.datamodel.IllegalPathException;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.ItemData;
@@ -58,7 +55,6 @@
import java.util.List;
import java.util.Map;
import java.util.Stack;
-import java.util.StringTokenizer;
import javax.jcr.ImportUUIDBehavior;
import javax.jcr.ItemExistsException;
@@ -452,91 +448,8 @@
currentNodeInfo.setIdentifier(identifier);
}
- protected AccessControlList initAcl(AccessControlList parentACL, boolean isOwneable,
boolean isPrivilegeable,
- String owner, List<String> exoPermissions)
- {
- AccessControlList acl;
- if (isOwneable)
- {
- // has own owner
- if (isPrivilegeable)
- {
- // and permissions
- acl = new AccessControlList(owner, readACLPermisions(exoPermissions));
- }
- else if (parentACL != null)
- {
- // use permissions from existed parent
- acl = new AccessControlList(owner, parentACL.hasPermissions() ?
parentACL.getPermissionEntries() : null);
- }
- else
- {
- // have to search nearest ancestor permissions in ACL manager
- // acl = new AccessControlList(owner,
- // traverseACLPermissions(cpid));
- acl = new AccessControlList(owner, null);
- }
- }
- else if (isPrivilegeable)
- {
- // has own permissions
- if (isOwneable)
- {
- // and owner
- acl = new AccessControlList(owner, readACLPermisions(exoPermissions));
- }
- else if (parentACL != null)
- {
- // use owner from existed parent
- acl = new AccessControlList(parentACL.getOwner(),
readACLPermisions(exoPermissions));
- }
- else
- {
- // have to search nearest ancestor owner in ACL manager
- // acl = new AccessControlList(traverseACLOwner(cpid),
- // readACLPermisions(cid));
- acl = new AccessControlList(null, readACLPermisions(exoPermissions));
- }
- }
- else
- {
- if (parentACL != null)
- // construct ACL from existed parent ACL
- acl =
- new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions() ?
parentACL
- .getPermissionEntries() : null);
- else
- // have to search nearest ancestor owner and permissions in ACL manager
- // acl = traverseACL(cpid);
- acl = null;
- }
- return acl;
- }
/**
- * Return permission values or throw an exception. We assume the node is
- * mix:privilegeable.
- *
- * @param cid Node id
- * @return list of ACL entries
- * @throws IllegalACLException if property exo:permissions is not found for
- * node
- */
- protected List<AccessControlEntry> readACLPermisions(List<String>
exoPermissions)
- {
- List<AccessControlEntry> naPermissions = new
ArrayList<AccessControlEntry>();
-
- for (String perm : exoPermissions)
- {
-
- StringTokenizer parser = new StringTokenizer(perm,
AccessControlEntry.DELIMITER);
- naPermissions.add(new AccessControlEntry(parser.nextToken(),
parser.nextToken()));
-
- }
- return naPermissions;
- }
-
- /**
* Check if item with uuid=identifier exists. If no item exist return same
* identifier. If same uuid item exist and depend on uuidBehavior do:
* <ol>
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java 2011-07-21
09:39:19 UTC (rev 4670)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -443,8 +443,8 @@
}
- nodeData.setACL(initAcl(parentNodeData.getACL(), nodeData.isExoOwneable(),
nodeData.isExoPrivilegeable(),
- nodeData.getExoOwner(), nodeData.getExoPrivileges()));
+ nodeData.setACL(ACLInitializationHelper.initAcl(parentNodeData.getACL(),
nodeData.getExoOwner(),
+ nodeData.getExoPrivileges()));
if (nodeData.isMixVersionable())
{
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java 2011-07-21
09:39:19 UTC (rev 4670)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -361,8 +361,8 @@
createVersionHistory(currentNodeInfo);
}
- currentNodeInfo.setACL(initAcl(currentNodeInfo.getACL(),
currentNodeInfo.isExoOwneable(), currentNodeInfo
- .isExoPrivilegeable(), currentNodeInfo.getExoOwner(),
currentNodeInfo.getExoPrivileges()));
+ currentNodeInfo.setACL(ACLInitializationHelper.initAcl(currentNodeInfo.getACL(),
currentNodeInfo.getExoOwner(),
+ currentNodeInfo.getExoPrivileges()));
}
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestWorkspaceStorageCacheInClusterMode.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestWorkspaceStorageCacheInClusterMode.java 2011-07-21
09:39:19 UTC (rev 4670)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestWorkspaceStorageCacheInClusterMode.java 2011-07-21
12:52:33 UTC (rev 4671)
@@ -20,6 +20,7 @@
import org.exoplatform.commons.utils.QName;
import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
@@ -797,8 +798,17 @@
}
if (itemType == ItemType.NODE)
{
- return new PersistedNodeData("my-node" +
parentNode.getIdentifier(), QPath.makeChildPath(parentNode.getQPath(), name),
Constants.ROOT_UUID, 1, 1,
- Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
+ if (name.equals(Constants.ROOT_PATH.getEntries()[0]))
+ {
+ return new PersistedNodeData(Constants.ROOT_UUID, Constants.ROOT_PATH,
Constants.ROOT_PARENT_UUID, 1, 1,
+ Constants.NT_UNSTRUCTURED, new InternalQName[0], new
AccessControlList());
+ }
+ else
+ {
+ return new PersistedNodeData("my-node" +
parentNode.getIdentifier(), QPath.makeChildPath(
+ parentNode.getQPath(), name), Constants.ROOT_UUID, 1, 1,
Constants.NT_UNSTRUCTURED,
+ new InternalQName[0], null);
+ }
}
try
{
@@ -827,7 +837,16 @@
Thread.currentThread().interrupt();
}
}
- return parentNode;
+
+ if (identifier.equals(Constants.ROOT_UUID))
+ {
+ return new PersistedNodeData(Constants.ROOT_UUID, Constants.ROOT_PATH,
Constants.ROOT_PARENT_UUID, 1, 1,
+ Constants.NT_UNSTRUCTURED, new InternalQName[0], new
AccessControlList());
+ }
+ else
+ {
+ return parentNode;
+ }
}
public List<PropertyData> getReferencesData(String nodeIdentifier) throws
RepositoryException,