[exo-jcr-commits] exo-jcr SVN: r1439 - in jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Sun Jan 17 03:09:08 EST 2010


Author: nzamosenchuk
Date: 2010-01-17 03:09:07 -0500 (Sun, 17 Jan 2010)
New Revision: 1439

Modified:
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
   jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestCompressedChangesBuffer.java
Log:
EXOJCR-409: Added and applied option for local cache operations, skipping replication and refactored BufferedJBossCache.

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java	2010-01-16 20:04:46 UTC (rev 1438)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java	2010-01-17 08:09:07 UTC (rev 1439)
@@ -59,6 +59,8 @@
    private final Cache<Serializable, Object> parentCache;
 
    private ThreadLocal<CompressedChangesBuffer> changesList = new ThreadLocal<CompressedChangesBuffer>();
+   
+   private ThreadLocal<Boolean> local = new ThreadLocal<Boolean>();
 
    protected static final Log LOG =
       ExoLogger.getLogger("org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.BufferedJBossCache");
@@ -75,6 +77,7 @@
    public void beginTransaction()
    {
       changesList.set(new CompressedChangesBuffer());
+      local.set(false);
    }
 
    /**
@@ -82,11 +85,7 @@
     */
    public void commitTransaction()
    {
-      CompressedChangesBuffer changesContainer = changesList.get();
-      if (changesContainer == null)
-      {
-         throw new IllegalStateException("changesContainer should not be empty");
-      }
+      CompressedChangesBuffer changesContainer = getChangesBufferSafe();
       try
       {
          //log.info("Before=" + changesContainer.toString());
@@ -105,6 +104,21 @@
    }
 
    /**
+    * Tries to get buffer and if it is null throws an exception otherwise returns buffer. 
+    * 
+    * @return
+    */
+   private CompressedChangesBuffer getChangesBufferSafe()
+   {
+      CompressedChangesBuffer changesContainer = changesList.get();
+      if (changesContainer == null)
+      {
+         throw new IllegalStateException("changesContainer should not be empty");
+      }
+      return changesContainer;
+   }
+
+   /**
     * Forget about changes
     */
    public void rollbackTransaction()
@@ -112,6 +126,16 @@
       changesList.set(null);
    }
 
+   /**
+    * Creates all ChangesBuffers with given parameter
+    * 
+    * @param local
+    */
+   public void setLocal(boolean local)
+   {
+      this.local.set(local);
+   }
+   
    /* (non-Javadoc)
     * @see org.jboss.cache.Cache#addCacheListener(java.lang.Object)
     */
@@ -376,13 +400,8 @@
     */
    public void put(Fqn fqn, Map<? extends Serializable, ? extends Object> data)
    {
-      //parentCache.put(fqn, data);
-      CompressedChangesBuffer changesContainer = changesList.get();
-      if (changesContainer == null)
-      {
-         throw new IllegalStateException("changesContainer should not be empty");
-      }
-      changesContainer.add(new PutObjectContainer(fqn, data, parentCache, changesContainer.getHistoryIndex()));
+      CompressedChangesBuffer changesContainer = getChangesBufferSafe();
+      changesContainer.add(new PutObjectContainer(fqn, data, parentCache, changesContainer.getHistoryIndex(), local.get()));
    }
 
    /* (non-Javadoc)
@@ -390,12 +409,8 @@
     */
    public Object put(Fqn fqn, Serializable key, Object value)
    {
-      CompressedChangesBuffer changesContainer = changesList.get();
-      if (changesContainer == null)
-      {
-         throw new IllegalStateException("changesContainer should not be empty");
-      }
-      changesContainer.add(new PutKeyValueContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex()));
+      CompressedChangesBuffer changesContainer = getChangesBufferSafe();
+      changesContainer.add(new PutKeyValueContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex(), local.get()));
 
       return parentCache.get(fqn, key);
    }
@@ -430,12 +445,8 @@
     */
    public Object remove(Fqn fqn, Serializable key)
    {
-      CompressedChangesBuffer changesContainer = changesList.get();
-      if (changesContainer == null)
-      {
-         throw new IllegalStateException("changesContainer should not be empty");
-      }
-      changesContainer.add(new RemoveKeyContainer(fqn, key, parentCache, changesContainer.getHistoryIndex()));
+      CompressedChangesBuffer changesContainer = getChangesBufferSafe();
+      changesContainer.add(new RemoveKeyContainer(fqn, key, parentCache, changesContainer.getHistoryIndex(), local.get()));
       return parentCache.get(fqn, key);
    }
 
@@ -476,12 +487,8 @@
     */
    public boolean removeNode(Fqn fqn)
    {
-      CompressedChangesBuffer changesContainer = changesList.get();
-      if (changesContainer == null)
-      {
-         throw new IllegalStateException("changesContainer should not be empty");
-      }
-      changesContainer.add(new RemoveNodeContainer(fqn, parentCache, changesContainer.getHistoryIndex()));
+      CompressedChangesBuffer changesContainer = getChangesBufferSafe();
+      changesContainer.add(new RemoveNodeContainer(fqn, parentCache, changesContainer.getHistoryIndex(), local.get()));
       return true;
    }
 
@@ -548,12 +555,8 @@
     */
    public void addToList(Fqn fqn, String key, Object value)
    {
-      CompressedChangesBuffer changesContainer = changesList.get();
-      if (changesContainer == null)
-      {
-         throw new IllegalStateException("changesContainer should not be empty");
-      }
-      changesContainer.add(new AddToListContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex()));
+      CompressedChangesBuffer changesContainer = getChangesBufferSafe();
+      changesContainer.add(new AddToListContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex(), local.get()));
    }
 
    /**
@@ -565,13 +568,9 @@
     */
    public void removeFromList(Fqn fqn, String key, Object value)
    {
-      CompressedChangesBuffer changesContainer = changesList.get();
-      if (changesContainer == null)
-      {
-         throw new IllegalStateException("changesContainer should not be empty");
-      }
+      CompressedChangesBuffer changesContainer = getChangesBufferSafe();
       changesContainer
-         .add(new RemoveFromListContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex()));
+         .add(new RemoveFromListContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex(), local.get()));
    }
 
    public static enum ChangesType {
@@ -591,13 +590,16 @@
 
       protected final int historicalIndex;
 
-      public ChangesContainer(Fqn fqn, ChangesType changesType, Cache<Serializable, Object> cache, int historicalIndex)
+      protected final boolean localMode;
+
+      public ChangesContainer(Fqn fqn, ChangesType changesType, Cache<Serializable, Object> cache, int historicalIndex, boolean localMode)
       {
          super();
          this.fqn = fqn;
          this.changesType = changesType;
          this.cache = cache;
          this.historicalIndex = historicalIndex;
+         this.localMode = localMode;
       }
 
       /**
@@ -639,6 +641,11 @@
          return result == 0 ? historicalIndex - o.getHistoricalIndex() : result;
       }
 
+      protected void setCacheLocalMode()
+      {
+         cache.getInvocationContext().getOptionOverrides().setCacheModeLocal(localMode);
+      }
+      
       public abstract void apply();
    }
 
@@ -650,9 +657,9 @@
       private final Map<? extends Serializable, ? extends Object> data;
 
       public PutObjectContainer(Fqn fqn, Map<? extends Serializable, ? extends Object> data,
-         Cache<Serializable, Object> cache, int historicalIndex)
+         Cache<Serializable, Object> cache, int historicalIndex, boolean local)
       {
-         super(fqn, ChangesType.PUT, cache, historicalIndex);
+         super(fqn, ChangesType.PUT, cache, historicalIndex, local);
 
          this.data = data;
       }
@@ -660,6 +667,7 @@
       @Override
       public void apply()
       {
+         setCacheLocalMode();
          cache.put(fqn, data);
       }
    }
@@ -674,9 +682,9 @@
       private final Object value;
 
       public PutKeyValueContainer(Fqn fqn, Serializable key, Object value, Cache<Serializable, Object> cache,
-         int historicalIndex)
+         int historicalIndex, boolean local)
       {
-         super(fqn, ChangesType.PUT_KEY, cache, historicalIndex);
+         super(fqn, ChangesType.PUT_KEY, cache, historicalIndex, local);
          this.key = key;
          this.value = value;
       }
@@ -684,6 +692,7 @@
       @Override
       public void apply()
       {
+         setCacheLocalMode();
          cache.put(fqn, key, value);
       }
    }
@@ -699,9 +708,9 @@
       private final Object value;
 
       public AddToListContainer(Fqn fqn, Serializable key, Object value, Cache<Serializable, Object> cache,
-         int historicalIndex)
+         int historicalIndex, boolean local)
       {
-         super(fqn, ChangesType.PUT_KEY, cache, historicalIndex);
+         super(fqn, ChangesType.PUT_KEY, cache, historicalIndex, local);
          this.key = key;
          this.value = value;
       }
@@ -723,6 +732,7 @@
                newSet.addAll((Set<Object>)existingObject);
             }
             newSet.add(value);
+            setCacheLocalMode();
             cache.put(fqn, key, newSet);
          }
          else
@@ -743,9 +753,9 @@
       private final Object value;
 
       public RemoveFromListContainer(Fqn fqn, Serializable key, Object value, Cache<Serializable, Object> cache,
-         int historicalIndex)
+         int historicalIndex, boolean local)
       {
-         super(fqn, ChangesType.REMOVE_KEY, cache, historicalIndex);
+         super(fqn, ChangesType.REMOVE_KEY, cache, historicalIndex, local);
          this.key = key;
          this.value = value;
       }
@@ -756,12 +766,14 @@
          // force writeLock on next read
          cache.getInvocationContext().getOptionOverrides().setForceWriteLock(true);
          // object found by FQN and key;
+         setCacheLocalMode();
          Object existingObject = cache.get(getFqn(), key);
          // if found value is really set! add to it.
          if (existingObject instanceof Set)
          {
             Set<Object> newSet = new HashSet<Object>((Set<Object>)existingObject);
             newSet.remove(value);
+            setCacheLocalMode();
             cache.put(fqn, key, newSet);
          }
       }
@@ -774,17 +786,17 @@
    {
       private final Serializable key;
 
-      public RemoveKeyContainer(Fqn fqn, Serializable key, Cache<Serializable, Object> cache, int historicalIndex)
+      public RemoveKeyContainer(Fqn fqn, Serializable key, Cache<Serializable, Object> cache, int historicalIndex, boolean local)
       {
-         super(fqn, ChangesType.REMOVE_KEY, cache, historicalIndex);
+         super(fqn, ChangesType.REMOVE_KEY, cache, historicalIndex, local);
          this.key = key;
       }
 
       @Override
       public void apply()
       {
+         setCacheLocalMode();
          cache.remove(fqn, key);
-
       }
 
    }
@@ -795,14 +807,15 @@
    public static class RemoveNodeContainer extends ChangesContainer
    {
 
-      public RemoveNodeContainer(Fqn fqn, Cache<Serializable, Object> cache, int historicalIndex)
+      public RemoveNodeContainer(Fqn fqn, Cache<Serializable, Object> cache, int historicalIndex, boolean local)
       {
-         super(fqn, ChangesType.REMOVE, cache, historicalIndex);
+         super(fqn, ChangesType.REMOVE, cache, historicalIndex, local);
       }
 
       @Override
       public void apply()
       {
+         setCacheLocalMode();
          cache.removeNode(fqn);
       }
    }

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java	2010-01-16 20:04:46 UTC (rev 1438)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java	2010-01-17 08:09:07 UTC (rev 1439)
@@ -371,6 +371,7 @@
     */
    public void put(ItemData item)
    {
+      cache.setLocal(true);
       if (item.isNode())
       {
          putNode((NodeData)item, ModifyChildOption.NOT_MODIFY);
@@ -379,6 +380,7 @@
       {
          putProperty((PropertyData)item, ModifyChildOption.NOT_MODIFY);
       }
+      cache.setLocal(false);
    }
 
    /**
@@ -439,6 +441,7 @@
    */
    public void addChildNodes(NodeData parent, List<NodeData> childs)
    {
+      cache.setLocal(true);
       // remove previous all (to be sure about consistency)
       cache.removeNode(makeChildListFqn(childNodesList, parent.getIdentifier()));
 
@@ -455,6 +458,7 @@
          // cache fact of empty childs list
          cache.put(makeChildListFqn(childNodesList, parent.getIdentifier()), ITEM_LIST, new HashSet<Object>());
       }
+      cache.setLocal(false);
    }
 
    /**
@@ -462,6 +466,7 @@
     */
    public void addChildProperties(NodeData parent, List<PropertyData> childs)
    {
+      cache.setLocal(true);
       // remove previous all (to be sure about consistency)
       cache.removeNode(makeChildListFqn(childPropsList, parent.getIdentifier()));
       if (childs.size() > 0)
@@ -476,6 +481,7 @@
       {
          LOG.warn("Empty properties list cached " + (parent != null ? parent.getQPath().getAsString() : parent));
       }
+      cache.setLocal(false);
    }
 
    /**
@@ -483,7 +489,9 @@
     */
    public void addChildPropertiesList(NodeData parent, List<PropertyData> childProperties)
    {
+      cache.setLocal(true);
       // TODO not implemented, will force read from DB
+      cache.setLocal(false);
    }
 
    /**

Modified: jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestCompressedChangesBuffer.java
===================================================================
--- jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestCompressedChangesBuffer.java	2010-01-16 20:04:46 UTC (rev 1438)
+++ jcr/branches/1.12.0-JBCCACHE/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestCompressedChangesBuffer.java	2010-01-17 08:09:07 UTC (rev 1439)
@@ -40,13 +40,13 @@
       CompressedChangesBuffer buffer = new CompressedChangesBuffer();
       ChangesContainer put1 =
          new PutObjectContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES + "/b"),
-            new HashMap<String, String>(), null, buffer.getHistoryIndex());
+            new HashMap<String, String>(), null, buffer.getHistoryIndex(), false);
       ChangesContainer put2 =
          new PutObjectContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES + "/b/c"),
-            new HashMap<String, String>(), null, buffer.getHistoryIndex());
+            new HashMap<String, String>(), null, buffer.getHistoryIndex(), false);
       ChangesContainer rm1 =
          new RemoveNodeContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES + "/b"), null, buffer
-            .getHistoryIndex());
+            .getHistoryIndex(), false);
       buffer.add(put1);
       buffer.add(put2);
       assertTrue("List MUST contain put container", buffer.getSortedList().contains(put1));
@@ -67,17 +67,17 @@
       CompressedChangesBuffer buffer = new CompressedChangesBuffer();
       ChangesContainer put1 =
          new PutObjectContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES + "/b"),
-            new HashMap<String, String>(), null, buffer.getHistoryIndex());
+            new HashMap<String, String>(), null, buffer.getHistoryIndex(), false);
 
       ChangesContainer put2 =
          new PutObjectContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES + "/b/c"),
-            new HashMap<String, String>(), null, buffer.getHistoryIndex());
+            new HashMap<String, String>(), null, buffer.getHistoryIndex(), false);
       ChangesContainer rm1 =
          new RemoveNodeContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES + "/b/c"), null,
-            buffer.getHistoryIndex());
+            buffer.getHistoryIndex(), false);
       ChangesContainer rm2 =
          new RemoveNodeContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES + "/b"), null, buffer
-            .getHistoryIndex());
+            .getHistoryIndex(), false);
       buffer.add(put1);
       buffer.add(put2);
       assertTrue("List MUST contain put container", buffer.getSortedList().contains(put1));
@@ -97,11 +97,11 @@
       CompressedChangesBuffer buffer = new CompressedChangesBuffer();
       ChangesContainer put1 =
          new PutObjectContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES_LIST + "/b"),
-            new HashMap<String, String>(), null, buffer.getHistoryIndex());
+            new HashMap<String, String>(), null, buffer.getHistoryIndex(), false);
 
       ChangesContainer rm1 =
          new RemoveNodeContainer(Fqn.fromString("/" + JBossCacheWorkspaceStorageCache.CHILD_NODES_LIST + "/b"), null,
-            buffer.getHistoryIndex());
+            buffer.getHistoryIndex(), false);
       buffer.add(put1);
       assertTrue("List MUST contain put container", buffer.getSortedList().contains(put1));
       buffer.add(rm1);



More information about the exo-jcr-commits mailing list