[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