[exo-jcr-commits] exo-jcr SVN: r4634 - in jcr/branches/1.12.x/patch/1.12.10-GA: JCR-1650 and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Jul 15 04:14:36 EDT 2011
Author: tolusha
Date: 2011-07-15 04:14:35 -0400 (Fri, 15 Jul 2011)
New Revision: 4634
Added:
jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1650/
jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1650/JCR-1650.patch
Log:
JCR-1650: patch proposed
Added: jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1650/JCR-1650.patch
===================================================================
--- jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1650/JCR-1650.patch (rev 0)
+++ jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1650/JCR-1650.patch 2011-07-15 08:14:35 UTC (rev 4634)
@@ -0,0 +1,288 @@
+Index: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestJBossCacheWorkspaceStorageCacheInClusterMode.java
+===================================================================
+--- exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestJBossCacheWorkspaceStorageCacheInClusterMode.java (revision 4633)
++++ exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestJBossCacheWorkspaceStorageCacheInClusterMode.java (working copy)
+@@ -80,7 +80,7 @@
+ transactionService == null ? null : transactionService, new ConfigurationManagerImpl());
+ }
+
+- public void testRaceConditions() throws Exception
++ public void testRaceConditionsNConsistency() throws Exception
+ {
+ JBossCacheWorkspaceStorageCache cache1 = null, cache2 = null;
+ try
+@@ -273,6 +273,106 @@
+ assertEquals(2, cwdmNode1.getItemData(parentNode, qpe, ItemType.PROPERTY).getPersistedVersion());
+ assertNotNull(cwdmNode2.getItemData(parentNode, qpe, ItemType.PROPERTY));
+ assertEquals(2, cwdmNode2.getItemData(parentNode, qpe, ItemType.PROPERTY).getPersistedVersion());
++
++ // testConsistency
++ con = new MyWorkspaceStorageConnection(true);
++ wdc = new MyWorkspaceDataContainer(con);
++ cwdmNode1 = new CacheableWorkspaceDataManager(wdc, cache1, new SystemDataContainerHolder(wdc));
++ cwdmNode2 = new CacheableWorkspaceDataManager(wdc, cache2, new SystemDataContainerHolder(wdc));
++ parentNode =
++ new PersistedNodeData("parent2-id", QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null,
++ "parent2-node")), Constants.ROOT_UUID, 1, 0, Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
++
++ // Test getChildNodesData
++ con.setParentNode(parentNode);
++ cwdmNode2.getChildNodesData(parentNode);
++ PlainChangesLog chlog = new PlainChangesLogImpl();
++ chlog.add(ItemState.createAddedState(new PersistedNodeData("id-node" + parentNode.getIdentifier(), QPath
++ .makeChildPath(parentNode.getQPath(), new InternalQName(null, "node")), parentNode.getIdentifier(), 1, 0,
++ Constants.NT_UNSTRUCTURED, new InternalQName[0], null)));
++ cwdmNode1.save(chlog);
++ assertNotNull(cwdmNode1.getChildNodesData(parentNode));
++ assertEquals(2, cwdmNode1.getChildNodesData(parentNode).size());
++ assertNotNull(cwdmNode2.getChildNodesData(parentNode));
++ assertEquals(2, cwdmNode2.getChildNodesData(parentNode).size());
++ parentNode =
++ new PersistedNodeData("parent2-id2", QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null,
++ "parent2-node2")), Constants.ROOT_UUID, 1, 0, Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
++ con.setParentNode(parentNode);
++ cwdmNode2.getChildNodesData(parentNode);
++ chlog = new PlainChangesLogImpl();
++ chlog.add(ItemState.createDeletedState(new PersistedNodeData("id-node2" + parentNode.getIdentifier(), QPath
++ .makeChildPath(parentNode.getQPath(), new InternalQName(null, "node2")), parentNode.getIdentifier(), 1, 0,
++ Constants.NT_UNSTRUCTURED, new InternalQName[0], null)));
++ cwdmNode1.save(chlog);
++ assertNotNull(cwdmNode1.getChildNodesData(parentNode));
++ assertEquals(0, cwdmNode1.getChildNodesData(parentNode).size());
++ assertNotNull(cwdmNode2.getChildNodesData(parentNode));
++ assertEquals(0, cwdmNode2.getChildNodesData(parentNode).size());
++
++ // Test getChildPropertiesData
++ parentNode =
++ new PersistedNodeData("parent2-id3", QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null,
++ "parent2-node3")), Constants.ROOT_UUID, 1, 0, Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
++ con.setParentNode(parentNode);
++ cwdmNode2.getChildPropertiesData(parentNode);
++ chlog = new PlainChangesLogImpl();
++ chlog.add(ItemState.createAddedState(new PersistedPropertyData("id-property" + parentNode.getIdentifier(),
++ QPath.makeChildPath(parentNode.getQPath(), new InternalQName(null, "property")),
++ parentNode.getIdentifier(), 0, PropertyType.STRING, false, Arrays
++ .asList((ValueData)new ByteArrayPersistedValueData(0, "some data".getBytes("UTF-8"))))));
++ cwdmNode1.save(chlog);
++ assertNotNull(cwdmNode1.getChildPropertiesData(parentNode));
++ assertEquals(2, cwdmNode1.getChildPropertiesData(parentNode).size());
++ assertNotNull(cwdmNode2.getChildPropertiesData(parentNode));
++ assertEquals(2, cwdmNode2.getChildPropertiesData(parentNode).size());
++ parentNode =
++ new PersistedNodeData("parent2-id4", QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null,
++ "parent2-node4")), Constants.ROOT_UUID, 1, 0, Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
++ con.setParentNode(parentNode);
++ cwdmNode2.getChildPropertiesData(parentNode);
++ chlog = new PlainChangesLogImpl();
++ chlog.add(ItemState.createDeletedState(new PersistedPropertyData("id-property2" + parentNode.getIdentifier(),
++ QPath.makeChildPath(parentNode.getQPath(), new InternalQName(null, "property2")), parentNode
++ .getIdentifier(), 0, PropertyType.STRING, false, Arrays
++ .asList((ValueData)new ByteArrayPersistedValueData(0, "some data".getBytes("UTF-8"))))));
++ cwdmNode1.save(chlog);
++ assertNotNull(cwdmNode1.getChildPropertiesData(parentNode));
++ assertEquals(0, cwdmNode1.getChildPropertiesData(parentNode).size());
++ assertNotNull(cwdmNode2.getChildPropertiesData(parentNode));
++ assertEquals(0, cwdmNode2.getChildPropertiesData(parentNode).size());
++
++ // Test getReferencesData
++ parentNode =
++ new PersistedNodeData("parent2-id5", QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null,
++ "parent2-node5")), Constants.ROOT_UUID, 1, 0, Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
++ con.setParentNode(parentNode);
++ cwdmNode2.getReferencesData(parentNode.getIdentifier(), false);
++ chlog = new PlainChangesLogImpl();
++ chlog.add(ItemState.createAddedState(new PersistedPropertyData("id-reference" + parentNode.getIdentifier(),
++ QPath.makeChildPath(parentNode.getQPath(), new InternalQName(null, "reference")), parentNode
++ .getIdentifier(), 0, PropertyType.REFERENCE, false, Arrays
++ .asList((ValueData)new ByteArrayPersistedValueData(0, parentNode.getIdentifier().getBytes("UTF-8"))))));
++ cwdmNode1.save(chlog);
++ assertNotNull(cwdmNode1.getReferencesData(parentNode.getIdentifier(), false));
++ assertEquals(2, cwdmNode1.getReferencesData(parentNode.getIdentifier(), false).size());
++ assertNotNull(cwdmNode2.getReferencesData(parentNode.getIdentifier(), false));
++ assertEquals(2, cwdmNode2.getReferencesData(parentNode.getIdentifier(), false).size());
++ parentNode =
++ new PersistedNodeData("parent2-id6", QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null,
++ "parent2-node6")), Constants.ROOT_UUID, 1, 0, Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
++ con.setParentNode(parentNode);
++ cwdmNode2.getReferencesData(parentNode.getIdentifier(), false);
++ chlog = new PlainChangesLogImpl();
++ chlog.add(ItemState.createDeletedState(new PersistedPropertyData("id-reference2" + parentNode.getIdentifier(),
++ QPath.makeChildPath(parentNode.getQPath(), new InternalQName(null, "reference2")), parentNode
++ .getIdentifier(), 0, PropertyType.REFERENCE, false, Arrays
++ .asList((ValueData)new ByteArrayPersistedValueData(0, parentNode.getIdentifier().getBytes("UTF-8"))))));
++ cwdmNode1.save(chlog);
++ assertNotNull(cwdmNode1.getReferencesData(parentNode.getIdentifier(), false));
++ assertEquals(0, cwdmNode1.getReferencesData(parentNode.getIdentifier(), false).size());
++ assertNotNull(cwdmNode2.getReferencesData(parentNode.getIdentifier(), false));
++ assertEquals(0, cwdmNode2.getReferencesData(parentNode.getIdentifier(), false).size());
+ }
+ finally
+ {
+@@ -336,6 +436,8 @@
+ {
+ if (mode == Mode.WRITE_FIRST) goSignal.countDown();
+ doneSignal.countDown();
++
++ con.wait.remove();
+ }
+ }
+ };
+@@ -360,6 +462,8 @@
+ {
+ if (mode == Mode.READ_FIRST) goSignal.countDown();
+ doneSignal.countDown();
++
++ con.wait.remove();
+ }
+ }
+ };
+@@ -373,22 +477,50 @@
+ {
+
+ protected final CacheableWorkspaceDataManager cwdm;
++
+ public Action(CacheableWorkspaceDataManager cwdm)
+ {
+ this.cwdm = cwdm;
+ }
+ protected abstract void execute(NodeData parentNode) throws Exception;
+ }
++
+ private static enum Mode
+ {
+ READ_FIRST, WRITE_FIRST;
+ }
+- private static class MyWorkspaceStorageConnection implements WorkspaceStorageConnection
++
++ public static class MyWorkspaceStorageConnection implements WorkspaceStorageConnection
+ {
+ public ThreadLocal<Boolean> wait = new ThreadLocal<Boolean>();
++
+ private NodeData parentNode;
++
+ private CountDownLatch goSignal;
+
++ private ItemData itemAdded;
++
++ private boolean canModify;
++
++ private boolean itemDeleted;
++
++ public MyWorkspaceStorageConnection()
++ {
++ }
++
++ public MyWorkspaceStorageConnection(boolean canModify)
++ {
++ this.canModify = canModify;
++ }
++
++ /**
++ * @param canModify the canModify to set
++ */
++ public void setCanModify(boolean canModify)
++ {
++ this.canModify = canModify;
++ }
++
+ public CountDownLatch initCountDownLatch()
+ {
+ return this.goSignal = new CountDownLatch(1);
+@@ -397,16 +529,20 @@
+ public void setParentNode(NodeData parentNode)
+ {
+ this.parentNode = parentNode;
++ this.itemAdded = null;
++ this.itemDeleted = false;
+ }
+
+ public void add(NodeData data) throws RepositoryException, UnsupportedOperationException,
+ InvalidItemStateException, IllegalStateException
+ {
++ this.itemAdded = data;
+ }
+
+ public void add(PropertyData data) throws RepositoryException, UnsupportedOperationException,
+ InvalidItemStateException, IllegalStateException
+ {
++ this.itemAdded = data;
+ }
+
+ public void close() throws IllegalStateException, RepositoryException
+@@ -431,11 +567,13 @@
+ public void delete(NodeData data) throws RepositoryException, UnsupportedOperationException,
+ InvalidItemStateException, IllegalStateException
+ {
++ this.itemDeleted = true;
+ }
+
+ public void delete(PropertyData data) throws RepositoryException, UnsupportedOperationException,
+ InvalidItemStateException, IllegalStateException
+ {
++ this.itemDeleted = true;
+ }
+
+ public int getChildNodesCount(NodeData parent) throws RepositoryException
+@@ -457,8 +595,17 @@
+ }
+ }
+ List<NodeData> children = new ArrayList<NodeData>();
+- children.add(new PersistedNodeData("id-node2" + parentNode.getIdentifier(), QPath.makeChildPath(parent.getQPath(), new InternalQName(null, "node2")), parent.getIdentifier(), 1, 0,
+- Constants.NT_UNSTRUCTURED, new InternalQName[0], null));
++ if (!canModify || !itemDeleted)
++ {
++ children.add(new PersistedNodeData("id-node2" + parentNode.getIdentifier(), QPath.makeChildPath(
++ parent.getQPath(), new InternalQName(null, "node2")), parent.getIdentifier(), 1, 0,
++ Constants.NT_UNSTRUCTURED, new InternalQName[0], null));
++ }
++ if (canModify && itemAdded != null)
++ {
++ children.add((NodeData)itemAdded);
++ }
++
+ return children;
+ }
+
+@@ -479,9 +626,17 @@
+ List<PropertyData> children = new ArrayList<PropertyData>();
+ try
+ {
+- children.add(new PersistedPropertyData("id-property2" + parentNode.getIdentifier(), QPath.makeChildPath(
+- parentNode.getQPath(), new InternalQName(null, "property2")), parentNode.getIdentifier(), 0,
+- PropertyType.STRING, false, Arrays.asList((ValueData)new ByteArrayPersistedValueData(0, "some data".getBytes("UTF-8")))));
++ if (!canModify || !itemDeleted)
++ {
++ children.add(new PersistedPropertyData("id-property2" + parentNode.getIdentifier(), QPath.makeChildPath(
++ parentNode.getQPath(), new InternalQName(null, "property2")), parentNode.getIdentifier(), 0,
++ PropertyType.STRING, false, Arrays.asList((ValueData)new ByteArrayPersistedValueData(0, "some data"
++ .getBytes("UTF-8")))));
++ }
++ if (canModify && itemAdded != null)
++ {
++ children.add((PropertyData)itemAdded);
++ }
+ }
+ catch (UnsupportedEncodingException e)
+ {
+@@ -565,9 +720,18 @@
+ List<PropertyData> children = new ArrayList<PropertyData>();
+ try
+ {
+- children.add(new PersistedPropertyData("id-reference2" + parentNode.getIdentifier(), QPath.makeChildPath(
+- parentNode.getQPath(), new InternalQName(null, "reference2")), parentNode.getIdentifier(), 0,
+- PropertyType.REFERENCE, false, Arrays.asList((ValueData)new ByteArrayPersistedValueData(0, parentNode.getIdentifier().getBytes("UTF-8")))));
++ if (!canModify || !itemDeleted)
++ {
++ children
++ .add(new PersistedPropertyData("id-reference2" + parentNode.getIdentifier(), QPath.makeChildPath(
++ parentNode.getQPath(), new InternalQName(null, "reference2")), parentNode.getIdentifier(), 0,
++ PropertyType.REFERENCE, false, Arrays.asList((ValueData)new ByteArrayPersistedValueData(0,
++ parentNode.getIdentifier().getBytes("UTF-8")))));
++ }
++ if (canModify && itemAdded != null)
++ {
++ children.add((PropertyData)itemAdded);
++ }
+ }
+ catch (UnsupportedEncodingException e)
+ {
More information about the exo-jcr-commits
mailing list