Author: sergiykarpenko
Date: 2009-11-26 07:38:16 -0500 (Thu, 26 Nov 2009)
New Revision: 879
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java
Log:
EXOJCR-270: updatetreeACL implemented
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java
===================================================================
---
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java 2009-11-26
11:46:36 UTC (rev 878)
+++
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java 2009-11-26
12:38:16 UTC (rev 879)
@@ -18,12 +18,15 @@
*/
package org.exoplatform.services.jcr.impl.storage.jbosscache;
+import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.ItemData;
import org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.datamodel.QPath;
import org.exoplatform.services.jcr.datamodel.QPathEntry;
import org.exoplatform.services.jcr.datamodel.ValueData;
+import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.lock.LockData;
import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
@@ -79,9 +82,10 @@
private boolean batchStarted = false;
private boolean isCommited = false;
-
- class NodesOrderComparator<N extends NodeData> implements
Comparator<NodeData> {
+ class NodesOrderComparator<N extends NodeData> implements
Comparator<NodeData>
+ {
+
/**
* {@inheritDoc}
*/
@@ -387,7 +391,7 @@
// TODO We have to order childs by orderNumber, as JBC returns childs in any order
Collections.sort(childs, new NodesOrderComparator<NodeData>());
-
+
return childs;
}
@@ -756,6 +760,14 @@
{
((TransientNodeData)data).addState(TransientNodeData.TRANSITIVE_MIXIN_UPDATED);
}
+
+ // do update ACL if needed
+
+ if (!prevData.getACL().equals(data.getACL()))
+ {
+ updateTreeACL(node, data.getACL());
+ }
+
}
/**
@@ -860,6 +872,61 @@
}
/**
+ * Update Nodes ACL with new ACL.
+ *
+ * @param node Node - cache node containing root of JCR subtree.
+ * @param newACL - new ACL that must be inserted to node data.
+ * @throws RepositoryException on error state detected
+ */
+ protected void updateTreeACL(Node<Serializable, Object> node, AccessControlList
newACL) throws RepositoryException
+ {
+
+ NodeData prevData = (NodeData)node.get(ITEM_DATA);
+
+ // is exo:Privilegeable
+ boolean isPrivilegeable = false;
+ for (InternalQName mixin : prevData.getMixinTypeNames())
+ {
+ if (mixin.equals(Constants.EXO_PRIVILEGEABLE))
+ {
+ isPrivilegeable = true;
+ break;
+ }
+ }
+
+ if (!isPrivilegeable || prevData.getACL().equals(newACL))
+ {
+ // do update NodeData
+ TransientNodeData newData =
+ new TransientNodeData(prevData.getQPath(), prevData.getIdentifier(),
prevData.getPersistedVersion(),
+ prevData.getPrimaryTypeName(), prevData.getMixinTypeNames(),
prevData.getOrderNumber(), prevData
+ .getParentIdentifier(), newACL);
+ newData.addState(TransientPropertyData.TRANSITIVE_PATH_UPDATED);
+ node.put(ITEM_DATA, newData);
+
+ // do update child nodes
+
+ for (Node<Serializable, Object> child : node.getChildren())
+ {
+ String childNodeId = (String)child.get(ITEM_ID);
+ if (childNodeId == null)
+ {
+ throw new RepositoryException("FATAL Child Node Id key is null.
Parent " + newData.getQPath());
+ }
+
+ Node<Serializable, Object> childNode =
nodesRoot.getChild(makeNodeFqn(childNodeId));
+ if (childNode == null)
+ {
+ throw new RepositoryException("FATAL Node record not found (" +
childNodeId
+ + "), but listed in childs of " + newData.getQPath());
+ }
+
+ updateTreeACL(childNode, newACL);
+ }
+ }
+ }
+
+ /**
* {@inheritDoc}
*/
public void update(NodeData data) throws RepositoryException,
UnsupportedOperationException,
Show replies by date