[exo-jcr-commits] exo-jcr SVN: r4777 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/dataflow/persistent and 4 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Aug 18 11:15:47 EDT 2011


Author: sergiykarpenko
Date: 2011-08-18 11:15:47 -0400 (Thu, 18 Aug 2011)
New Revision: 4777

Added:
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorksapceDataManagerBloomFilter.java
Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/MappedParametrizedObjectEntry.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/storage/WorkspaceDataContainer.java
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/BaseStandaloneTest.java
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorkspaceDataManager.java
   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/jbosscache/TestJBossCacheWorkspaceStorageCache.java
Log:
EXOJCR-1456: test added. Bloom filter configuration implemented.

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/MappedParametrizedObjectEntry.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/MappedParametrizedObjectEntry.java	2011-08-18 15:09:19 UTC (rev 4776)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/MappedParametrizedObjectEntry.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -227,6 +227,55 @@
    }
 
    /**
+    * Parse named parameter as Double.
+    * 
+    * @param name
+    *          parameter name
+    * @param defaultValue
+    *          default Double value
+    * @return Double value
+    */
+   public Double getParameterDouble(String name, Double defaultValue)
+   {
+      for (int i = 0; i < parameters.size(); i++)
+      {
+         SimpleParameterEntry p = parameters.get(i);
+         if (p.getName().equals(name))
+         {
+            try
+            {
+               return StringNumberParser.parseDouble(p.getValue());
+            }
+            catch (NumberFormatException e)
+            {
+               //LOG.warn(name + ": unparseable Long. " + e);
+            }
+         }
+      }
+      return defaultValue;
+   }
+
+   /**
+    * Parse named parameter as Double.
+    * 
+    * @param name
+    *          parameter name
+    * @return Double value
+    * @throws RepositoryConfigurationException
+    */
+   public Double getParameterDouble(String name) throws RepositoryConfigurationException
+   {
+      try
+      {
+         return StringNumberParser.parseDouble(getParameterValue(name));
+      }
+      catch (NumberFormatException e)
+      {
+         throw new RepositoryConfigurationException(name + ": unparseable Long. " + e, e);
+      }
+   }
+
+   /**
     * Parse named parameter using {@link StringNumberParser.parseTime} and return time in
     * milliseconds (Long value).
     * 

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-08-18 15:09:19 UTC (rev 4776)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -23,6 +23,7 @@
 import org.exoplatform.management.annotations.ManagedDescription;
 import org.exoplatform.services.jcr.access.AccessControlEntry;
 import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
 import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
 import org.exoplatform.services.jcr.dataflow.persistent.MandatoryItemsPersistenceListener;
 import org.exoplatform.services.jcr.dataflow.persistent.WorkspaceStorageCache;
@@ -90,6 +91,10 @@
    TopologyChangeListener, Startable, WorkspaceStorageCacheListener
 {
 
+   private final static double ACL_BF_FALSE_PROPBABILITY_DEFAULT = 0.1d;
+
+   private final static int ACL_BF_ELEMENTS_NUMBER_DEFAULT = 1000000;
+
    /**
     * Items cache.
     */
@@ -107,6 +112,13 @@
 
    private final AtomicBoolean filtersEnabled = new AtomicBoolean();
 
+   /**
+    * Bloom filter parameters.
+    */
+   private final double bfProbability;
+
+   private final int bfElementNumber;
+
    private volatile BloomFilter<String> filterPermissions;
 
    private volatile BloomFilter<String> filterOwner;
@@ -361,6 +373,8 @@
    /**
     * CacheableWorkspaceDataManager constructor.
     * 
+    * @param wsConfig 
+    *          WorkspaceEntry used to fetch bloom filter parameters
     * @param dataContainer
     *          Workspace data container (persistent level)
     * @param cache
@@ -374,11 +388,30 @@
     * @param rpcService
     *          the service for executing commands on all nodes of cluster
     */
-   public CacheableWorkspaceDataManager(WorkspaceDataContainer dataContainer, WorkspaceStorageCache cache,
-      SystemDataContainerHolder systemDataContainerHolder, TransactionableResourceManager txResourceManager,
-      TransactionService transactionService, RPCService rpcService)
+   public CacheableWorkspaceDataManager(WorkspaceEntry wsConfig, WorkspaceDataContainer dataContainer,
+      WorkspaceStorageCache cache, SystemDataContainerHolder systemDataContainerHolder,
+      TransactionableResourceManager txResourceManager, TransactionService transactionService, RPCService rpcService)
    {
       super(dataContainer, systemDataContainerHolder, txResourceManager);
+
+      bfProbability =
+         wsConfig.getContainer().getParameterDouble(WorkspaceDataContainer.ACL_BF_FALSE_PROPBABILITY,
+            ACL_BF_FALSE_PROPBABILITY_DEFAULT);
+      if (bfProbability < 0 || bfProbability > 1)
+      {
+         throw new IllegalArgumentException("Parameter " + WorkspaceDataContainer.ACL_BF_FALSE_PROPBABILITY
+            + " is invalid, must be between 0 and 1.");
+      }
+
+      bfElementNumber =
+         wsConfig.getContainer().getParameterInteger(WorkspaceDataContainer.ACL_BF_ELEMENTS_NUMBER,
+            ACL_BF_ELEMENTS_NUMBER_DEFAULT);
+      if (bfElementNumber <= 0)
+      {
+         throw new IllegalArgumentException("Parameter " + WorkspaceDataContainer.ACL_BF_ELEMENTS_NUMBER
+            + " is invalid, can not be less then 1.");
+      }
+
       this.cache = cache;
 
       this.requestCache = new ConcurrentHashMap<Integer, DataRequest>();
@@ -394,6 +427,8 @@
    /**
     * CacheableWorkspaceDataManager constructor.
     * 
+    * @param wsConfig 
+    *          WorkspaceEntry used to fetch bloom filter parameters
     * @param dataContainer
     *          Workspace data container (persistent level)
     * @param cache
@@ -404,16 +439,18 @@
     *          the resource manager used to manage the whole tx
     * @param transactionService TransactionService         
     */
-   public CacheableWorkspaceDataManager(WorkspaceDataContainer dataContainer, WorkspaceStorageCache cache,
-      SystemDataContainerHolder systemDataContainerHolder, TransactionableResourceManager txResourceManager,
-      TransactionService transactionService)
+   public CacheableWorkspaceDataManager(WorkspaceEntry wsConfig, WorkspaceDataContainer dataContainer,
+      WorkspaceStorageCache cache, SystemDataContainerHolder systemDataContainerHolder,
+      TransactionableResourceManager txResourceManager, TransactionService transactionService)
    {
-      this(dataContainer, cache, systemDataContainerHolder, txResourceManager, transactionService, null);
+      this(wsConfig, dataContainer, cache, systemDataContainerHolder, txResourceManager, transactionService, null);
    }
 
    /**
     * CacheableWorkspaceDataManager constructor.
     * 
+    * @param wsConfig 
+    *          WorkspaceEntry used to fetch bloom filter parameters
     * @param dataContainer
     *          Workspace data container (persistent level)
     * @param cache
@@ -423,11 +460,30 @@
     * @param txResourceManager
     *          the resource manager used to manage the whole tx
     */
-   public CacheableWorkspaceDataManager(WorkspaceDataContainer dataContainer, WorkspaceStorageCache cache,
-      SystemDataContainerHolder systemDataContainerHolder, TransactionableResourceManager txResourceManager,
-      RPCService rpcService)
+   public CacheableWorkspaceDataManager(WorkspaceEntry wsConfig, WorkspaceDataContainer dataContainer,
+      WorkspaceStorageCache cache, SystemDataContainerHolder systemDataContainerHolder,
+      TransactionableResourceManager txResourceManager, RPCService rpcService)
    {
       super(dataContainer, systemDataContainerHolder, txResourceManager);
+
+      bfProbability =
+         wsConfig.getContainer().getParameterDouble(WorkspaceDataContainer.ACL_BF_FALSE_PROPBABILITY,
+            ACL_BF_FALSE_PROPBABILITY_DEFAULT);
+      if (bfProbability < 0 || bfProbability > 1)
+      {
+         throw new IllegalArgumentException("Parameter " + WorkspaceDataContainer.ACL_BF_FALSE_PROPBABILITY
+            + " is invalid, must be between 0 and 1.");
+      }
+
+      bfElementNumber =
+         wsConfig.getContainer().getParameterInteger(WorkspaceDataContainer.ACL_BF_ELEMENTS_NUMBER,
+            ACL_BF_ELEMENTS_NUMBER_DEFAULT);
+      if (bfElementNumber <= 0)
+      {
+         throw new IllegalArgumentException("Parameter " + WorkspaceDataContainer.ACL_BF_ELEMENTS_NUMBER
+            + " is invalid, can not be less then 1.");
+      }
+
       this.cache = cache;
 
       this.requestCache = new ConcurrentHashMap<Integer, DataRequest>();
@@ -452,6 +508,8 @@
    /**
     * CacheableWorkspaceDataManager constructor.
     * 
+    * @param wsConfig 
+    *          WorkspaceEntry used to fetch bloom filter parameters
     * @param dataContainer
     *          Workspace data container (persistent level)
     * @param cache
@@ -461,15 +519,18 @@
     * @param txResourceManager
     *          the resource manager used to manage the whole tx
     */
-   public CacheableWorkspaceDataManager(WorkspaceDataContainer dataContainer, WorkspaceStorageCache cache,
-      SystemDataContainerHolder systemDataContainerHolder, TransactionableResourceManager txResourceManager)
+   public CacheableWorkspaceDataManager(WorkspaceEntry wsConfig, WorkspaceDataContainer dataContainer,
+      WorkspaceStorageCache cache, SystemDataContainerHolder systemDataContainerHolder,
+      TransactionableResourceManager txResourceManager)
    {
-      this(dataContainer, cache, systemDataContainerHolder, txResourceManager, (RPCService)null);
+      this(wsConfig, dataContainer, cache, systemDataContainerHolder, txResourceManager, (RPCService)null);
    }
 
    /**
     * CacheableWorkspaceDataManager constructor.
     * 
+    * @param wsConfig 
+    *          WorkspaceEntry used to fetch bloom filter parameters
     * @param dataContainer
     *          Workspace data container (persistent level)
     * @param cache
@@ -477,10 +538,10 @@
     * @param systemDataContainerHolder
     *          System Workspace data container (persistent level)
     */
-   public CacheableWorkspaceDataManager(WorkspaceDataContainer dataContainer, WorkspaceStorageCache cache,
-      SystemDataContainerHolder systemDataContainerHolder)
+   public CacheableWorkspaceDataManager(WorkspaceEntry wsConfig, WorkspaceDataContainer dataContainer,
+      WorkspaceStorageCache cache, SystemDataContainerHolder systemDataContainerHolder)
    {
-      this(dataContainer, cache, systemDataContainerHolder, null, (RPCService)null);
+      this(wsConfig, dataContainer, cache, systemDataContainerHolder, null, (RPCService)null);
    }
 
    /**
@@ -725,8 +786,22 @@
     * {@inheritDoc}
     */
    @Override
-   public ItemData getItemData(final String identifier) throws RepositoryException
+   public ItemData getItemData(String identifier) throws RepositoryException
    {
+      return getItemData(identifier, true);
+   }
+
+   /**
+    * Do the same thing as getItemData(identifier), but ACL initialization can be specified.
+    * If doInitACL is true (default value for getItemData(identifier)) ACL will be initialized.
+    * 
+    * @param identifier
+    * @param doInitACL
+    * @return
+    * @throws RepositoryException
+    */
+   private ItemData getItemData(final String identifier, final boolean doInitACL) throws RepositoryException
+   {
       if (cache.isEnabled())
       {
          // 1. Try from cache
@@ -779,7 +854,14 @@
             public ItemData run() throws RepositoryException
             {
                ItemData item = CacheableWorkspaceDataManager.super.getItemData(identifier);
-               return item != null && item.isNode() ? initACL(null, (NodeData)item) : item;
+               if (item != null && item.isNode() && doInitACL)
+               {
+                  return initACL(null, (NodeData)item);
+               }
+               else
+               {
+                  return item;
+               }
             }
          });
       }
@@ -2070,8 +2152,8 @@
             {
                // use parent ACL
                node =
-                  new TransientNodeData(node.getQPath(), node.getIdentifier(), node.getPersistedVersion(), node
-                     .getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(),
+                  new TransientNodeData(node.getQPath(), node.getIdentifier(), node.getPersistedVersion(),
+                     node.getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(),
                      node.getParentIdentifier(), parent.getACL());
             }
             else
@@ -2082,8 +2164,8 @@
                }
                // use nearest ancestor ACL... case of get by id
                node =
-                  new TransientNodeData(node.getQPath(), node.getIdentifier(), node.getPersistedVersion(), node
-                     .getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(),
+                  new TransientNodeData(node.getQPath(), node.getIdentifier(), node.getPersistedVersion(),
+                     node.getPrimaryTypeName(), node.getMixinTypeNames(), node.getOrderNumber(),
                      node.getParentIdentifier(), getNearestACAncestorAcl(node, search));
             }
          }
@@ -2207,7 +2289,7 @@
     */
    private NodeData getACL(String identifier, ACLSearch search) throws RepositoryException
    {
-      final ItemData item = getItemData(identifier);
+      final ItemData item = getItemData(identifier, false);
       return item != null && item.isNode() ? initACL(null, (NodeData)item, search) : null;
    }
 
@@ -2277,9 +2359,8 @@
    protected boolean loadFilters(boolean cleanOnFail)
    {
       filtersEnabled.set(false);
-      // TODO: Make it configurable
-      this.filterPermissions = new BloomFilter<String>(0.1d, 1000000);
-      this.filterOwner = new BloomFilter<String>(0.1d, 1000000);
+      this.filterPermissions = new BloomFilter<String>(bfProbability, bfElementNumber);
+      this.filterOwner = new BloomFilter<String>(bfProbability, bfElementNumber);
       boolean fails = true;
       List<ACLHolder> holders = null;
       try

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java	2011-08-18 15:09:19 UTC (rev 4776)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/storage/WorkspaceDataContainer.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -60,6 +60,10 @@
 
    public final static String CHECK_SNS_NEW_CONNECTION = "check-sns-new-connection";
 
+   public final static String ACL_BF_FALSE_PROPBABILITY = "acl-bloomfilter-false-positive-probability";
+
+   public final static String ACL_BF_ELEMENTS_NUMBER = "acl-bloomfilter-elements-number";
+
    /**
     * [G.A] do we need it here or in WorkspaceDataManager better??
     * 

Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/BaseStandaloneTest.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/BaseStandaloneTest.java	2011-08-18 15:09:19 UTC (rev 4776)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/BaseStandaloneTest.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -25,14 +25,22 @@
 import org.exoplatform.services.jcr.core.CredentialsImpl;
 import org.exoplatform.services.jcr.core.ManageableRepository;
 import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
+import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.ItemType;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.PropertyData;
+import org.exoplatform.services.jcr.datamodel.QPathEntry;
 import org.exoplatform.services.jcr.impl.core.ItemImpl;
 import org.exoplatform.services.jcr.impl.core.NodeImpl;
 import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
 import org.exoplatform.services.jcr.impl.core.SessionImpl;
+import org.exoplatform.services.jcr.impl.core.itemfilters.QPathEntryFilter;
+import org.exoplatform.services.jcr.impl.dataflow.persistent.ACLHolder;
 import org.exoplatform.services.jcr.impl.dataflow.serialization.ReaderSpoolFileHolder;
 import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
 import org.exoplatform.services.jcr.impl.util.io.FileCleanerHolder;
 import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
+import org.exoplatform.services.jcr.storage.WorkspaceStorageConnection;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 
@@ -43,10 +51,12 @@
 import java.lang.ref.WeakReference;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Random;
 
+import javax.jcr.InvalidItemStateException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
@@ -509,4 +519,239 @@
          assertTrue(finded);
       }
    }
+
+   /**
+    * Test WorkspaceDataContainer.
+    * Does nothing, must be extended in tests.
+    * 
+    * @author <a href="mailto:skarpenko at exoplatform.com">Sergiy Karpenko</a>
+    * @version $Id: exo-jboss-codetemplates.xml 34360 18.08.2011 skarpenko $
+    */
+   public class TestWorkspaceDataContainer implements WorkspaceDataContainer
+   {
+      @Override
+      public String getInfo()
+      {
+         return null;
+      }
+
+      @Override
+      public String getName()
+      {
+         return null;
+      }
+
+      @Override
+      public String getUniqueName()
+      {
+         return null;
+      }
+
+      @Override
+      public String getStorageVersion()
+      {
+         return null;
+      }
+
+      @Override
+      public Calendar getCurrentTime()
+      {
+         return null;
+      }
+
+      @Override
+      public boolean isSame(WorkspaceDataContainer another)
+      {
+         return false;
+      }
+
+      @Override
+      public WorkspaceStorageConnection openConnection() throws RepositoryException
+      {
+         return null;
+      }
+
+      @Override
+      public WorkspaceStorageConnection openConnection(boolean readOnly) throws RepositoryException
+      {
+         return null;
+      }
+
+      @Override
+      public WorkspaceStorageConnection reuseConnection(WorkspaceStorageConnection original) throws RepositoryException
+      {
+         return null;
+      }
+
+      @Override
+      public boolean isCheckSNSNewConnection()
+      {
+         return false;
+      }
+   }
+
+   /**
+    * Test WorkspaceStorageConnection.
+    * Does nothing, must be extended in tests.
+    * 
+    * @author <a href="mailto:skarpenko at exoplatform.com">Sergiy Karpenko</a>
+    * @version $Id: exo-jboss-codetemplates.xml 34360 18.08.2011 skarpenko $
+    */
+   public class TestWorkspaceStorageConnection implements WorkspaceStorageConnection
+   {
+
+      @Override
+      public ItemData getItemData(NodeData parentData, QPathEntry name) throws RepositoryException,
+         IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public ItemData getItemData(NodeData parentData, QPathEntry name, ItemType itemType) throws RepositoryException,
+         IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public ItemData getItemData(String identifier) throws RepositoryException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public List<NodeData> getChildNodesData(NodeData parent) throws RepositoryException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public List<NodeData> getChildNodesData(NodeData parent, List<QPathEntryFilter> pattern)
+         throws RepositoryException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public int getChildNodesCount(NodeData parent) throws RepositoryException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public int getLastOrderNumber(NodeData parent) throws RepositoryException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public List<PropertyData> getChildPropertiesData(NodeData parent) throws RepositoryException,
+         IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public List<PropertyData> getChildPropertiesData(NodeData parent, List<QPathEntryFilter> pattern)
+         throws RepositoryException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public List<PropertyData> listChildPropertiesData(NodeData parent) throws RepositoryException,
+         IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public List<PropertyData> getReferencesData(String nodeIdentifier) throws RepositoryException,
+         IllegalStateException, UnsupportedOperationException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void add(NodeData data) throws RepositoryException, UnsupportedOperationException,
+         InvalidItemStateException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void add(PropertyData data) throws RepositoryException, UnsupportedOperationException,
+         InvalidItemStateException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void update(NodeData data) throws RepositoryException, UnsupportedOperationException,
+         InvalidItemStateException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void update(PropertyData data) throws RepositoryException, UnsupportedOperationException,
+         InvalidItemStateException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void rename(NodeData data) throws RepositoryException, UnsupportedOperationException,
+         InvalidItemStateException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void delete(NodeData data) throws RepositoryException, UnsupportedOperationException,
+         InvalidItemStateException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void delete(PropertyData data) throws RepositoryException, UnsupportedOperationException,
+         InvalidItemStateException, IllegalStateException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void commit() throws IllegalStateException, RepositoryException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void rollback() throws IllegalStateException, RepositoryException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public void close() throws IllegalStateException, RepositoryException
+      {
+      }
+
+      @Override
+      public boolean isOpened()
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+      @Override
+      public List<ACLHolder> getACLHolders() throws RepositoryException, IllegalStateException,
+         UnsupportedOperationException
+      {
+         throw new UnsupportedOperationException("TestWorkspaceStorageConnection: operation is unsupported.");
+      }
+
+   }
+
 }

Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorksapceDataManagerBloomFilter.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorksapceDataManagerBloomFilter.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorksapceDataManagerBloomFilter.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -0,0 +1,301 @@
+/*
+ * 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.dataflow.persistent;
+
+import org.exoplatform.commons.utils.QName;
+import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.access.AccessControlEntry;
+import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
+import org.exoplatform.services.jcr.dataflow.persistent.PersistedNodeData;
+import org.exoplatform.services.jcr.dataflow.persistent.WorkspaceStorageCache;
+import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.QPath;
+import org.exoplatform.services.jcr.datamodel.QPathEntry;
+import org.exoplatform.services.jcr.impl.storage.SystemDataContainerHolder;
+import org.exoplatform.services.jcr.storage.WorkspaceStorageConnection;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * @author <a href="mailto:skarpenko at exoplatform.com">Sergiy Karpenko</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 18.08.2011 skarpenko $
+ *
+ */
+public class TestCacheableWorksapceDataManagerBloomFilter extends JcrImplBaseTest
+{
+   private MyWorkspaceDataContainer dataContainer;
+
+   private CacheableWorkspaceDataManager mgr;
+
+   public void setUp() throws Exception
+   {
+      super.setUp();
+      dataContainer = new MyWorkspaceDataContainer();
+      WorkspaceStorageCache cache = new MyWorkspaceStorageCache();
+      WorkspaceContainerFacade wsc = repository.getWorkspaceContainer("ws");
+      WorkspaceEntry wconf = (WorkspaceEntry)wsc.getComponent(WorkspaceEntry.class);
+      mgr =
+         new CacheableWorkspaceDataManager(wconf, dataContainer, cache, new SystemDataContainerHolder(dataContainer));
+   }
+
+   protected void tearDown() throws Exception
+   {
+      dataContainer.clear();
+      dataContainer = null;
+      mgr.clear();
+      mgr = null;
+      super.tearDown();
+   }
+
+   public void testGetItemWithACL() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("2", path = new QPath(new QPathEntry[]{new QPathEntry("", "2", 1, "2")}),
+         "3", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(1, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   public void testGetItemWithoutACL() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("3", path = new QPath(new QPathEntry[]{new QPathEntry("", "3", 1, "3")}),
+         "4", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("2", path = QPath.makeChildPath(path, new QName("", "2"), 1, "2"), "3",
+         1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, null));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(2, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   public void testGetItemParentWithSingleOwner() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("4", path = new QPath(new QPathEntry[]{new QPathEntry("", "4", 1, "4")}),
+         "5", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("3", path = QPath.makeChildPath(path, new QName("", "3"), 1, "3"), "4",
+         1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("2", path = QPath.makeChildPath(path, new QName("", "2"), 1, "2"), "3",
+         1, 1, null, null, new AccessControlList("owner", null)));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, null));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(3, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   public void testGetItemParentWithSinglePermission() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("4", path = new QPath(new QPathEntry[]{new QPathEntry("", "4", 1, "4")}),
+         "5", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("3", path = QPath.makeChildPath(path, new QName("", "3"), 1, "3"), "4",
+         1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("2", path = QPath.makeChildPath(path, new QName("", "2"), 1, "2"), "3",
+         1, 1, null, null, new AccessControlList(null, new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, null));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(3, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   public void testGetItemParentsWithCrossEmptyACL() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("4", path = new QPath(new QPathEntry[]{new QPathEntry("", "4", 1, "4")}),
+         "5", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("3", path = QPath.makeChildPath(path, new QName("", "3"), 1, "3"), "4",
+         1, 1, null, null, new AccessControlList(null, new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("2", path = QPath.makeChildPath(path, new QName("", "2"), 1, "2"), "3",
+         1, 1, null, null, new AccessControlList("owner", null)));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, null));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(3, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   public void testGetItemParentsWithCrossEmptyACL2() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("4", path = new QPath(new QPathEntry[]{new QPathEntry("", "4", 1, "4")}),
+         "5", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("3", path = QPath.makeChildPath(path, new QName("", "3"), 1, "3"), "4",
+         1, 1, null, null, new AccessControlList("owner", null)));
+      dataContainer.add(new PersistedNodeData("2", path = QPath.makeChildPath(path, new QName("", "2"), 1, "2"), "3",
+         1, 1, null, null, new AccessControlList(null, new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, null));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(3, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   public void testGetItemParentsWithSameOwnerlessACL() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("4", path = new QPath(new QPathEntry[]{new QPathEntry("", "4", 1, "4")}),
+         "5", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("3", path = QPath.makeChildPath(path, new QName("", "3"), 1, "3"), "4",
+         1, 1, null, null, new AccessControlList("owner", null)));
+      dataContainer.add(new PersistedNodeData("2", path = QPath.makeChildPath(path, new QName("", "2"), 1, "2"), "3",
+         1, 1, null, null, new AccessControlList(null, new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, new AccessControlList(null, new ArrayList<AccessControlEntry>())));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(2, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   public void testGetItemParentsWithSamePermissionlessACL() throws Exception
+   {
+      QPath path;
+      dataContainer.add(new PersistedNodeData("4", path = new QPath(new QPathEntry[]{new QPathEntry("", "4", 1, "4")}),
+         "5", 1, 1, null, null, new AccessControlList("owner", new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("3", path = QPath.makeChildPath(path, new QName("", "3"), 1, "3"), "4",
+         1, 1, null, null, new AccessControlList(null, new ArrayList<AccessControlEntry>())));
+      dataContainer.add(new PersistedNodeData("2", path = QPath.makeChildPath(path, new QName("", "2"), 1, "2"), "3",
+         1, 1, null, null, new AccessControlList("owner", null)));
+      dataContainer.add(new PersistedNodeData("1", path = QPath.makeChildPath(path, new QName("", "1"), 1, "1"), "2",
+         1, 1, null, null, new AccessControlList("owner", null)));
+      mgr.reloadFilters();
+      mgr.getItemData("1");
+      assertEquals(2, dataContainer.getTotalCalls());
+      dataContainer.clear();
+   }
+
+   class MyWorkspaceDataContainer extends TestWorkspaceDataContainer
+   {
+
+      protected Map<String, NodeData> nodesById = new HashMap<String, NodeData>();
+
+      protected List<ACLHolder> holders = new ArrayList<ACLHolder>();
+
+      private int totalCalls;
+
+      protected synchronized void incrementCalls()
+      {
+         totalCalls++;
+      }
+
+      public WorkspaceStorageConnection openConnection() throws RepositoryException
+      {
+         return new MyWorkspaceStorageConnection(this);
+      }
+
+      public WorkspaceStorageConnection openConnection(boolean readOnly) throws RepositoryException
+      {
+         return openConnection();
+      }
+
+      public void clear()
+      {
+         nodesById.clear();
+         holders.clear();
+         totalCalls = 0;
+      }
+
+      public void add(NodeData node)
+      {
+         nodesById.put(node.getIdentifier(), node);
+         AccessControlList acl = node.getACL();
+         if (acl != null)
+         {
+            ACLHolder holder = new ACLHolder(node.getIdentifier());
+            holder.setOwner(acl.hasOwner());
+            holder.setPermissions(acl.hasPermissions());
+            holders.add(holder);
+         }
+      }
+
+      /**
+       * @return the totalCalls
+       */
+      public int getTotalCalls()
+      {
+         return totalCalls;
+      }
+
+   }
+
+   class MyWorkspaceStorageConnection extends TestWorkspaceStorageConnection
+   {
+      private final MyWorkspaceDataContainer container;
+
+      public MyWorkspaceStorageConnection(MyWorkspaceDataContainer myWorkspaceDataContainer)
+      {
+         container = myWorkspaceDataContainer;
+      }
+
+      /**
+       * @see org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager#getItemData(java.lang.String)
+       */
+      @Override
+      public ItemData getItemData(String identifier) throws RepositoryException
+      {
+         container.incrementCalls();
+         return container.nodesById.get(identifier);
+      }
+
+      /**
+       * @see org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager#getACLHolders()
+       */
+      @Override
+      public List<ACLHolder> getACLHolders() throws RepositoryException
+      {
+         return container.holders;
+      }
+   }
+
+   class MyWorkspaceStorageCache extends LinkedWorkspaceStorageCacheImpl
+   {
+      public MyWorkspaceStorageCache() throws RepositoryConfigurationException
+      {
+         super("", false, 0, 0, 0, 0, false, false, 0, false);
+      }
+
+      public boolean isEnabled()
+      {
+         return false;
+      }
+   }
+
+}

Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorkspaceDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorkspaceDataManager.java	2011-08-18 15:09:19 UTC (rev 4776)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestCacheableWorkspaceDataManager.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -16,8 +16,9 @@
  */
 package org.exoplatform.services.jcr.impl.dataflow.persistent;
 
-import junit.framework.TestCase;
-
+import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
 import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
 import org.exoplatform.services.jcr.dataflow.persistent.PersistedNodeData;
 import org.exoplatform.services.jcr.dataflow.persistent.PersistedPropertyData;
@@ -53,7 +54,7 @@
  *          nicolas.filotto at exoplatform.com
  * 29 mars 2010  
  */
-public class TestCacheableWorkspaceDataManager extends TestCase
+public class TestCacheableWorkspaceDataManager extends JcrImplBaseTest
 {
 
    private static final int READER = 100;
@@ -67,13 +68,16 @@
    private MyWorkspaceStorageConnection con;
 
    @Override
-   protected void setUp() throws Exception
+   public void setUp() throws Exception
    {
       super.setUp();
       this.con = new MyWorkspaceStorageConnection();
       this.wdc = new MyWorkspaceDataContainer(con);
+      WorkspaceContainerFacade wsc = repository.getWorkspaceContainer("ws");
+      WorkspaceEntry wconf = (WorkspaceEntry)wsc.getComponent(WorkspaceEntry.class);
       this.cwdm =
-         new CacheableWorkspaceDataManager(wdc, new MyWorkspaceStorageCache(), new SystemDataContainerHolder(wdc));
+         new CacheableWorkspaceDataManager(wconf, wdc, new MyWorkspaceStorageCache(),
+            new SystemDataContainerHolder(wdc));
    }
 
    @Override

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-08-18 15:09:19 UTC (rev 4776)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/TestWorkspaceStorageCacheInClusterMode.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -21,6 +21,8 @@
 import org.exoplatform.commons.utils.QName;
 import org.exoplatform.services.jcr.JcrImplBaseTest;
 import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
 import org.exoplatform.services.jcr.dataflow.ItemState;
 import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
 import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
@@ -72,10 +74,12 @@
       {
          MyWorkspaceStorageConnection con = new MyWorkspaceStorageConnection();
          WorkspaceDataContainer wdc = new MyWorkspaceDataContainer(con);
+         WorkspaceContainerFacade wsc = repository.getWorkspaceContainer("ws");
+         WorkspaceEntry wconf = (WorkspaceEntry)wsc.getComponent(WorkspaceEntry.class);
          CacheableWorkspaceDataManager cwdmNode1 =
-            new CacheableWorkspaceDataManager(wdc, cache1 = getCacheImpl(), new SystemDataContainerHolder(wdc));
+            new CacheableWorkspaceDataManager(wconf, wdc, cache1 = getCacheImpl(), new SystemDataContainerHolder(wdc));
          CacheableWorkspaceDataManager cwdmNode2 =
-            new CacheableWorkspaceDataManager(wdc, cache2 = getCacheImpl(), new SystemDataContainerHolder(wdc));
+            new CacheableWorkspaceDataManager(wconf, wdc, cache2 = getCacheImpl(), new SystemDataContainerHolder(wdc));
          NodeData parentNode = new PersistedNodeData("parent-id", QPath.makeChildPath(Constants.ROOT_PATH, new InternalQName(null, "parent-node")), Constants.ROOT_UUID, 1, 0,
             Constants.NT_UNSTRUCTURED, new InternalQName[0], null);
          // Test getChildNodesData
@@ -329,10 +333,12 @@
          // testConsistency
          con = new MyWorkspaceStorageConnection(true);
          wdc = new MyWorkspaceDataContainer(con);
+         wsc = repository.getWorkspaceContainer("ws");
+         wconf = (WorkspaceEntry)wsc.getComponent(WorkspaceEntry.class);
          cwdmNode1 =
-            new CacheableWorkspaceDataManager(wdc, cache1, new SystemDataContainerHolder(wdc));
+            new CacheableWorkspaceDataManager(wconf, wdc, cache1, new SystemDataContainerHolder(wdc));
          cwdmNode2 =
-            new CacheableWorkspaceDataManager(wdc, cache2, new SystemDataContainerHolder(wdc));
+            new CacheableWorkspaceDataManager(wconf, 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

Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestJBossCacheWorkspaceStorageCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestJBossCacheWorkspaceStorageCache.java	2011-08-18 15:09:19 UTC (rev 4776)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/TestJBossCacheWorkspaceStorageCache.java	2011-08-18 15:15:47 UTC (rev 4777)
@@ -22,6 +22,7 @@
 import org.exoplatform.services.jcr.config.CacheEntry;
 import org.exoplatform.services.jcr.config.SimpleParameterEntry;
 import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
 import org.exoplatform.services.jcr.dataflow.ItemState;
 import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
 import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
@@ -37,7 +38,6 @@
 import org.exoplatform.services.jcr.impl.dataflow.persistent.ACLHolder;
 import org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager;
 import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspaceStorageCacheBaseCase;
-import org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.JBossCacheWorkspaceStorageCache;
 import org.exoplatform.services.jcr.impl.storage.SystemDataContainerHolder;
 import org.exoplatform.services.jcr.impl.storage.WorkspaceDataContainerBase;
 import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
@@ -84,8 +84,10 @@
    {
       MyWorkspaceStorageConnection con = new MyWorkspaceStorageConnection();
       WorkspaceDataContainer wdc = new MyWorkspaceDataContainer(con);
+      WorkspaceContainerFacade wsc = repository.getWorkspaceContainer("ws");
+      WorkspaceEntry wconf = (WorkspaceEntry)wsc.getComponent(WorkspaceEntry.class);
       final CacheableWorkspaceDataManager cwdm =
-         new CacheableWorkspaceDataManager(wdc, getCacheImpl(), new SystemDataContainerHolder(wdc));
+         new CacheableWorkspaceDataManager(wconf, wdc, getCacheImpl(), new SystemDataContainerHolder(wdc));
       String idNode = "foo1";
       executeConcurrentReadNWrite(con, cwdm, Mode.READ_FIRST, idNode);
       assertNotNull(cwdm.getItemData(idNode));



More information about the exo-jcr-commits mailing list