[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