exo-jcr SVN: r4678 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr: impl/core and 1 other directory.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-07-25 05:18:04 -0400 (Mon, 25 Jul 2011)
New Revision: 4678
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedNode.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
Log:
EXOJCR-267: Implement Lazy Loading mechanism for the method Node.getNodes
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedNode.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedNode.java 2011-07-22 08:50:28 UTC (rev 4677)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedNode.java 2011-07-25 09:18:04 UTC (rev 4678)
@@ -27,6 +27,7 @@
import javax.jcr.AccessDeniedException;
import javax.jcr.InvalidItemStateException;
import javax.jcr.Node;
+import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.lock.Lock;
@@ -118,4 +119,15 @@
*/
Lock lock(boolean isDeep, long timeOut) throws UnsupportedRepositoryOperationException, LockException,
AccessDeniedException, InvalidItemStateException, RepositoryException;
+
+ /**
+ * Returns a <code>NodeIterator</code> over all child <code>Node</code>s of
+ * this <code>Node</code>. Does <i>not</i> include properties of this
+ * <code>Node</code>. If this node has no child nodes, then an empty iterator is returned.
+ *
+ * @return A <code>NodeIterator</code> over all child <code>Node</code>s of
+ * this <code>Node</code>.
+ * @throws RepositoryException If an error occurs.
+ */
+ public NodeIterator getNodesLazily() throws RepositoryException;
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-07-22 08:50:28 UTC (rev 4677)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-07-25 09:18:04 UTC (rev 4678)
@@ -1084,6 +1084,14 @@
/**
* {@inheritDoc}
*/
+ public NodeIterator getNodesLazily() throws RepositoryException
+ {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public NodeIterator getNodes(String namePattern) throws RepositoryException
{
12 years, 9 months
exo-jcr SVN: r4677 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/impl/core/query and 1 other directory.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-07-22 04:50:28 -0400 (Fri, 22 Jul 2011)
New Revision: 4677
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestTwoWayRangeIterator.java
Log:
EXOJCR-1389 : Skip checking access when system session used.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java 2011-07-22 08:05:18 UTC (rev 4676)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java 2011-07-22 08:50:28 UTC (rev 4677)
@@ -18,6 +18,7 @@
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.access.PermissionType;
+import org.exoplatform.services.jcr.access.SystemIdentity;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.datamodel.QPath;
@@ -140,6 +141,11 @@
* The maximum size of this result if limit > 0
*/
private final long limit;
+
+ /**
+ * If <code>true</code>, it means we're using a System session.
+ */
+ private final boolean isSystemSession;
/**
* Creates a new query result. The concrete sub class is responsible for
@@ -182,6 +188,7 @@
this.docOrder = orderProps.length == 0 && documentOrder;
this.offset = offset;
this.limit = limit;
+ this.isSystemSession = SystemIdentity.SYSTEM.equals(session.getUserID());
}
/**
@@ -415,6 +422,10 @@
*/
private boolean isAccessGranted(ScoreNode[] nodes) throws RepositoryException
{
+ if (isSystemSession)
+ {
+ return true;
+ }
for (int i = 0; i < nodes.length; i++)
{
try
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestTwoWayRangeIterator.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestTwoWayRangeIterator.java 2011-07-22 08:05:18 UTC (rev 4676)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/query/TestTwoWayRangeIterator.java 2011-07-22 08:50:28 UTC (rev 4677)
@@ -17,15 +17,20 @@
package org.exoplatform.services.jcr.impl.core.query;
import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.access.PermissionType;
+import org.exoplatform.services.jcr.core.CredentialsImpl;
+import org.exoplatform.services.jcr.core.ExtendedNode;
import org.exoplatform.services.jcr.impl.core.query.lucene.TwoWayRangeIterator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
+import java.util.HashMap;
import java.util.NoSuchElementException;
import java.util.Random;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
@@ -44,6 +49,8 @@
private final Log log = ExoLogger.getLogger("exo.jcr.component.core.TestScoreNodeIterator");
private Random random = new Random();
+
+ private Session userSession;
private final int TEST_NODES_COUNT = 100;
@@ -57,6 +64,12 @@
{
Node subnode = testRoot.addNode("TestNode" + String.format("%07d", i));
subnode.setProperty("val", i);
+ ExtendedNode subnode2 = (ExtendedNode)testRoot.addNode("TestNode2-" + String.format("%07d", i));
+ subnode2.setProperty("val", i);
+ subnode2.addMixin("exo:privilegeable");
+ HashMap<String, String[]> perm = new HashMap<String, String[]>();
+ perm.put("admin", PermissionType.ALL);
+ subnode2.setPermissions(perm);
}
}
@@ -68,7 +81,15 @@
Node testRoot = root.addNode(testRootNodeName);
prepareRoot(testRoot);
root.save();
+ userSession = repository.login(new CredentialsImpl("john", "exo".toCharArray()), "ws");
}
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ userSession.logout();
+ super.tearDown();
+ }
// Check random skipping from start of set
public void testSkipFromStart() throws Exception
@@ -259,7 +280,7 @@
protected void checkPosition(ScoreNodeTester testAction, long expectedPosition) throws RepositoryException
{
- QueryManager qm = workspace.getQueryManager();
+ QueryManager qm = userSession.getWorkspace().getQueryManager();
// Doc order
String strDocOrder = "select * from nt:unstructured where jcr:path like '/" + testRootNodeName + "/%'";
12 years, 9 months
exo-jcr SVN: r4676 - jcr/trunk/packaging/module/src/main/javascript.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-07-22 04:05:18 -0400 (Fri, 22 Jul 2011)
New Revision: 4676
Modified:
jcr/trunk/packaging/module/src/main/javascript/jcr.packaging.module.js
Log:
EXOJCR-1315: Align commons-collection depenency version in JCR subprojects
Modified: jcr/trunk/packaging/module/src/main/javascript/jcr.packaging.module.js
===================================================================
--- jcr/trunk/packaging/module/src/main/javascript/jcr.packaging.module.js 2011-07-22 08:04:46 UTC (rev 4675)
+++ jcr/trunk/packaging/module/src/main/javascript/jcr.packaging.module.js 2011-07-22 08:05:18 UTC (rev 4676)
@@ -34,8 +34,7 @@
module.frameworks = {}
module.frameworks.web =
new Project("org.exoplatform.jcr", "exo.jcr.framework.web", "jar", module.version).
- addDependency(ws.rest).
- addDependency(new Project("commons-chain", "commons-chain", "jar", "1.2"));
+ addDependency(ws.rest);
module.frameworks.command = new Project("org.exoplatform.jcr", "exo.jcr.framework.command", "jar", module.version).
addDependency(new Project("commons-fileupload", "commons-fileupload", "jar", "1.2.1"));
12 years, 9 months
exo-jcr SVN: r4675 - in ws/trunk: exo.ws.rest.core and 1 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-07-22 04:04:46 -0400 (Fri, 22 Jul 2011)
New Revision: 4675
Modified:
ws/trunk/exo.ws.rest.core/pom.xml
ws/trunk/packaging/module/src/main/javascript/ws.packaging.module.js
ws/trunk/pom.xml
Log:
EXOJCR-1315: Align commons-collection depenency version in JCR subprojects
Modified: ws/trunk/exo.ws.rest.core/pom.xml
===================================================================
--- ws/trunk/exo.ws.rest.core/pom.xml 2011-07-22 08:03:27 UTC (rev 4674)
+++ ws/trunk/exo.ws.rest.core/pom.xml 2011-07-22 08:04:46 UTC (rev 4675)
@@ -97,10 +97,6 @@
<artifactId>jsr311-api</artifactId>
</dependency>
<dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- </dependency>
- <dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
Modified: ws/trunk/packaging/module/src/main/javascript/ws.packaging.module.js
===================================================================
--- ws/trunk/packaging/module/src/main/javascript/ws.packaging.module.js 2011-07-22 08:03:27 UTC (rev 4674)
+++ ws/trunk/packaging/module/src/main/javascript/ws.packaging.module.js 2011-07-22 08:04:46 UTC (rev 4675)
@@ -38,7 +38,6 @@
addDependency(new Project("javax.annotation", "jsr250-api", "jar", "1.0")).
addDependency(new Project("javax.inject", "javax.inject", "jar", "1")).
addDependency(new Project("javax.ws.rs", "jsr311-api", "jar", "1.0")).
- addDependency(new Project("commons-chain", "commons-chain", "jar", "1.2")).
addDependency(new Project("javax.xml.bind", "jaxb-api", "jar", "2.1"));
module.soap = {};
Modified: ws/trunk/pom.xml
===================================================================
--- ws/trunk/pom.xml 2011-07-22 08:03:27 UTC (rev 4674)
+++ ws/trunk/pom.xml 2011-07-22 08:04:46 UTC (rev 4675)
@@ -148,14 +148,8 @@
<version>0.7.4</version>
</dependency>
<dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>1.4</version>
- </dependency>
- <dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
- <!-- version>1.2.1</version -->
<version>1.0</version>
</dependency>
<dependency>
12 years, 9 months
exo-jcr SVN: r4674 - core/trunk/packaging/module/src/main/javascript.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-07-22 04:03:27 -0400 (Fri, 22 Jul 2011)
New Revision: 4674
Modified:
core/trunk/packaging/module/src/main/javascript/core.packaging.module.js
Log:
EXOJCR-1315: Align commons-collection depenency version in JCR subprojects
Modified: core/trunk/packaging/module/src/main/javascript/core.packaging.module.js
===================================================================
--- core/trunk/packaging/module/src/main/javascript/core.packaging.module.js 2011-07-22 08:02:53 UTC (rev 4673)
+++ core/trunk/packaging/module/src/main/javascript/core.packaging.module.js 2011-07-22 08:03:27 UTC (rev 4674)
@@ -21,7 +21,6 @@
addDependency(new Project("org.hibernate", "hibernate-commons-annotations", "jar", "3.1.0.GA")).
addDependency(new Project("org.hibernate", "ejb3-persistence", "jar", "1.0.2.GA")).
addDependency(new Project("org.javassist", "javassist", "jar", "3.14.0-GA")).
- addDependency(new Project("commons-collections", "commons-collections", "jar", "3.2.1")).
addDependency(new Project("c3p0", "c3p0", "jar", "0.9.1.2")).
addDependency(new Project("antlr", "antlr", "jar", "2.7.6rc1")).
addDependency(new Project("javax.transaction", "jta", "jar", "1.1")).
12 years, 9 months
exo-jcr SVN: r4673 - kernel/trunk/packaging/module/src/main/javascript.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-07-22 04:02:53 -0400 (Fri, 22 Jul 2011)
New Revision: 4673
Modified:
kernel/trunk/packaging/module/src/main/javascript/kernel.packaging.module.js
Log:
EXOJCR-1315: Align commons-collection depenency version in JCR subprojects
Modified: kernel/trunk/packaging/module/src/main/javascript/kernel.packaging.module.js
===================================================================
--- kernel/trunk/packaging/module/src/main/javascript/kernel.packaging.module.js 2011-07-21 15:02:35 UTC (rev 4672)
+++ kernel/trunk/packaging/module/src/main/javascript/kernel.packaging.module.js 2011-07-22 08:02:53 UTC (rev 4673)
@@ -35,7 +35,8 @@
module.component = {};
module.component.common =
- new Project("org.exoplatform.kernel", "exo.kernel.component.common", "jar", module.version).
+ new Project("org.exoplatform.kernel", "exo.kernel.component.common", "jar", module.version).
+ addDependency(new Project("commons-collections", "commons-collections", "jar", "3.2.1")).
addDependency(new Project("org.quartz-scheduler", "quartz", "jar", "1.8.4")).
addDependency(new Project("javax.activation", "activation", "jar", "1.1")).
addDependency(new Project("javax.mail", "mail", "jar", "1.4.4"));
12 years, 9 months
exo-jcr SVN: r4672 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow: serialization and 1 other directory.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-07-21 11:02:35 -0400 (Thu, 21 Jul 2011)
New Revision: 4672
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PersistedNodeDataReader.java
Removed:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PresistedNodeDataReader.java
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/serialization/ItemStateReader.java
Log:
EXOJCR-1239: improve ACL permissions
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 12:52:33 UTC (rev 4671)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2011-07-21 15:02:35 UTC (rev 4672)
@@ -617,7 +617,8 @@
{
public ItemData run() throws RepositoryException
{
- return CacheableWorkspaceDataManager.super.getItemData(parentData, name, itemType);
+ ItemData item = CacheableWorkspaceDataManager.super.getItemData(parentData, name, itemType);
+ return item != null && item.isNode() ? initACL(parentData, (NodeData)item) : item;
}
});
}
@@ -680,7 +681,8 @@
{
public ItemData run() throws RepositoryException
{
- return CacheableWorkspaceDataManager.super.getItemData(identifier);
+ ItemData item = CacheableWorkspaceDataManager.super.getItemData(identifier);
+ return item != null && item.isNode() ? initACL(null, (NodeData)item) : item;
}
});
}
@@ -1008,6 +1010,15 @@
cache.addChildNodes(parentData, childNodes);
}
}
+ else
+ {
+ // ini ACL
+ for (int i = 0; i < childNodes.size(); i++)
+ {
+ childNodes.set(i, (NodeData)initACL(nodeData, childNodes.get(i)));
+ }
+ }
+
return childNodes;
}
});
@@ -1027,7 +1038,16 @@
{
public List<NodeData> run() throws RepositoryException
{
- return CacheableWorkspaceDataManager.super.getChildNodesData(parentData, patternFilters);
+ List<NodeData> childNodes =
+ CacheableWorkspaceDataManager.super.getChildNodesData(parentData, patternFilters);
+
+ // ini ACL
+ for (int i = 0; i < childNodes.size(); i++)
+ {
+ childNodes.set(i, (NodeData)initACL(parentData, childNodes.get(i)));
+ }
+
+ return childNodes;
}
});
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateReader.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateReader.java 2011-07-21 12:52:33 UTC (rev 4671)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/ItemStateReader.java 2011-07-21 15:02:35 UTC (rev 4672)
@@ -110,7 +110,7 @@
if (isNodeData)
{
- PresistedNodeDataReader rdr = new PresistedNodeDataReader();
+ PersistedNodeDataReader rdr = new PersistedNodeDataReader();
is = new ItemState(rdr.read(in), state, eventFire, null, false, isPersisted, oldPath);
}
else
Added: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PersistedNodeDataReader.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PersistedNodeDataReader.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PersistedNodeDataReader.java 2011-07-21 15:02:35 UTC (rev 4672)
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2009 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.dataflow.serialization;
+
+import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.dataflow.persistent.PersistedNodeData;
+import org.exoplatform.services.jcr.dataflow.serialization.ObjectReader;
+import org.exoplatform.services.jcr.dataflow.serialization.SerializationConstants;
+import org.exoplatform.services.jcr.dataflow.serialization.UnknownClassIdException;
+import org.exoplatform.services.jcr.datamodel.IllegalNameException;
+import org.exoplatform.services.jcr.datamodel.IllegalPathException;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.datamodel.QPath;
+
+import java.io.IOException;
+
+/**
+ * Created by The eXo Platform SAS. <br/>Date:
+ *
+ * @author <a href="karpenko.sergiy(a)gmail.com">Karpenko Sergiy</a>
+ * @version $Id: PresistedNodeDataReader.java 1518 2010-01-20 23:33:30Z sergiykarpenko $
+ */
+public class PersistedNodeDataReader
+{
+
+ /**
+ * Read and set PersistedNodeData data.
+ *
+ * @param in ObjectReader.
+ * @return PersistedNodeData object.
+ * @throws UnknownClassIdException If read Class ID is not expected or do not
+ * exist.
+ * @throws IOException If an I/O error has occurred.
+ */
+ public PersistedNodeData read(ObjectReader in) throws UnknownClassIdException, IOException
+ {
+ // read id
+ int key;
+ if ((key = in.readInt()) != SerializationConstants.PERSISTED_NODE_DATA)
+ {
+ throw new UnknownClassIdException("There is unexpected class [" + key + "]");
+ }
+
+ QPath qpath;
+ try
+ {
+ String sQPath = in.readString();
+ qpath = QPath.parse(sQPath);
+ }
+ catch (final IllegalPathException e)
+ {
+ throw new IOException("Deserialization error. " + e)
+ {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Throwable getCause()
+ {
+ return e;
+ }
+ };
+ }
+
+ String identifier = in.readString();
+
+ String parentIdentifier = null;
+ if (in.readByte() == SerializationConstants.NOT_NULL_DATA)
+ {
+ parentIdentifier = in.readString();
+ }
+
+ int persistedVersion = in.readInt();
+ // --------------
+
+ int orderNum = in.readInt();
+
+ // primary type
+ InternalQName primaryTypeName;
+ try
+ {
+ primaryTypeName = InternalQName.parse(in.readString());
+ }
+ catch (final IllegalNameException e)
+ {
+ throw new IOException(e.getMessage())
+ {
+ private static final long serialVersionUID = 3489809179234435267L;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Throwable getCause()
+ {
+ return e;
+ }
+ };
+ }
+
+ // mixins
+ InternalQName[] mixinTypeNames = null;
+ if (in.readByte() == SerializationConstants.NOT_NULL_DATA)
+ {
+ int count = in.readInt();
+ mixinTypeNames = new InternalQName[count];
+ for (int i = 0; i < count; i++)
+ {
+ try
+ {
+ mixinTypeNames[i] = InternalQName.parse(in.readString());
+ }
+ catch (final IllegalNameException e)
+ {
+ throw new IOException(e.getMessage())
+ {
+ private static final long serialVersionUID = 3489809179234435268L; // eclipse
+
+ // gen
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Throwable getCause()
+ {
+ return e;
+ }
+ };
+ }
+ }
+ }
+
+ // acl
+ AccessControlList acl = null;
+ if (in.readByte() == SerializationConstants.NOT_NULL_DATA)
+ {
+ ACLReader rdr = new ACLReader();
+ acl = rdr.read(in);
+ }
+
+ return new PersistedNodeData(identifier, qpath, parentIdentifier, persistedVersion, orderNum, primaryTypeName,
+ mixinTypeNames, acl);
+ }
+
+}
Deleted: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PresistedNodeDataReader.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PresistedNodeDataReader.java 2011-07-21 12:52:33 UTC (rev 4671)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/serialization/PresistedNodeDataReader.java 2011-07-21 15:02:35 UTC (rev 4672)
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2009 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.dataflow.serialization;
-
-import org.exoplatform.services.jcr.access.AccessControlList;
-import org.exoplatform.services.jcr.dataflow.persistent.PersistedNodeData;
-import org.exoplatform.services.jcr.dataflow.serialization.ObjectReader;
-import org.exoplatform.services.jcr.dataflow.serialization.SerializationConstants;
-import org.exoplatform.services.jcr.dataflow.serialization.UnknownClassIdException;
-import org.exoplatform.services.jcr.datamodel.IllegalNameException;
-import org.exoplatform.services.jcr.datamodel.IllegalPathException;
-import org.exoplatform.services.jcr.datamodel.InternalQName;
-import org.exoplatform.services.jcr.datamodel.QPath;
-
-import java.io.IOException;
-
-/**
- * Created by The eXo Platform SAS. <br/>Date:
- *
- * @author <a href="karpenko.sergiy(a)gmail.com">Karpenko Sergiy</a>
- * @version $Id$
- */
-public class PresistedNodeDataReader
-{
-
- /**
- * Read and set PersistedNodeData data.
- *
- * @param in ObjectReader.
- * @return PersistedNodeData object.
- * @throws UnknownClassIdException If read Class ID is not expected or do not
- * exist.
- * @throws IOException If an I/O error has occurred.
- */
- public PersistedNodeData read(ObjectReader in) throws UnknownClassIdException, IOException
- {
- // read id
- int key;
- if ((key = in.readInt()) != SerializationConstants.PERSISTED_NODE_DATA)
- {
- throw new UnknownClassIdException("There is unexpected class [" + key + "]");
- }
-
- QPath qpath;
- try
- {
- String sQPath = in.readString();
- qpath = QPath.parse(sQPath);
- }
- catch (final IllegalPathException e)
- {
- throw new IOException("Deserialization error. " + e)
- {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Throwable getCause()
- {
- return e;
- }
- };
- }
-
- String identifier = in.readString();
-
- String parentIdentifier = null;
- if (in.readByte() == SerializationConstants.NOT_NULL_DATA)
- {
- parentIdentifier = in.readString();
- }
-
- int persistedVersion = in.readInt();
- // --------------
-
- int orderNum = in.readInt();
-
- // primary type
- InternalQName primaryTypeName;
- try
- {
- primaryTypeName = InternalQName.parse(in.readString());
- }
- catch (final IllegalNameException e)
- {
- throw new IOException(e.getMessage())
- {
- private static final long serialVersionUID = 3489809179234435267L;
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Throwable getCause()
- {
- return e;
- }
- };
- }
-
- // mixins
- InternalQName[] mixinTypeNames = null;
- if (in.readByte() == SerializationConstants.NOT_NULL_DATA)
- {
- int count = in.readInt();
- mixinTypeNames = new InternalQName[count];
- for (int i = 0; i < count; i++)
- {
- try
- {
- mixinTypeNames[i] = InternalQName.parse(in.readString());
- }
- catch (final IllegalNameException e)
- {
- throw new IOException(e.getMessage())
- {
- private static final long serialVersionUID = 3489809179234435268L; // eclipse
-
- // gen
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Throwable getCause()
- {
- return e;
- }
- };
- }
- }
- }
-
- // acl
- AccessControlList acl = null;
- if (in.readByte() == SerializationConstants.NOT_NULL_DATA)
- {
- ACLReader rdr = new ACLReader();
- acl = rdr.read(in);
- }
-
- return new PersistedNodeData(identifier, qpath, parentIdentifier, persistedVersion, orderNum, primaryTypeName,
- mixinTypeNames, acl);
- }
-
-}
12 years, 9 months
exo-jcr SVN: r4671 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/dataflow/persistent and 2 other directories.
by do-not-reply@jboss.org
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,
12 years, 9 months
exo-jcr SVN: r4670 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/dataflow and 1 other directories.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-07-21 05:39:19 -0400 (Thu, 21 Jul 2011)
New Revision: 4670
Added:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/AbstractSameNameSiblingsMoveTest.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsSessionMove.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsWorkspaceMove.java
Removed:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsMove.java
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java
Log:
EXOJCR-1370 : fixed SNS move issue. Also ItemReferensePool issue fixed, that may cause some perf decrease, since ItemReferencePool was not updated before.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2011-07-20 09:57:28 UTC (rev 4669)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -1006,7 +1006,8 @@
public int getLastOrderNumber(NodeData parent) throws RepositoryException
{
int lastOrderNumber = changesLog.getLastChildOrderNumber(parent.getIdentifier());
- int lastPersistedNodeOrderNumber = isNew(parent.getIdentifier()) ? -1 : transactionableManager.getLastOrderNumber(parent);
+ int lastPersistedNodeOrderNumber =
+ isNew(parent.getIdentifier()) ? -1 : transactionableManager.getLastOrderNumber(parent);
return Math.max(lastPersistedNodeOrderNumber, lastOrderNumber);
}
@@ -1017,7 +1018,8 @@
public int getChildNodesCount(NodeData parent) throws RepositoryException
{
int childsCount =
- changesLog.getChildNodesCount(parent.getIdentifier()) + (isNew(parent.getIdentifier()) ? 0 : transactionableManager.getChildNodesCount(parent));
+ changesLog.getChildNodesCount(parent.getIdentifier())
+ + (isNew(parent.getIdentifier()) ? 0 : transactionableManager.getChildNodesCount(parent));
if (childsCount < 0)
{
throw new InvalidItemStateException("Node's child nodes were changed in another Session "
@@ -1219,6 +1221,8 @@
}
}
+ // TODO: review. Won't work if renamed states for descendants are not fired
+ // Node will be only updated with the same NodeData with same outdated path
void reloadPool(ItemData fromItem) throws RepositoryException
{
Collection<ItemImpl> pooledItems = itemsPool.getAll();
@@ -1267,7 +1271,18 @@
changesLog.addAll(initializer.getAllStates());
- reloadPool(srcData);
+ // reload items pool
+ for (ItemState state : initializer.getItemAddStates())
+ {
+ if (state.isUpdated() || state.isRenamed())
+ {
+ ItemImpl item = reloadItem(state.getData());
+ if (item != null)
+ {
+ invalidated.add(item);
+ }
+ }
+ }
}
/**
@@ -1305,8 +1320,8 @@
if (itemData.isNode())
{
checkRemoveChildVersionStorages =
- !session.getWorkspace().getNodeTypesHolder()
- .isNodeType(Constants.NT_VERSIONHISTORY, ((NodeData)itemData).getPrimaryTypeName());
+ !session.getWorkspace().getNodeTypesHolder().isNodeType(Constants.NT_VERSIONHISTORY,
+ ((NodeData)itemData).getPrimaryTypeName());
}
boolean rootAdded = false;
@@ -1450,7 +1465,7 @@
// We can't remove this VH now.
return;
} // else -- if we has a references in workspace where the VH is being
- // deleted we can remove VH now.
+ // deleted we can remove VH now.
}
}
finally
@@ -1875,8 +1890,8 @@
{
Collection<ItemDefinitionData> mandatoryItemDefs =
- session.getWorkspace().getNodeTypesHolder()
- .getManadatoryItemDefs(nData.getPrimaryTypeName(), nData.getMixinTypeNames());
+ session.getWorkspace().getNodeTypesHolder().getManadatoryItemDefs(nData.getPrimaryTypeName(),
+ nData.getMixinTypeNames());
for (ItemDefinitionData itemDefinitionData : mandatoryItemDefs)
{
if (getItemData(nData, new QPathEntry(itemDefinitionData.getName(), 0), ItemType.UNKNOWN) == null)
@@ -1995,8 +2010,8 @@
{
QPathEntry[] path = pooled.getData().getQPath().getEntries();
persisted =
- transactionableManager.getItemData(parent, path[path.length - 1],
- ItemType.getItemType(pooled.getData()));
+ transactionableManager.getItemData(parent, path[path.length - 1], ItemType.getItemType(pooled
+ .getData()));
} // else, the item has an invalid state, will be throwed on save
}
if (persisted != null)
@@ -2320,7 +2335,7 @@
List<PropertyData> childProps =
listOnly ? dataManager.listChildPropertiesData((NodeData)parent) : dataManager
.getChildPropertiesData((NodeData)parent);
- outer : for (int i = 0, length = childProps.size(); i < length; i++)
+ outer : for (int i = 0, length = childProps.size(); i < length; i++)
{
PropertyData childProp = childProps.get(i);
for (ItemState transientState : transientDescendants)
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2011-07-20 09:57:28 UTC (rev 4669)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -123,7 +123,7 @@
{
log.info("The JCR will throw an exception anytime we will try to use a dead session.");
}
- }
+ }
public static final int DEFAULT_LAZY_READ_THRESHOLD = 100;
@@ -152,9 +152,9 @@
protected final String workspaceName;
private boolean live;
-
+
private boolean expired;
-
+
private Exception closedByCallStack;
private final List<SessionLifecycleListener> lifecycleListeners;
@@ -179,7 +179,7 @@
* Transaction resources manager.
*/
private final TransactionableResourceManager txResourceManager;
-
+
/**
* The local timeout of the session, by default it will use the global timeout defined at repository configuration level
*/
@@ -193,7 +193,8 @@
this.live = true;
this.id = IdGenerator.generate();
this.userState = userState;
- this.txResourceManager = (TransactionableResourceManager)container.getComponentInstanceOfType(TransactionableResourceManager.class);
+ this.txResourceManager =
+ (TransactionableResourceManager)container.getComponentInstanceOfType(TransactionableResourceManager.class);
this.repository = (RepositoryImpl)container.getComponentInstanceOfType(RepositoryImpl.class);
this.systemLocationFactory = (LocationFactory)container.getComponentInstanceOfType(LocationFactory.class);
@@ -915,14 +916,15 @@
{
if (PROHIBIT_CLOSED_SESSION_USAGE)
{
- throw new RepositoryException("This kind of operation is forbidden after a session.logout().", closedByCallStack);
+ throw new RepositoryException("This kind of operation is forbidden after a session.logout().",
+ closedByCallStack);
}
// warn in debug mode only
else if (PropertyManager.isDevelopping())
{
log.warn("This kind of operation is forbidden after a session.logout(), "
- + "please note that an exception will be raised in the next jcr version.", new Exception(
- closedByCallStack));
+ + "please note that an exception will be raised in the next jcr version.", new Exception(
+ closedByCallStack));
}
}
}
@@ -971,7 +973,7 @@
this.expired = true;
logout();
}
-
+
/**
* {@inheritDoc}
*/
@@ -1012,9 +1014,18 @@
throw new ItemExistsException("A node with this name (" + destAbsPath + ") is already exists. ");
}
}
-
+ NodeImpl srcParentNode = null;
+ if (destParentNode.getIdentifier().equals(srcNode.getParentIdentifier()))
+ {
+ // move to same parent
+ srcParentNode = destParentNode;
+ }
+ else
+ {
+ srcParentNode = srcNode.parent();
+ }
// Check if versionable ancestor is not checked-in
- if (!srcNode.parent().checkedOut())
+ if (!srcParentNode.checkedOut())
{
throw new VersionException("Parent or source Node or its nearest ancestor is checked-in");
}
@@ -1026,8 +1037,8 @@
ItemDataMoveVisitor initializer =
new ItemDataMoveVisitor((NodeData)destParentNode.getData(), destNodePath.getName().getInternalName(),
- nodeTypeManager, getTransientNodesManager(), true, triggerEventsForDescendentsOnRename
- || !srcNodePath.makeParentPath().equals(destNodePath.makeParentPath()));
+ (NodeData)srcParentNode.getData(), nodeTypeManager, getTransientNodesManager(), true,
+ triggerEventsForDescendentsOnRename || srcParentNode != destParentNode);
getTransientNodesManager().rename((NodeData)srcNode.getData(), initializer);
}
@@ -1154,7 +1165,7 @@
{
this.timeout = (timeout <= 0 ? 0 : timeout);
}
-
+
/**
* {@inheritDoc}
*/
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java 2011-07-20 09:57:28 UTC (rev 4669)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -439,9 +439,18 @@
throw new ItemExistsException(msg);
}
}
-
+ NodeImpl srcParentNode = null;
+ if (destParentNode.getIdentifier().equals(srcNode.getParentIdentifier()))
+ {
+ // move to same parent
+ srcParentNode = destParentNode;
+ }
+ else
+ {
+ srcParentNode = srcNode.parent();
+ }
// Check if versionable ancestor is not checked-in
- if (!srcNode.checkedOut())
+ if (!srcParentNode.checkedOut())
{
throw new VersionException("Source parent node " + srcNode.getPath()
+ " or its nearest ancestor is checked-in");
@@ -454,12 +463,21 @@
ItemDataMoveVisitor initializer =
new ItemDataMoveVisitor((NodeData)destParentNode.getData(), destNodePath.getName().getInternalName(),
- nodeTypeManager, session.getTransientNodesManager(), true);
+ (NodeData)srcParentNode.getData(), nodeTypeManager, session.getTransientNodesManager(), true);
srcNode.getData().accept(initializer);
PlainChangesLog changes = new PlainChangesLogImpl(session.getId());
changes.addAll(initializer.getAllStates());
+ // reload items pool
+ for (ItemState state : initializer.getItemAddStates())
+ {
+ if (state.isUpdated() || state.isRenamed())
+ {
+ (session.getTransientNodesManager()).reloadItem(state.getData());
+ }
+ }
+
session.getTransientNodesManager().getTransactManager().save(changes);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java 2011-07-20 09:57:28 UTC (rev 4669)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/ItemDataMoveVisitor.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -27,6 +27,7 @@
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.SessionDataManager;
@@ -65,6 +66,11 @@
protected Stack<NodeData> parents;
/**
+ * Contains instance of source parent
+ */
+ protected NodeData srcParent;
+
+ /**
* The list of added item states
*/
protected List<ItemState> addStates = new ArrayList<ItemState>();
@@ -103,8 +109,9 @@
* @param triggerEventsForDescendents
* - Trigger events for descendents.
*/
- public ItemDataMoveVisitor(NodeData parent, InternalQName dstNodeName, NodeTypeDataManager nodeTypeManager,
- SessionDataManager srcDataManager, boolean keepIdentifiers, boolean triggerEventsForDescendents)
+ public ItemDataMoveVisitor(NodeData parent, InternalQName dstNodeName, NodeData srcParent,
+ NodeTypeDataManager nodeTypeManager, SessionDataManager srcDataManager, boolean keepIdentifiers,
+ boolean triggerEventsForDescendents)
{
super(srcDataManager, triggerEventsForDescendents ? INFINITE_DEPTH : 0);
this.keepIdentifiers = keepIdentifiers;
@@ -113,6 +120,7 @@
this.parents = new Stack<NodeData>();
this.parents.add(parent);
+ this.srcParent = srcParent;
this.triggerEventsForDescendents = triggerEventsForDescendents;
}
@@ -127,10 +135,10 @@
* @param skipEventsForDescendents - Don't generate events for the
* descendants.
*/
- public ItemDataMoveVisitor(NodeData parent, InternalQName dstNodeName, NodeTypeDataManager nodeTypeManager,
- SessionDataManager srcDataManager, boolean keepIdentifiers)
+ public ItemDataMoveVisitor(NodeData parent, InternalQName dstNodeName, NodeData srcParent,
+ NodeTypeDataManager nodeTypeManager, SessionDataManager srcDataManager, boolean keepIdentifiers)
{
- this(parent, dstNodeName, nodeTypeManager, srcDataManager, keepIdentifiers, true);
+ this(parent, dstNodeName, srcParent, nodeTypeManager, srcDataManager, keepIdentifiers, true);
}
@Override
@@ -142,7 +150,7 @@
ancestorToSave = QPath.getCommonAncestorPath(curParent().getQPath(), node.getQPath());
}
- NodeData parent = curParent();
+ NodeData destParent = curParent();
int destIndex; // index for path
int destOrderNum; // order number
@@ -152,9 +160,8 @@
{
qname = destNodeName;
- List<NodeData> destChilds = dataManager.getChildNodesData(parent);
+ List<NodeData> destChilds = dataManager.getChildNodesData(destParent);
List<NodeData> srcChilds;
- NodeData srcParent;
destIndex = 1;
@@ -164,31 +171,23 @@
// node list.
destOrderNum = destChilds.size() > 0 ? destChilds.get(destChilds.size() - 1).getOrderNumber() + 1 : 0;
- if (parent.getIdentifier().equals(node.getParentIdentifier()))
+ if (destParent == srcParent)// (destParent.getIdentifier().equals(node.getParentIdentifier()))
{
// move to same parent
srcChilds = destChilds;
- srcParent = parent;
}
else
{
// move to another parent
+ srcChilds = dataManager.getChildNodesData(srcParent);
// find index on destination
for (NodeData dchild : destChilds)
{
- if (dchild.getQPath().getName().equals(qname))
+ if (dchild.getQPath().getName().equals(destNodeName))
+ {
destIndex++;
+ }
}
-
- // for fix SNSes on source
- srcParent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
- if (srcParent == null)
- {
- throw new RepositoryException("FATAL: parent Node not for " + node.getQPath().getAsString()
- + ", parent id: " + node.getParentIdentifier());
- }
-
- srcChilds = dataManager.getChildNodesData(srcParent);
}
int srcIndex = 1;
@@ -199,26 +198,23 @@
NodeData child = srcChilds.get(i);
if (!child.getIdentifier().equals(node.getIdentifier()))
{
- if (child.getQPath().getName().equals(qname))
+ if ((child.getQPath().getName()).getAsString().equals((node.getQPath().getName()).getAsString()))
{
QPath siblingPath = QPath.makeChildPath(srcParent.getQPath(), child.getQPath().getName(), srcIndex);
TransientNodeData sibling =
- new TransientNodeData(siblingPath, child.getIdentifier(), child.getPersistedVersion() + 1,
- child.getPrimaryTypeName(), child.getMixinTypeNames(), child.getOrderNumber(),
- child.getParentIdentifier(), child.getACL());
-
+ new TransientNodeData(siblingPath, child.getIdentifier(), child.getPersistedVersion() + 1, child
+ .getPrimaryTypeName(), child.getMixinTypeNames(), child.getOrderNumber(), child
+ .getParentIdentifier(), child.getACL());
addStates.add(new ItemState(sibling, ItemState.UPDATED, true, ancestorToSave, false, true));
-
srcIndex++;
}
+ // find index on destination in case when destination the same as source
+ if (srcChilds == destChilds && (child.getQPath().getName().equals(destNodeName)))
+ {
+ destIndex++;
+ }
}
}
-
- // in case of moving to the same parent destination index is calculated above
- if (srcChilds == destChilds)
- {
- destIndex = srcIndex;
- }
}
else
{
@@ -229,9 +225,9 @@
String id = keepIdentifiers ? node.getIdentifier() : IdGenerator.generate();
- QPath qpath = QPath.makeChildPath(parent.getQPath(), qname, destIndex);
+ QPath qpath = QPath.makeChildPath(destParent.getQPath(), qname, destIndex);
- AccessControlList acl = parent.getACL();
+ AccessControlList acl = destParent.getACL();
boolean isPrivilegeable =
ntManager.isNodeType(Constants.EXO_PRIVILEGEABLE, node.getPrimaryTypeName(), node.getMixinTypeNames());
@@ -242,16 +238,16 @@
if (isPrivilegeable || isOwneable)
{
List<AccessControlEntry> permissionEntries = new ArrayList<AccessControlEntry>();
- permissionEntries.addAll((isPrivilegeable ? node.getACL() : parent.getACL()).getPermissionEntries());
+ permissionEntries.addAll((isPrivilegeable ? node.getACL() : destParent.getACL()).getPermissionEntries());
- String owner = isOwneable ? node.getACL().getOwner() : parent.getACL().getOwner();
+ String owner = isOwneable ? node.getACL().getOwner() : destParent.getACL().getOwner();
acl = new AccessControlList(owner, permissionEntries);
}
TransientNodeData newNode =
new TransientNodeData(qpath, id, -1, node.getPrimaryTypeName(), node.getMixinTypeNames(), destOrderNum,
- parent.getIdentifier(), acl);
+ destParent.getIdentifier(), acl);
parents.push(newNode);
Copied: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/AbstractSameNameSiblingsMoveTest.java (from rev 4639, jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsMove.java)
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/AbstractSameNameSiblingsMoveTest.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/AbstractSameNameSiblingsMoveTest.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -0,0 +1,453 @@
+/*
+ * Copyright (C) 2009 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.api.writing;
+
+import org.exoplatform.services.jcr.JcrAPIBaseTest;
+
+import javax.jcr.ItemExistsException;
+import javax.jcr.LoginException;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.VersionException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * Date: 31.03.2008
+ *
+ * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
+ * @version $Id: TestSameNameSiblingsMove.java 12992 2008-04-09 14:52:34Z pnedonosko $
+ */
+public abstract class AbstractSameNameSiblingsMoveTest extends JcrAPIBaseTest
+{
+
+ private Node testRoot;
+
+ /**
+ * Abstract SNS move test
+ *
+ * @param srcAbsPath
+ * @param destAbsPath
+ */
+ abstract void move(Node testRoot, String srcAbsPath, String destAbsPath) throws ItemExistsException,
+ PathNotFoundException, VersionException, ConstraintViolationException, LockException, RepositoryException;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+
+ testRoot = root.addNode("snsMoveTest");
+ root.save();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ root.refresh(false);
+ testRoot.remove();
+ root.save();
+
+ super.tearDown();
+ }
+
+ /**
+ * Move node[1] to node[3], node[3] reordered to node[2], node[2] to node[1].
+ *
+ * @throws LoginException
+ * @throws NoSuchWorkspaceException
+ * @throws RepositoryException
+ */
+ public void testMoveSameParentSameNameFirst() throws LoginException, NoSuchWorkspaceException, RepositoryException
+ {
+
+ final Node testRootS1 = testRoot;
+ testRootS1.addMixin("exo:owneable");
+ testRootS1.addMixin("exo:privilegeable");
+ testRootS1.save();
+
+ Node nS1_1 = testRootS1.addNode("node"); // node[1]
+ testRootS1.save();
+ nS1_1.addMixin("mix:referenceable");
+ nS1_1.addMixin("exo:owneable");
+ // nS1_1.setProperty("exo:owner", "root");
+ String s1_1_id = nS1_1.getUUID();
+ testRootS1.save();
+
+ Node nS1_2 = testRootS1.addNode("node"); // node[2]
+ Node nS1_3 = testRootS1.addNode("node"); // node[3]
+
+ testRootS1.save();
+
+ try
+ {
+ // move node[1] to node[3], node[3] reordered to node[2], node[2] to node[1]
+ move(testRootS1, testRootS1.getPath() + "/node", testRootS1.getPath() + "/node");
+ }
+ catch (RepositoryException e)
+ {
+ e.printStackTrace();
+ fail("RepositoryException should not have been thrown, but " + e);
+ }
+
+ int index = 0;
+ for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
+ {
+ index++;
+ Node n = iter.nextNode();
+ // log.info("Node: " + n.getPath());
+ assertEquals("Wrong index found ", index, n.getIndex());
+ }
+
+ // check pool updated
+ assertEquals(1, nS1_2.getIndex());
+ assertEquals(2, nS1_3.getIndex());
+ assertEquals(3, nS1_1.getIndex());
+ // check reordering
+ assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node[3]").getUUID());
+ }
+
+ /**
+ * Move node[2] to node[3], node[3] reordered to node[2].
+ *
+ * @throws LoginException
+ * @throws NoSuchWorkspaceException
+ * @throws RepositoryException
+ */
+ public void testMoveSameParentSameNameMiddle() throws LoginException, NoSuchWorkspaceException, RepositoryException
+ {
+
+ final Node testRootS1 = testRoot;
+
+ Node nS1_1 = testRootS1.addNode("node"); // node[1]
+ testRootS1.save();
+ nS1_1.addMixin("mix:referenceable");
+ String s1_1_id = nS1_1.getUUID();
+ testRootS1.save();
+
+ Node nS1_2 = testRootS1.addNode("node"); // node[2]
+ Node nS1_3 = testRootS1.addNode("node"); // node[3]
+ testRootS1.save();
+
+ // test
+ try
+ {
+ // move node[2] to node[3], node[3] reordered to node[2]
+ move(testRootS1, testRootS1.getPath() + "/node[2]", testRootS1.getPath() + "/node");
+ }
+ catch (RepositoryException e)
+ {
+ e.printStackTrace();
+ fail("RepositoryException should not have been thrown, but " + e);
+ }
+
+ int index = 0;
+ for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
+ {
+ index++;
+ Node n = iter.nextNode();
+ // log.info("Node: " + n.getPath());
+ assertEquals("Wrong index found ", index, n.getIndex());
+ }
+
+ // check pool updated
+ assertEquals(1, nS1_1.getIndex());
+ assertEquals(2, nS1_3.getIndex());
+ assertEquals(3, nS1_2.getIndex());
+
+ // check reordering
+ assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node").getUUID());
+ }
+
+ /**
+ * Move SNS node to itself, move node[3] to node[3].
+ *
+ * @throws LoginException
+ * @throws NoSuchWorkspaceException
+ * @throws RepositoryException
+ */
+ public void testMoveSameParentSameNameLast() throws LoginException, NoSuchWorkspaceException, RepositoryException
+ {
+
+ final Node testRootS1 = testRoot;
+
+ Node nS1_1 = testRootS1.addNode("node"); // node[1]
+ testRootS1.save();
+ nS1_1.addMixin("mix:referenceable");
+ String s1_1_id = nS1_1.getUUID();
+ testRootS1.save();
+
+ Node nS1_2 = testRootS1.addNode("node"); // node[2]
+ Node nS1_3 = testRootS1.addNode("node"); // node[3]
+ testRootS1.save();
+
+ // test
+ try
+ {
+ // move to itself, move node[3] to node[3]
+ move(testRootS1, testRootS1.getPath() + "/node[3]", testRootS1.getPath() + "/node");
+ }
+ catch (RepositoryException e)
+ {
+ e.printStackTrace();
+ fail("RepositoryException should not have been thrown, but " + e);
+ }
+
+ int index = 0;
+ for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
+ {
+ index++;
+ Node n = iter.nextNode();
+ // log.info("Node: " + n.getPath());
+ assertEquals("Wrong index found ", index, n.getIndex());
+ }
+
+ // check pool updated
+ assertEquals(1, nS1_1.getIndex());
+ assertEquals(2, nS1_2.getIndex());
+ assertEquals(3, nS1_3.getIndex());
+
+ // check reordering
+ assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node").getUUID());
+ }
+
+ /**
+ * Move node[1] to node-new[1], node[1,3] reordered to node[1,2].
+ *
+ * @throws LoginException
+ * @throws NoSuchWorkspaceException
+ * @throws RepositoryException
+ */
+ public void testMoveSameParentDifferentName() throws LoginException, NoSuchWorkspaceException, RepositoryException
+ {
+
+ final Node testRootS1 = testRoot;
+
+ Node nS1_1 = testRootS1.addNode("node"); // node[1]
+ testRootS1.save();
+
+ Node nS1_2 = testRootS1.addNode("node"); // node[2]
+ Node nS1_3 = testRootS1.addNode("node"); // node[3]
+ testRootS1.save();
+
+ // test
+ try
+ {
+ // move node[2] to node[3], node[3] reordered to node[2]
+ move(testRootS1, testRootS1.getPath() + "/node[1]", testRootS1.getPath() + "/node-new");
+ }
+ catch (RepositoryException e)
+ {
+ e.printStackTrace();
+ fail("RepositoryException should not have been thrown, but " + e);
+ }
+
+ // check pool updated
+ assertEquals(1, nS1_2.getIndex());
+ assertEquals(2, nS1_3.getIndex());
+
+ assertEquals(2, testRootS1.getNodes("node").getSize());
+ }
+
+ /**
+ * Move node[1] to node-existing[2], node[1,3] reordered to node[1,2].
+ *
+ * @throws LoginException
+ * @throws NoSuchWorkspaceException
+ * @throws RepositoryException
+ */
+ public void testMoveSameParentDifferentExistingName() throws LoginException, NoSuchWorkspaceException,
+ RepositoryException
+ {
+
+ final Node testRootS1 = testRoot;
+
+ Node nS1_1 = testRootS1.addNode("node"); // node[1]
+ testRootS1.save();
+
+ Node nS1_2 = testRootS1.addNode("node"); // node[2]
+ Node nS1_3 = testRootS1.addNode("node"); // node[3]
+
+ Node nExisting = testRootS1.addNode("node-existing"); // node-existing
+ testRootS1.save();
+
+ // test
+ try
+ {
+ // move node[2] to node[3], node[3] reordered to node[2]
+ move(testRootS1, testRootS1.getPath() + "/node[1]", testRootS1.getPath() + "/node-existing");
+ }
+ catch (RepositoryException e)
+ {
+ e.printStackTrace();
+ fail("RepositoryException should not have been thrown, but " + e);
+ }
+
+ // check pool updated
+ assertEquals(1, nS1_2.getIndex());
+ assertEquals(2, nS1_3.getIndex());
+
+ assertEquals(1, nExisting.getIndex());
+ assertEquals(2, nS1_1.getIndex());
+
+ assertEquals(2, testRootS1.getNodes("node").getSize());
+ assertEquals(2, testRootS1.getNodes("node-existing").getSize());
+ }
+
+ /**
+ * Move SNS node to different location with SNS too, move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node[3].
+ *
+ * @throws LoginException
+ * @throws NoSuchWorkspaceException
+ * @throws RepositoryException
+ */
+ public void testMoveAnotherParentSameExsintingName() throws LoginException, NoSuchWorkspaceException,
+ RepositoryException
+ {
+
+ final Node testRootS1 = testRoot;
+ final Node testNode1 = testRootS1.addNode("node1");
+ final Node testNode2 = testRootS1.addNode("node1");
+ testRootS1.save();
+
+ Node n1_1 = testNode1.addNode("node"); // node[1]
+ Node n1_2 = testNode1.addNode("node"); // node[2]
+ testNode1.save();
+ n1_2.addMixin("mix:referenceable");
+ String n1_2_id = n1_2.getUUID();
+ testNode1.save();
+
+ Node n1_3 = testNode1.addNode("node"); // node[3]
+ Node n1_4 = testNode1.addNode("node"); // node[4]
+ testNode1.save();
+
+ Node n2_1 = testNode2.addNode("node"); // node[1]
+ Node n2_2 = testNode2.addNode("node"); // node[2]
+ testNode2.save();
+
+ // test
+ try
+ {
+ // move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node[3]
+ move(testNode1, testNode1.getPath() + "/node[2]", testNode2.getPath() + "/node");
+ }
+ catch (RepositoryException e)
+ {
+ e.printStackTrace();
+ fail("RepositoryException should not have been thrown, but " + e);
+ }
+
+ int index = 0;
+ for (NodeIterator iter = testNode1.getNodes(); iter.hasNext();)
+ {
+ index++;
+ Node n = iter.nextNode();
+ assertEquals("Wrong index found ", index, n.getIndex());
+ }
+
+ index = 0;
+ for (NodeIterator iter = testNode2.getNodes(); iter.hasNext();)
+ {
+ index++;
+ Node n = iter.nextNode();
+ assertEquals("Wrong index found ", index, n.getIndex());
+ }
+
+ // check pool updated
+ assertEquals(1, n1_1.getIndex());
+ assertEquals(2, n1_3.getIndex());
+
+ assertEquals(1, n2_1.getIndex());
+ assertEquals(2, n2_2.getIndex());
+ assertEquals(3, n1_2.getIndex());
+
+ // check reordering
+ assertEquals("Wrong node UUID found ", n1_2_id, testNode2.getNode("node[3]").getUUID());
+ }
+
+ /**
+ * Move SNS node to different location with SNS too, move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node-new.
+ *
+ * @throws LoginException
+ * @throws NoSuchWorkspaceException
+ * @throws RepositoryException
+ */
+ public void testMoveAnotherParentDifferentName() throws LoginException, NoSuchWorkspaceException,
+ RepositoryException
+ {
+
+ final Node testRootS1 = testRoot;
+ final Node testNode1 = testRootS1.addNode("node1");
+ final Node testNode2 = testRootS1.addNode("node1");
+ testRootS1.save();
+
+ Node n1_1 = testNode1.addNode("node"); // node[1]
+ Node n1_2 = testNode1.addNode("node"); // node[2]
+ testNode1.save();
+ n1_2.addMixin("mix:referenceable");
+ String n1_2_id = n1_2.getUUID();
+ testNode1.save();
+
+ Node n1_3 = testNode1.addNode("node"); // node[3]
+ Node n1_4 = testNode1.addNode("node"); // node[4]
+ testNode1.save();
+
+ Node n2_1 = testNode2.addNode("node"); // node[1]
+ Node n2_2 = testNode2.addNode("node"); // node[2]
+ testNode2.save();
+
+ // test
+ try
+ {
+ // move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node-new
+ move(testNode1, testNode1.getPath() + "/node[2]", testNode2.getPath() + "/node-new");
+ }
+ catch (RepositoryException e)
+ {
+ e.printStackTrace();
+ fail("RepositoryException should not have been thrown, but " + e);
+ }
+
+ int index = 0;
+ for (NodeIterator iter = testNode1.getNodes(); iter.hasNext();)
+ {
+ index++;
+ Node n = iter.nextNode();
+ assertEquals("Wrong index found ", index, n.getIndex());
+ }
+
+ assertEquals(3, testNode1.getNodes("node").getSize());
+ assertEquals(2, testNode2.getNodes("node").getSize());
+
+ // check pool updated
+ assertEquals(1, n1_1.getIndex());
+ assertEquals(2, n1_3.getIndex());
+
+ assertEquals(1, n2_1.getIndex());
+ assertEquals(2, n2_2.getIndex());
+
+ // check reordering
+ assertEquals("Wrong node UUID found ", n1_2_id, testNode2.getNode("node-new").getUUID());
+ }
+}
Deleted: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsMove.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsMove.java 2011-07-20 09:57:28 UTC (rev 4669)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsMove.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2009 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.api.writing;
-
-import org.exoplatform.services.jcr.JcrAPIBaseTest;
-
-import javax.jcr.LoginException;
-import javax.jcr.NoSuchWorkspaceException;
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-
-/**
- * Created by The eXo Platform SAS.
- *
- * Date: 31.03.2008
- *
- * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
- * @version $Id: TestSameNameSiblingsMove.java 12992 2008-04-09 14:52:34Z pnedonosko $
- */
-public class TestSameNameSiblingsMove extends JcrAPIBaseTest
-{
-
- private Node testRoot;
-
- @Override
- public void setUp() throws Exception
- {
- super.setUp();
-
- testRoot = root.addNode("snsMoveTest");
- root.save();
- }
-
- @Override
- protected void tearDown() throws Exception
- {
- root.refresh(false);
- testRoot.remove();
- root.save();
-
- super.tearDown();
- }
-
- /**
- * Move node[1] to node[3], node[3] reordered to node[2], node[2] to node[1].
- *
- * @throws LoginException
- * @throws NoSuchWorkspaceException
- * @throws RepositoryException
- */
- public void testMoveFirst() throws LoginException, NoSuchWorkspaceException, RepositoryException
- {
-
- final Node testRootS1 = testRoot;
- testRootS1.addMixin("exo:owneable");
- testRootS1.addMixin("exo:privilegeable");
- testRootS1.save();
-
- Node nS1_1 = testRootS1.addNode("node"); // node[1]
- testRootS1.save();
- nS1_1.addMixin("mix:referenceable");
- nS1_1.addMixin("exo:owneable");
- // nS1_1.setProperty("exo:owner", "root");
- String s1_1_id = nS1_1.getUUID();
- testRootS1.save();
-
- Node nS1_2 = testRootS1.addNode("node"); // node[2]
- Node nS1_3 = testRootS1.addNode("node"); // node[3]
-
- testRootS1.save();
-
- // test
- // for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();) {
- // Node n = iter.nextNode();
- // log.info("Node: " + n.getPath() + " " + ((NodeImpl)n).getInternalIdentifier());
- // }
- try
- {
- // move node[1] to node[3], node[3] reordered to node[2], node[2] to node[1]
- testRootS1.getSession().move(testRootS1.getPath() + "/node", testRootS1.getPath() + "/node");
- // for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();) {
- // Node n = iter.nextNode();
- // log.info("Node: " + n.getPath() + " " + ((NodeImpl)n).getInternalIdentifier());
- // }
- testRootS1.save(); // save
-
- }
- catch (RepositoryException e)
- {
- e.printStackTrace();
- fail("RepositoryException should not have been thrown, but " + e);
- }
-
- int index = 0;
- for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
- {
- index++;
- Node n = iter.nextNode();
- // log.info("Node: " + n.getPath());
- assertEquals("Wrong index found ", index, n.getIndex());
- }
-
- // check reordering
- assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node[3]").getUUID());
- }
-
- /**
- * Move node[2] to node[3], node[3] reordered to node[2].
- *
- * @throws LoginException
- * @throws NoSuchWorkspaceException
- * @throws RepositoryException
- */
- public void testMoveMiddle() throws LoginException, NoSuchWorkspaceException, RepositoryException
- {
-
- final Node testRootS1 = testRoot;
-
- Node nS1_1 = testRootS1.addNode("node"); // node[1]
- testRootS1.save();
- nS1_1.addMixin("mix:referenceable");
- String s1_1_id = nS1_1.getUUID();
- testRootS1.save();
-
- Node nS1_2 = testRootS1.addNode("node"); // node[2]
- Node nS1_3 = testRootS1.addNode("node"); // node[3]
- testRootS1.save();
-
- // test
- try
- {
- // move node[2] to node[3], node[3] reordered to node[2]
- testRootS1.getSession().move(testRootS1.getPath() + "/node[2]", testRootS1.getPath() + "/node");
- testRootS1.save(); // save
- }
- catch (RepositoryException e)
- {
- e.printStackTrace();
- fail("RepositoryException should not have been thrown, but " + e);
- }
-
- int index = 0;
- for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
- {
- index++;
- Node n = iter.nextNode();
- // log.info("Node: " + n.getPath());
- assertEquals("Wrong index found ", index, n.getIndex());
- }
-
- // check reordering
- assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node").getUUID());
- }
-
- /**
- * Move SNS node to itself, move node[3] to node[3].
- *
- * @throws LoginException
- * @throws NoSuchWorkspaceException
- * @throws RepositoryException
- */
- public void testMoveLast() throws LoginException, NoSuchWorkspaceException, RepositoryException
- {
-
- final Node testRootS1 = testRoot;
-
- Node nS1_1 = testRootS1.addNode("node"); // node[1]
- testRootS1.save();
- nS1_1.addMixin("mix:referenceable");
- String s1_1_id = nS1_1.getUUID();
- testRootS1.save();
-
- Node nS1_2 = testRootS1.addNode("node"); // node[2]
- Node nS1_3 = testRootS1.addNode("node"); // node[3]
- testRootS1.save();
-
- // test
- try
- {
- // move to itself, move node[3] to node[3]
- testRootS1.getSession().move(testRootS1.getPath() + "/node[3]", testRootS1.getPath() + "/node");
- testRootS1.save(); // save
- }
- catch (RepositoryException e)
- {
- e.printStackTrace();
- fail("RepositoryException should not have been thrown, but " + e);
- }
-
- int index = 0;
- for (NodeIterator iter = testRootS1.getNodes(); iter.hasNext();)
- {
- index++;
- Node n = iter.nextNode();
- // log.info("Node: " + n.getPath());
- assertEquals("Wrong index found ", index, n.getIndex());
- }
-
- // check reordering
- assertEquals("Wrong node UUID found ", s1_1_id, testRootS1.getNode("node").getUUID());
- }
-
- /**
- * Move SNS node to different location with SNS too, move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node[3].
- *
- * @throws LoginException
- * @throws NoSuchWorkspaceException
- * @throws RepositoryException
- */
- public void testMoveToDiffLocation() throws LoginException, NoSuchWorkspaceException, RepositoryException
- {
-
- final Node testRootS1 = testRoot;
- final Node testNode1 = testRootS1.addNode("node1");
- final Node testNode2 = testRootS1.addNode("node1");
- testRootS1.save();
-
- Node n1_1 = testNode1.addNode("node"); // node[1]
- Node n1_2 = testNode1.addNode("node"); // node[2]
- testNode1.save();
- n1_2.addMixin("mix:referenceable");
- String n1_2_id = n1_2.getUUID();
- testNode1.save();
-
- Node n1_3 = testNode1.addNode("node"); // node[3]
- Node n1_4 = testNode1.addNode("node"); // node[4]
- testNode1.save();
-
- Node n2_1 = testNode2.addNode("node"); // node[1]
- Node n2_2 = testNode2.addNode("node"); // node[2]
- testNode2.save();
-
- // test
- try
- {
- // move /snsMoveTest/node1/node[2] to /snsMoveTest/node2/node[3]
- testNode1.getSession().move(testNode1.getPath() + "/node[2]", testNode2.getPath() + "/node");
- testNode1.getSession().save(); // save
- }
- catch (RepositoryException e)
- {
- e.printStackTrace();
- fail("RepositoryException should not have been thrown, but " + e);
- }
-
- int index = 0;
- for (NodeIterator iter = testNode1.getNodes(); iter.hasNext();)
- {
- index++;
- Node n = iter.nextNode();
- assertEquals("Wrong index found ", index, n.getIndex());
- }
-
- index = 0;
- for (NodeIterator iter = testNode2.getNodes(); iter.hasNext();)
- {
- index++;
- Node n = iter.nextNode();
- assertEquals("Wrong index found ", index, n.getIndex());
- }
-
- // check reordering
- assertEquals("Wrong node UUID found ", n1_2_id, testNode2.getNode("node[3]").getUUID());
- }
-}
Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsSessionMove.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsSessionMove.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsSessionMove.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -0,0 +1,48 @@
+/*
+ * 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.api.writing;
+
+import javax.jcr.ItemExistsException;
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.VersionException;
+
+/**
+ * @author <a href="mailto:nzamosenchuk@exoplatform.com">Nikolay Zamosenchul</a>
+ * @version $Id: TestSameNameSiblingsSessionMove 34360 2011-07-20 18:58:59Z nzamosenchuk $
+ *
+ */
+public class TestSameNameSiblingsSessionMove extends AbstractSameNameSiblingsMoveTest
+{
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ void move(Node testRoot, String srcAbsPath, String destAbsPath) throws ItemExistsException, PathNotFoundException,
+ VersionException, ConstraintViolationException, LockException, RepositoryException
+ {
+ testRoot.getSession().move(srcAbsPath, destAbsPath);
+ testRoot.getSession().save();
+ }
+
+}
Property changes on: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsSessionMove.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsWorkspaceMove.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsWorkspaceMove.java (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsWorkspaceMove.java 2011-07-21 09:39:19 UTC (rev 4670)
@@ -0,0 +1,47 @@
+/*
+ * 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.api.writing;
+
+import javax.jcr.ItemExistsException;
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.RepositoryException;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.version.VersionException;
+
+/**
+ * @author <a href="mailto:nzamosenchuk@exoplatform.com">Nikolay Zamosenchul</a>
+ * @version $Id: TestSameNameSiblingsSessionMove 34360 2011-07-20 18:58:59Z nzamosenchuk $
+ *
+ */
+public class TestSameNameSiblingsWorkspaceMove extends AbstractSameNameSiblingsMoveTest
+{
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ void move(Node testRoot, String srcAbsPath, String destAbsPath) throws ItemExistsException, PathNotFoundException,
+ VersionException, ConstraintViolationException, LockException, RepositoryException
+ {
+ testRoot.getSession().getWorkspace().move(srcAbsPath, destAbsPath);
+ }
+
+}
Property changes on: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestSameNameSiblingsWorkspaceMove.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
12 years, 9 months
exo-jcr SVN: r4669 - jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository.
by do-not-reply@jboss.org
Author: sergiykarpenko
Date: 2011-07-20 05:57:28 -0400 (Wed, 20 Jul 2011)
New Revision: 4669
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java
Log:
EXOJCR-1443: tests - escape symbols in workspase name fixed.
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java 2011-07-20 07:47:31 UTC (rev 4668)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java 2011-07-20 09:57:28 UTC (rev 4669)
@@ -357,7 +357,7 @@
public void testRemoveRepository() throws Exception
{
ManageableRepository repository = helper.createRepository(container, true, null);
-
+
String wsName = repository.getConfiguration().getSystemWorkspaceName();
String repoName = repository.getConfiguration().getName();
@@ -439,7 +439,7 @@
// Indexer
ArrayList qParams = new ArrayList();
- qParams.add(new SimpleParameterEntry("indexDir", "target" + File.separator + wsName));
+ qParams.add(new SimpleParameterEntry("indexDir", "target" + File.separator + skipInvalidCharacters(wsName)));
QueryHandlerEntry qEntry = new QueryHandlerEntry(defWEntry.getQueryHandler().getType(), qParams);
ws1back.setQueryHandler(qEntry);
@@ -453,7 +453,7 @@
if (newp.getName().equals("source-name"))
newp.setValue(sourceName);
else if (newp.getName().equals("swap-directory"))
- newp.setValue("target/temp/swap/" + wsName);
+ newp.setValue("target/temp/swap/" + skipInvalidCharacters(wsName));
else if (newp.getName().equals("multi-db"))
newp.setValue(Boolean.toString(multiDb));
@@ -465,4 +465,17 @@
return ws1back;
}
+
+ private String skipInvalidCharacters(String s)
+ {
+ if (File.separator.equals("\\"))
+ {
+ return s.replaceAll("[:,?]", "_");
+ }
+ else
+ {
+ return s;
+ }
+
+ }
}
12 years, 9 months