exo-jcr SVN: r4761 - in jcr/branches/1.12.x: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query and 4 other directories.
by do-not-reply@jboss.org
Author: trang_vu
Date: 2011-08-17 00:54:32 -0400 (Wed, 17 Aug 2011)
New Revision: 4761
Added:
jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/readme.txt
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java
jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/JCR-1634.patch
Log:
JCR-1634: Find a way to have a name for MBeans of JBossCaches used by the JCR
Fix description
* Set MBeans name of JBossCache explicitly.
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java 2011-08-17 04:02:33 UTC (rev 4760)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java 2011-08-17 04:54:32 UTC (rev 4761)
@@ -16,6 +16,7 @@
*/
package org.exoplatform.services.jcr.impl.core.lock.jbosscache;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.management.annotations.Managed;
import org.exoplatform.management.annotations.ManagedDescription;
@@ -63,6 +64,7 @@
import org.jboss.cache.Node;
import org.jboss.cache.config.CacheLoaderConfig;
import org.jboss.cache.config.CacheLoaderConfig.IndividualCacheLoaderConfig;
+import org.jboss.cache.jmx.JmxRegistrationManager;
import org.jboss.cache.loader.CacheLoader;
import org.jboss.cache.loader.CacheLoaderManager;
import org.jboss.cache.lock.TimeoutException;
@@ -168,9 +170,12 @@
*/
private Map<String, CacheableSessionLockManager> sessionLockManagers;
+ private final JmxRegistrationManager jmxManager;
+
/**
* Constructor.
*
+ * @param ctx The container context
* @param dataManager - workspace persistent data manager
* @param config - workspace entry
* @param context InitialContextInitializer, needed to reload context after JBoss cache creation
@@ -178,32 +183,33 @@
* the transaction service
* @throws RepositoryConfigurationException
*/
- public CacheableLockManagerImpl(WorkspacePersistentDataManager dataManager, WorkspaceEntry config,
+ public CacheableLockManagerImpl(ExoContainerContext ctx, WorkspacePersistentDataManager dataManager, WorkspaceEntry config,
InitialContextInitializer context, TransactionService transactionService, ConfigurationManager cfm,
LockRemoverHolder lockRemoverHolder) throws RepositoryConfigurationException, RepositoryException
{
- this(dataManager, config, context, transactionService.getTransactionManager(), cfm, lockRemoverHolder);
+ this(ctx, dataManager, config, context, transactionService.getTransactionManager(), cfm, lockRemoverHolder);
}
/**
* Constructor.
*
+ * @param ctx The container context
* @param dataManager - workspace persistent data manager
* @param config - workspace entry
* @param context InitialContextInitializer, needed to reload context after JBoss cache creation
* @throws RepositoryConfigurationException
*/
- public CacheableLockManagerImpl(WorkspacePersistentDataManager dataManager, WorkspaceEntry config,
+ public CacheableLockManagerImpl(ExoContainerContext ctx, WorkspacePersistentDataManager dataManager, WorkspaceEntry config,
InitialContextInitializer context, ConfigurationManager cfm, LockRemoverHolder lockRemoverHolder)
throws RepositoryConfigurationException, RepositoryException
{
- this(dataManager, config, context, (TransactionManager)null, cfm, lockRemoverHolder);
-
+ this(ctx, dataManager, config, context, (TransactionManager)null, cfm, lockRemoverHolder);
}
/**
* Constructor.
*
+ * @param ctx The container context
* @param dataManager - workspace persistent data manager
* @param config - workspace entry
* @param context InitialContextInitializer, needed to reload context after JBoss cache creation
@@ -211,7 +217,7 @@
* the transaction manager
* @throws RepositoryConfigurationException
*/
- public CacheableLockManagerImpl(WorkspacePersistentDataManager dataManager, WorkspaceEntry config,
+ public CacheableLockManagerImpl(ExoContainerContext ctx, WorkspacePersistentDataManager dataManager, WorkspaceEntry config,
InitialContextInitializer context, TransactionManager transactionManager, ConfigurationManager cfm,
LockRemoverHolder lockRemoverHolder) throws RepositoryConfigurationException, RepositoryException
{
@@ -260,6 +266,11 @@
// Add the cache loader needed to prevent TimeoutException
addCacheLoader();
cache.start();
+ this.jmxManager = ExoJBossCacheFactory.getJmxRegistrationManager(ctx, cache, "LOCK_CACHE");
+ if (jmxManager != null)
+ {
+ jmxManager.registerAllMBeans();
+ }
createStructuredNode(lockRoot);
@@ -786,6 +797,10 @@
sessionLockManagers.clear();
cache.stop();
+ if (jmxManager != null)
+ {
+ jmxManager.unregisterAllMBeans();
+ }
}
/**
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2011-08-17 04:02:33 UTC (rev 4760)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2011-08-17 04:54:32 UTC (rev 4761)
@@ -18,9 +18,10 @@
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.WildcardQuery;
-import org.apache.lucene.search.BooleanClause.Occur;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.document.DocumentReaderService;
import org.exoplatform.services.jcr.config.QueryHandlerEntry;
@@ -134,10 +135,14 @@
protected LuceneVirtualTableResolver virtualTableResolver;
protected IndexerChangesFilter changesFilter;
+
+ private final ExoContainerContext ctx;
/**
* Creates a new <code>SearchManager</code>.
*
+ * @param ctx
+ * The eXo Container context in which the SearchManager is registered
* @param config
* the search configuration.
* @param nsReg
@@ -159,12 +164,12 @@
* @throws RepositoryConfigurationException
*/
- public SearchManager(QueryHandlerEntry config, NamespaceRegistryImpl nsReg, NodeTypeDataManager ntReg,
+ public SearchManager(ExoContainerContext ctx, QueryHandlerEntry config, NamespaceRegistryImpl nsReg, NodeTypeDataManager ntReg,
WorkspacePersistentDataManager itemMgr, SystemSearchManagerHolder parentSearchManager,
DocumentReaderService extractor, ConfigurationManager cfm, final RepositoryIndexSearcherHolder indexSearcherHolder)
throws RepositoryException, RepositoryConfigurationException
{
-
+ this.ctx = ctx;
this.extractor = extractor;
indexSearcherHolder.addIndexSearcher(this);
this.config = config;
@@ -625,6 +630,14 @@
}
/**
+ * @return the ctx
+ */
+ public ExoContainerContext getExoContainerContext()
+ {
+ return ctx;
+ }
+
+ /**
* Initialize changes filter.
* @throws RepositoryException
* @throws RepositoryConfigurationException
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java 2011-08-17 04:02:33 UTC (rev 4760)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java 2011-08-17 04:54:32 UTC (rev 4761)
@@ -16,6 +16,7 @@
*/
package org.exoplatform.services.jcr.impl.core.query;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.document.DocumentReaderService;
import org.exoplatform.services.jcr.config.QueryHandlerEntry;
@@ -56,11 +57,11 @@
public static final String INDEX_DIR_SUFFIX = "system";
- public SystemSearchManager(QueryHandlerEntry config, NamespaceRegistryImpl nsReg, NodeTypeDataManager ntReg,
+ public SystemSearchManager(ExoContainerContext ctx, QueryHandlerEntry config, NamespaceRegistryImpl nsReg, NodeTypeDataManager ntReg,
WorkspacePersistentDataManager itemMgr, DocumentReaderService service, ConfigurationManager cfm,
RepositoryIndexSearcherHolder indexSearcherHolder) throws RepositoryException, RepositoryConfigurationException
{
- super(config, nsReg, ntReg, itemMgr, null, service, cfm, indexSearcherHolder);
+ super(ctx, config, nsReg, ntReg, itemMgr, null, service, cfm, indexSearcherHolder);
}
@Override
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java 2011-08-17 04:02:33 UTC (rev 4760)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java 2011-08-17 04:54:32 UTC (rev 4761)
@@ -38,6 +38,7 @@
import org.jboss.cache.config.CacheLoaderConfig;
import org.jboss.cache.config.CacheLoaderConfig.IndividualCacheLoaderConfig;
import org.jboss.cache.config.CacheLoaderConfig.IndividualCacheLoaderConfig.SingletonStoreConfig;
+import org.jboss.cache.jmx.JmxRegistrationManager;
import java.io.IOException;
import java.io.Serializable;
@@ -60,6 +61,8 @@
private final Cache<Serializable, Object> cache;
+ private final JmxRegistrationManager jmxManager;
+
public static final String LISTWRAPPER = "$lists".intern();
/**
@@ -117,6 +120,11 @@
this.cache.getConfiguration().setCacheLoaderConfig(cacheLoaderConfig);
this.cache.create();
this.cache.start();
+ this.jmxManager = ExoJBossCacheFactory.getJmxRegistrationManager(searchManager.getExoContainerContext(), cache, "INDEX_CACHE");
+ if (jmxManager != null)
+ {
+ jmxManager.registerAllMBeans();
+ }
// start will invoke cache listener which will notify handler that mode is changed
IndexerIoMode ioMode =
((CacheSPI)cache).getRPCManager().isCoordinator() ? IndexerIoMode.READ_WRITE : IndexerIoMode.READ_ONLY;
@@ -178,4 +186,23 @@
log.warn("Exception occure when errorLog writed. Error log is not complete. " + ioe, ioe);
}
}
+
+ /**
+ * @see java.lang.Object#finalize()
+ */
+ @Override
+ protected void finalize() throws Throwable
+ {
+ try
+ {
+ if (jmxManager != null)
+ {
+ jmxManager.unregisterAllMBeans();
+ }
+ }
+ finally
+ {
+ super.finalize();
+ }
+ }
}
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java 2011-08-17 04:02:33 UTC (rev 4760)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java 2011-08-17 04:54:32 UTC (rev 4761)
@@ -18,6 +18,7 @@
*/
package org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
@@ -49,6 +50,8 @@
import org.jboss.cache.Node;
import org.jboss.cache.config.EvictionRegionConfig;
import org.jboss.cache.eviction.ExpirationAlgorithmConfig;
+import org.jboss.cache.jmx.JmxRegistrationManager;
+import org.picocontainer.Startable;
import java.io.IOException;
import java.io.Serializable;
@@ -98,7 +101,7 @@
* @author <a href="mailto:peter.nedonosko@exoplatform.com">Peter Nedonosko</a>
* @version $Id: JBossCacheWorkspaceStorageCache.java 13869 2008-05-05 08:40:10Z pnedonosko $
*/
-public class JBossCacheWorkspaceStorageCache implements WorkspaceStorageCache
+public class JBossCacheWorkspaceStorageCache implements WorkspaceStorageCache, Startable
{
private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.core.JBossCacheWorkspaceStorageCache");
@@ -143,6 +146,8 @@
protected final Fqn<String> childPropsList;
+ private JmxRegistrationManager jmxManager;
+
/**
* Node order comparator for getChildNodes().
*/
@@ -266,12 +271,13 @@
/**
* Cache constructor with eXo TransactionService support.
*
+ * @param ctx The container context
* @param wsConfig WorkspaceEntry workspace config
* @param transactionService TransactionService external transaction service
* @throws RepositoryException if error of initialization
* @throws RepositoryConfigurationException if error of configuration
*/
- public JBossCacheWorkspaceStorageCache(WorkspaceEntry wsConfig, TransactionService transactionService,
+ public JBossCacheWorkspaceStorageCache(ExoContainerContext ctx, WorkspaceEntry wsConfig, TransactionService transactionService,
ConfigurationManager cfm) throws RepositoryException, RepositoryConfigurationException
{
if (wsConfig.getCache() == null)
@@ -317,9 +323,17 @@
LOG.info("Using BufferedJBossCache compatible with Expiration algorithm.");
}
+ if (ctx != null)
+ {
+ this.jmxManager = ExoJBossCacheFactory.getJmxRegistrationManager(ctx, parentCache, "JCR_CACHE");
+ if (jmxManager != null)
+ {
+ jmxManager.registerAllMBeans();
+ }
+ }
// if expiration is used, set appropriate factory with with timeout set via configuration (or default one 15minutes)
this.cache =
- new BufferedJBossCache(factory.createCache(wsConfig.getCache()), useExpiration, wsConfig.getCache()
+ new BufferedJBossCache(parentCache, useExpiration, wsConfig.getCache()
.getParameterTime(JBOSSCACHE_EXPIRATION, JBOSSCACHE_EXPIRATION_DEFAULT));
this.itemsRoot = Fqn.fromElements(ITEMS);
@@ -341,19 +355,52 @@
}
/**
+ * Cache constructor with eXo TransactionService support.
+ *
+ * @param wsConfig WorkspaceEntry workspace config
+ * @param transactionService TransactionService external transaction service
+ * @throws RepositoryException if error of initialization
+ * @throws RepositoryConfigurationException if error of configuration
+ */
+ public JBossCacheWorkspaceStorageCache(WorkspaceEntry wsConfig, TransactionService transactionService,
+ ConfigurationManager cfm) throws RepositoryException, RepositoryConfigurationException
+ {
+ this(null, wsConfig, transactionService, cfm);
+ }
+
+ /**
* Cache constructor with JBossCache JTA transaction support.
*
+ * @param ctx The container context
* @param wsConfig WorkspaceEntry workspace config
* @throws RepositoryException if error of initialization
* @throws RepositoryConfigurationException if error of configuration
*/
- public JBossCacheWorkspaceStorageCache(WorkspaceEntry wsConfig, ConfigurationManager cfm)
+ public JBossCacheWorkspaceStorageCache(ExoContainerContext ctx, WorkspaceEntry wsConfig, ConfigurationManager cfm)
throws RepositoryException, RepositoryConfigurationException
{
- this(wsConfig, null, cfm);
+ this(ctx, wsConfig, null, cfm);
}
/**
+ * {@inheritDoc}
+ */
+ public void start()
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void stop()
+ {
+ if (jmxManager != null)
+ {
+ jmxManager.unregisterAllMBeans();
+ }
+ }
+
+ /**
* Checks if node with give FQN not exists and creates resident node.
* @param fqn
*/
Modified: jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java 2011-08-17 04:02:33 UTC (rev 4760)
+++ jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java 2011-08-17 04:54:32 UTC (rev 4761)
@@ -18,6 +18,7 @@
*/
package org.exoplatform.services.jcr.jbosscache;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.jcr.config.MappedParametrizedObjectEntry;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
@@ -27,11 +28,13 @@
import org.jboss.cache.Cache;
import org.jboss.cache.CacheFactory;
import org.jboss.cache.DefaultCacheFactory;
+import org.jboss.cache.jmx.JmxRegistrationManager;
import org.jgroups.JChannelFactory;
import java.io.IOException;
import java.io.InputStream;
+import javax.management.ObjectName;
import javax.transaction.TransactionManager;
/**
@@ -181,4 +184,29 @@
}
return cache;
}
+
+ /**
+ * Gives the {@link JmxRegistrationManager} instance corresponding to the given context
+ */
+ public static JmxRegistrationManager getJmxRegistrationManager(ExoContainerContext ctx, Cache<?, ?> parentCache,
+ String cacheType)
+ {
+ try
+ {
+ ObjectName containerObjectName = ctx.getContainer().getScopingObjectName();
+ final String objectNameBase = containerObjectName.toString() + ",cache-type=" + cacheType;
+ return new JmxRegistrationManager(ctx.getContainer().getMBeanServer(), parentCache, objectNameBase)
+ {
+ public String getObjectName(String resourceName)
+ {
+ return objectNameBase + JMX_RESOURCE_KEY + resourceName;
+ }
+ };
+ }
+ catch (Exception e)
+ {
+ log.error("Could not create the JMX Manager", e);
+ }
+ return null;
+ }
}
Modified: jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/JCR-1634.patch
===================================================================
--- jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/JCR-1634.patch 2011-08-17 04:02:33 UTC (rev 4760)
+++ jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/JCR-1634.patch 2011-08-17 04:54:32 UTC (rev 4761)
@@ -1,6 +1,6 @@
Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java
===================================================================
---- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java (revision 4445)
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java (revision 4760)
+++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java (working copy)
@@ -16,6 +16,7 @@
*/
@@ -104,7 +104,7 @@
/**
Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
---- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java (revision 4445)
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java (revision 4760)
+++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java (working copy)
@@ -18,9 +18,10 @@
@@ -165,7 +165,7 @@
* @throws RepositoryConfigurationException
Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java
===================================================================
---- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java (revision 4445)
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java (revision 4760)
+++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java (working copy)
@@ -16,6 +16,7 @@
*/
@@ -191,7 +191,7 @@
@Override
Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java
===================================================================
---- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java (revision 4445)
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java (revision 4760)
+++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/JBossCacheIndexChangesFilter.java (working copy)
@@ -38,6 +38,7 @@
import org.jboss.cache.config.CacheLoaderConfig;
@@ -248,7 +248,7 @@
}
Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
===================================================================
---- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java (revision 4445)
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java (revision 4760)
+++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java (working copy)
@@ -18,6 +18,7 @@
*/
@@ -258,7 +258,7 @@
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
-@@ -46,6 +47,8 @@
+@@ -49,6 +50,8 @@
import org.jboss.cache.Node;
import org.jboss.cache.config.EvictionRegionConfig;
import org.jboss.cache.eviction.ExpirationAlgorithmConfig;
@@ -267,7 +267,7 @@
import java.io.IOException;
import java.io.Serializable;
-@@ -95,7 +98,7 @@
+@@ -98,7 +101,7 @@
* @author <a href="mailto:peter.nedonosko@exoplatform.com">Peter Nedonosko</a>
* @version $Id: JBossCacheWorkspaceStorageCache.java 13869 2008-05-05 08:40:10Z pnedonosko $
*/
@@ -276,7 +276,7 @@
{
private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.core.JBossCacheWorkspaceStorageCache");
-@@ -140,6 +143,8 @@
+@@ -143,6 +146,8 @@
protected final Fqn<String> childPropsList;
@@ -285,7 +285,7 @@
/**
* Node order comparator for getChildNodes().
*/
-@@ -263,12 +268,13 @@
+@@ -266,12 +271,13 @@
/**
* Cache constructor with eXo TransactionService support.
*
@@ -300,7 +300,7 @@
ConfigurationManager cfm) throws RepositoryException, RepositoryConfigurationException
{
if (wsConfig.getCache() == null)
-@@ -314,9 +320,17 @@
+@@ -317,9 +323,17 @@
LOG.info("Using BufferedJBossCache compatible with Expiration algorithm.");
}
@@ -319,7 +319,7 @@
.getParameterTime(JBOSSCACHE_EXPIRATION, JBOSSCACHE_EXPIRATION_DEFAULT));
this.itemsRoot = Fqn.fromElements(ITEMS);
-@@ -338,19 +352,52 @@
+@@ -341,19 +355,52 @@
}
/**
@@ -376,7 +376,7 @@
*/
Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java
===================================================================
---- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java (revision 4445)
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java (revision 4760)
+++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/jbosscache/ExoJBossCacheFactory.java (working copy)
@@ -18,6 +18,7 @@
*/
Added: jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/readme.txt
===================================================================
--- jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/readme.txt (rev 0)
+++ jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1634/readme.txt 2011-08-17 04:54:32 UTC (rev 4761)
@@ -0,0 +1,69 @@
+Summary
+
+ * Status: Find a way to have a name for MBeans of JBossCaches used by the JCR
+ * CCP Issue: CCP-1032, Product Jira Issue: JCR-1634.
+ * Complexity: medium
+
+The Proposal
+Problem description
+
+What is the problem to fix?
+
+ * Find a way to have a name for MBeans of JBossCaches used by the JCR
+
+Fix description
+
+How is the problem fixed?
+
+ * Set MBeans name of JBossCache explicitly
+
+Patch file: JCR-1634.patch
+
+Tests to perform
+
+Reproduction test
+PROBLEM:
+
+ * When monitoring the JCR with a JMX Tool (like VisualVM)
+ * The JBossCaches used by the JCR have generated names, and no informations about what they are managing.
+
+EXPECTED:
+
+ * A name stable between two start up
+ * An indication of the content managed by the cache
+
+Tests performed at DevLevel
+* Functional testing jcr-core project
+
+Tests performed at QA/Support Level
+*
+Documentation changes
+
+Documentation changes:
+* No
+Configuration changes
+
+Configuration changes:
+* No
+
+Will previous configuration continue to work?
+* Yes
+Risks and impacts
+
+Can this bug fix have any side effects on current client projects?
+
+ * No
+
+Is there a performance risk/cost?
+* No
+Validation (PM/Support/QA)
+
+PM Comment
+* Patch approved.
+
+Support Comment
+*
+
+QA Feedbacks
+*
+
12 years, 9 months
exo-jcr SVN: r4760 - in kernel/branches/2.2.x: exo.kernel.container/src/main/java/org/exoplatform/container/management and 2 other directories.
by do-not-reply@jboss.org
Author: trang_vu
Date: 2011-08-17 00:02:33 -0400 (Wed, 17 Aug 2011)
New Revision: 4760
Added:
kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainerScopingObjects.java
kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/readme.txt
Modified:
kernel/branches/2.2.x/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java
kernel/branches/2.2.x/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java
Log:
KER-175: Find a way to have a name for MBeans of JBossCaches used by the JCR
Fix description
* Set MBeans names of JBossCaches explicitly.
Modified: kernel/branches/2.2.x/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java
===================================================================
--- kernel/branches/2.2.x/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java 2011-08-16 15:41:35 UTC (rev 4759)
+++ kernel/branches/2.2.x/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java 2011-08-17 04:02:33 UTC (rev 4760)
@@ -18,6 +18,8 @@
*/
package org.exoplatform.services.cache.impl.jboss;
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.container.xml.InitParams;
import org.exoplatform.container.xml.ValueParam;
@@ -32,16 +34,21 @@
import org.jboss.cache.CacheFactory;
import org.jboss.cache.DefaultCacheFactory;
import org.jboss.cache.config.Configuration;
+import org.jboss.cache.config.Configuration.CacheMode;
import org.jboss.cache.config.EvictionConfig;
import org.jboss.cache.config.EvictionRegionConfig;
-import org.jboss.cache.config.Configuration.CacheMode;
+import org.jboss.cache.jmx.JmxRegistrationManager;
+import org.picocontainer.Startable;
import java.io.Serializable;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+import javax.management.ObjectName;
+
/**
* This class is the JBoss Cache implementation of the {@link org.exoplatform.services.cache.ExoCacheFactory}
* Created by The eXo Platform SAS
@@ -49,7 +56,7 @@
* exo(a)exoplatform.com
* 17 juil. 2009
*/
-public class ExoCacheFactoryImpl implements ExoCacheFactory
+public class ExoCacheFactoryImpl implements ExoCacheFactory, Startable
{
/**
@@ -90,6 +97,11 @@
private final Map<String, String> mappingCacheNameConfig = new HashMap<String, String>();
/**
+ * The list of all the JMX Managers registered
+ */
+ private final List<JmxRegistrationManager> jmxManagers = new CopyOnWriteArrayList<JmxRegistrationManager>();
+
+ /**
* The default creator
*/
private final ExoCacheCreator defaultCreator = new FIFOExoCacheCreator();
@@ -149,6 +161,13 @@
cache.create();
// Start the cache
cache.start();
+ // Create JMX Manager for this cache instance
+ JmxRegistrationManager jmxManager = getJmxRegistrationManager(cache, region);
+ if (jmxManager != null)
+ {
+ jmxManager.registerAllMBeans();
+ jmxManagers.add(jmxManager);
+ }
}
catch (Exception e)
{
@@ -156,8 +175,34 @@
}
return eXoCache;
}
-
+
/**
+ * Gives the {@link JmxRegistrationManager} instance corresponding to the given context
+ */
+ private static JmxRegistrationManager getJmxRegistrationManager(Cache<?, ?> parentCache,
+ String cacheName)
+ {
+ try
+ {
+ ExoContainer container = ExoContainerContext.getCurrentContainer();
+ ObjectName containerObjectName = container.getScopingObjectName();
+ final String objectNameBase = (containerObjectName != null ? containerObjectName.toString() + "," : "exo:")+ "cache-name=" + cacheName;
+ return new JmxRegistrationManager(container.getMBeanServer(), parentCache, objectNameBase)
+ {
+ public String getObjectName(String resourceName)
+ {
+ return objectNameBase + JMX_RESOURCE_KEY + resourceName;
+ }
+ };
+ }
+ catch (Exception e)
+ {
+ LOG.error("Could not create the JMX Manager", e);
+ }
+ return null;
+ }
+
+ /**
* Add a list of creators to register
* @param plugin the plugin that contains the creators
*/
@@ -245,4 +290,22 @@
config.setClusterName(clusterName + " " + region);
}
}
+
+ /**
+ * @see org.picocontainer.Startable#start()
+ */
+ public void start()
+ {
+ }
+
+ /**
+ * @see org.picocontainer.Startable#stop()
+ */
+ public void stop()
+ {
+ for (JmxRegistrationManager jmxManager : jmxManagers)
+ {
+ jmxManager.unregisterAllMBeans();
+ }
+ }
}
Modified: kernel/branches/2.2.x/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
===================================================================
--- kernel/branches/2.2.x/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java 2011-08-16 15:41:35 UTC (rev 4759)
+++ kernel/branches/2.2.x/exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java 2011-08-17 04:02:33 UTC (rev 4760)
@@ -25,8 +25,12 @@
import org.exoplatform.management.annotations.Managed;
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.annotations.ManagedName;
+import org.exoplatform.management.jmx.impl.JMX;
import org.exoplatform.management.jmx.impl.JMXManagementProvider;
+import org.exoplatform.management.jmx.impl.MBeanScopingData;
import org.exoplatform.management.spi.ManagementProvider;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
import org.picocontainer.ComponentAdapter;
import org.picocontainer.PicoContainer;
import org.picocontainer.PicoException;
@@ -37,9 +41,13 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
import javax.management.MBeanServer;
+import javax.management.ObjectName;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
@@ -48,6 +56,11 @@
public class ManageableContainer extends CachingContainer
{
+ /**
+ * The logger
+ */
+ private static final Log LOG = ExoLogger.getLogger("org.exoplatform.container.management.ManageableContainer");
+
private static MBeanServer findMBeanServer()
{
J2EEServerInfo serverenv_ = new J2EEServerInfo();
@@ -63,6 +76,9 @@
/** . */
private MBeanServer server;
+ private volatile boolean objectNameSet;
+ private ObjectName objectName;
+
/** . */
private final Set<ManagementProvider> providers;
@@ -163,6 +179,46 @@
return super.registerComponent(componentAdapter);
}
+ /**
+ * Gives the ObjectName of the container build from the scoping data
+ * @return
+ */
+ public ObjectName getScopingObjectName()
+ {
+ if (!objectNameSet)
+ {
+ synchronized (this)
+ {
+ if (!objectNameSet)
+ {
+ Map<String, String> props = new LinkedHashMap<String, String>();
+
+ // Merge scoping properties
+ List<MBeanScopingData> list = managementContext.getScopingData(MBeanScopingData.class);
+ if (list != null && !list.isEmpty())
+ {
+ // Read in revert order because wee received list of parents in upward order
+ for (int i = list.size(); i > 0; i--)
+ {
+ MBeanScopingData scopingData = list.get(i - 1);
+ props.putAll(scopingData);
+ }
+ try
+ {
+ this.objectName = JMX.createObjectName("exo", props);
+ }
+ catch (Exception e)
+ {
+ LOG.error("Could not create the object name", e);
+ }
+ }
+ this.objectNameSet = true;
+ }
+ }
+ }
+ return objectName;
+ }
+
public ComponentAdapter registerComponentInstance(Object componentKey, Object componentInstance)
throws PicoRegistrationException
{
Modified: kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java
===================================================================
--- kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java 2011-08-16 15:41:35 UTC (rev 4759)
+++ kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java 2011-08-17 04:02:33 UTC (rev 4760)
@@ -31,6 +31,7 @@
*/
public class TestPortalContainer extends AbstractTestContainer
{
+
public void testInitValues()
{
createRootContainer("portal-container-config-with-settings.xml");
Added: kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainerScopingObjects.java
===================================================================
--- kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainerScopingObjects.java (rev 0)
+++ kernel/branches/2.2.x/exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainerScopingObjects.java 2011-08-17 04:02:33 UTC (rev 4760)
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2003-2010 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.container;
+
+import org.exoplatform.container.jmx.AbstractTestContainer;
+import org.exoplatform.container.support.ContainerBuilder;
+
+import java.net.URL;
+
+/**
+ * Created by The eXo Platform SAS
+ * Author : Nicolas Filotto
+ * nicolas.filotto(a)exoplatform.com
+ * 18 fホvr. 2010
+ */
+public class TestPortalContainerScopingObjects extends AbstractTestContainer
+{
+
+ public void testHasScopingObjectName()
+ {
+ URL rootURL = getClass().getResource("empty-config.xml");
+ URL portalURL = getClass().getResource("empty-config.xml");
+ assertNotNull(rootURL);
+ assertNotNull(portalURL);
+ //
+ new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).build();
+ assertNull(RootContainer.getInstance().getScopingObjectName());
+ assertNotNull(PortalContainer.getInstance().getScopingObjectName());
+ }
+}
Added: kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/readme.txt
===================================================================
--- kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/readme.txt (rev 0)
+++ kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/readme.txt 2011-08-17 04:02:33 UTC (rev 4760)
@@ -0,0 +1,72 @@
+Summary
+
+ * Status: Find a way to have a name for MBeans of JBossCaches used by the JCR
+ * CCP Issue: CCP-1032, Product Jira Issue: KER-175.
+ * Complexity: Medium
+
+The Proposal
+Problem description
+
+What is the problem to fix?
+
+ * Find a way to have a name for MBeans of JBossCaches used by the JCR
+
+Fix description
+
+How is the problem fixed?
+
+ * Set MBeans names of JBossCaches explicitly
+
+Patch file: KER-175.patch
+
+Tests to perform
+
+Reproduction test
+PROBLEM:
+
+ * When monitoring the JCR with a JMX Tool (like VisualVM)
+ * The JBossCaches used by the JCR have generated names, and no informations about what they are managing.
+
+EXPECTED:
+
+ * A name stable between two start up
+ * An indication of the content managed by the cache
+
+Tests performed at DevLevel
+* Functional testing jcr projcects
+
+Tests performed at QA/Support Level
+*
+
+Documentation changes
+
+Documentation changes:
+* No
+
+Configuration changes
+
+Configuration changes:
+* No
+
+Will previous configuration continue to work?
+* Yes
+
+Risks and impacts
+
+Can this bug fix have any side effects on current client projects?
+
+ * No
+
+Is there a performance risk/cost?
+* No
+
+Validation (PM/Support/QA)
+
+PM Comment
+* Patch approved.
+
+Support Comment
+*
+
+QA Feedbacks
+*
12 years, 9 months
exo-jcr SVN: r4759 - kernel/branches/2.2.x/patch/2.2.10-GA/KER-175.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-08-16 11:41:35 -0400 (Tue, 16 Aug 2011)
New Revision: 4759
Modified:
kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch
Log:
KER-175: patch fixed
Modified: kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch
===================================================================
--- kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch 2011-08-16 15:15:46 UTC (rev 4758)
+++ kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch 2011-08-16 15:41:35 UTC (rev 4759)
@@ -1,50 +1,3 @@
-Index: patch/2.2.10-GA/KER-175/KER-175.patch
-===================================================================
---- patch/2.2.10-GA/KER-175/KER-175.patch (revision 4757)
-+++ patch/2.2.10-GA/KER-175/KER-175.patch (working copy)
-@@ -1,6 +1,6 @@
- Index: exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java
- ===================================================================
----- exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (revision 4445)
-+--- exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (revision 4757)
- +++ exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (working copy)
- @@ -18,6 +18,8 @@
- */
-@@ -130,31 +130,19 @@
- }
- Index: exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java
- ===================================================================
----- exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (revision 4445)
-+--- exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (revision 4757)
- +++ exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (working copy)
--@@ -31,6 +31,19 @@
-+@@ -31,6 +31,7 @@
- */
- public class TestPortalContainer extends AbstractTestContainer
- {
--+
--+ public void testHasScopingObjectName()
--+ {
--+ URL rootURL = getClass().getResource("empty-config.xml");
--+ URL portalURL = getClass().getResource("empty-config.xml");
--+ assertNotNull(rootURL);
--+ assertNotNull(portalURL);
--+ //
--+ new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).build();
--+ assertNull(RootContainer.getInstance().getScopingObjectName());
--+ assertNotNull(PortalContainer.getInstance().getScopingObjectName());
--+ }
- +
- public void testInitValues()
- {
- createRootContainer("portal-container-config-with-settings.xml");
- Index: exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
- ===================================================================
----- exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (revision 4445)
-+--- exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (revision 4757)
- +++ exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (working copy)
- @@ -25,8 +25,12 @@
- import org.exoplatform.management.annotations.Managed;
Index: exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java
===================================================================
--- exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (revision 4757)
12 years, 9 months
exo-jcr SVN: r4758 - kernel/branches/2.2.x/patch/2.2.10-GA/KER-175.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-08-16 11:15:46 -0400 (Tue, 16 Aug 2011)
New Revision: 4758
Modified:
kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch
Log:
KER-175: patch updated
Modified: kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch
===================================================================
--- kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch 2011-08-16 10:31:43 UTC (rev 4757)
+++ kernel/branches/2.2.x/patch/2.2.10-GA/KER-175/KER-175.patch 2011-08-16 15:15:46 UTC (rev 4758)
@@ -1,6 +1,53 @@
+Index: patch/2.2.10-GA/KER-175/KER-175.patch
+===================================================================
+--- patch/2.2.10-GA/KER-175/KER-175.patch (revision 4757)
++++ patch/2.2.10-GA/KER-175/KER-175.patch (working copy)
+@@ -1,6 +1,6 @@
+ Index: exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java
+ ===================================================================
+---- exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (revision 4445)
++--- exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (revision 4757)
+ +++ exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (working copy)
+ @@ -18,6 +18,8 @@
+ */
+@@ -130,31 +130,19 @@
+ }
+ Index: exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java
+ ===================================================================
+---- exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (revision 4445)
++--- exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (revision 4757)
+ +++ exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (working copy)
+-@@ -31,6 +31,19 @@
++@@ -31,6 +31,7 @@
+ */
+ public class TestPortalContainer extends AbstractTestContainer
+ {
+-+
+-+ public void testHasScopingObjectName()
+-+ {
+-+ URL rootURL = getClass().getResource("empty-config.xml");
+-+ URL portalURL = getClass().getResource("empty-config.xml");
+-+ assertNotNull(rootURL);
+-+ assertNotNull(portalURL);
+-+ //
+-+ new ContainerBuilder().withRoot(rootURL).withPortal(portalURL).build();
+-+ assertNull(RootContainer.getInstance().getScopingObjectName());
+-+ assertNotNull(PortalContainer.getInstance().getScopingObjectName());
+-+ }
+ +
+ public void testInitValues()
+ {
+ createRootContainer("portal-container-config-with-settings.xml");
+ Index: exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
+ ===================================================================
+---- exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (revision 4445)
++--- exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (revision 4757)
+ +++ exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (working copy)
+ @@ -25,8 +25,12 @@
+ import org.exoplatform.management.annotations.Managed;
Index: exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java
===================================================================
---- exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (revision 4445)
+--- exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (revision 4757)
+++ exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/ExoCacheFactoryImpl.java (working copy)
@@ -18,6 +18,8 @@
*/
@@ -128,14 +175,42 @@
+ }
+ }
}
-Index: exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java
+Index: exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainerScopingObjects.java
===================================================================
---- exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (revision 4445)
-+++ exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (working copy)
-@@ -31,6 +31,19 @@
- */
- public class TestPortalContainer extends AbstractTestContainer
- {
+--- exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainerScopingObjects.java (revision 0)
++++ exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainerScopingObjects.java (revision 0)
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (C) 2003-2010 eXo Platform SAS.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Affero General Public License
++ * as published by the Free Software Foundation; either version 3
++ * of the License, or (at your option) any later version.
++ *
++ * This program 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 General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, see<http://www.gnu.org/licenses/>.
++ */
++package org.exoplatform.container;
++
++import org.exoplatform.container.jmx.AbstractTestContainer;
++import org.exoplatform.container.support.ContainerBuilder;
++
++import java.net.URL;
++
++/**
++ * Created by The eXo Platform SAS
++ * Author : Nicolas Filotto
++ * nicolas.filotto(a)exoplatform.com
++ * 18 fホvr. 2010
++ */
++public class TestPortalContainerScopingObjects extends AbstractTestContainer
++{
+
+ public void testHasScopingObjectName()
+ {
@@ -148,13 +223,22 @@
+ assertNull(RootContainer.getInstance().getScopingObjectName());
+ assertNotNull(PortalContainer.getInstance().getScopingObjectName());
+ }
++}
+Index: exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java
+===================================================================
+--- exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (revision 4757)
++++ exo.kernel.container/src/test/java/org/exoplatform/container/TestPortalContainer.java (working copy)
+@@ -31,6 +31,7 @@
+ */
+ public class TestPortalContainer extends AbstractTestContainer
+ {
+
public void testInitValues()
{
createRootContainer("portal-container-config-with-settings.xml");
Index: exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java
===================================================================
---- exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (revision 4445)
+--- exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (revision 4757)
+++ exo.kernel.container/src/main/java/org/exoplatform/container/management/ManageableContainer.java (working copy)
@@ -25,8 +25,12 @@
import org.exoplatform.management.annotations.Managed;
12 years, 9 months
exo-jcr SVN: r4757 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-08-16 06:31:43 -0400 (Tue, 16 Aug 2011)
New Revision: 4757
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java
Log:
EXOJCR-1437 : Fixed directory naming for lucene spell checker.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java 2011-08-16 09:32:55 UTC (rev 4756)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/spell/LuceneSpellChecker.java 2011-08-16 10:31:43 UTC (rev 4757)
@@ -57,7 +57,7 @@
* Logger instance for this class.
*/
private static final Log log = ExoLogger.getLogger("exo.jcr.component.core.LuceneSpellChecker");
-
+
public static final class FiveSecondsRefreshInterval extends LuceneSpellChecker
{
public FiveSecondsRefreshInterval()
@@ -253,13 +253,12 @@
InternalSpellChecker(final SearchIndex handler, float minDistance, boolean morePopular) throws IOException
{
this.handler = handler;
- final String path = handler.getContext().getIndexDirectory() + File.separatorChar + "spellchecker";
spellIndexDirectory = null;
SecurityHelper.doPrivilegedIOExceptionAction(new PrivilegedExceptionAction<Object>()
{
public Object run() throws Exception
{
- spellIndexDirectory = handler.getDirectoryManager().getDirectory(path);
+ spellIndexDirectory = handler.getDirectoryManager().getDirectory("spellchecker");
if (IndexReader.indexExists(spellIndexDirectory))
{
12 years, 9 months
exo-jcr SVN: r4756 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-08-16 05:32:55 -0400 (Tue, 16 Aug 2011)
New Revision: 4756
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
Log:
EXOJCR-1481 : Conditional check added.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2011-08-15 15:06:52 UTC (rev 4755)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/MultiIndex.java 2011-08-16 09:32:55 UTC (rev 4756)
@@ -3370,18 +3370,26 @@
if (isOnline)
{
log.info("Setting index back online");
- offlineIndex.commit(true);
- online = true;
- // cleaning stale indexes
- for (PersistentIndex staleIndex : staleIndexes)
+ if (modeHandler.getMode() == IndexerIoMode.READ_WRITE)
{
- deleteIndex(staleIndex);
+ offlineIndex.commit(true);
+ online = true;
+ // cleaning stale indexes
+ for (PersistentIndex staleIndex : staleIndexes)
+ {
+ deleteIndex(staleIndex);
+ }
+ //invoking offline index
+ invokeOfflineIndex();
+ staleIndexes.clear();
+ doInitIndexMerger();
+ merger.start();
}
- //invoking offline index
- invokeOfflineIndex();
- staleIndexes.clear();
- doInitIndexMerger();
- merger.start();
+ else
+ {
+ online = true;
+ staleIndexes.clear();
+ }
}
// switching to OFFLINE
else
12 years, 9 months
exo-jcr SVN: r4755 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/dataflow/persistent and 4 other directories.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-08-15 11:06:52 -0400 (Mon, 15 Aug 2011)
New Revision: 4755
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java
Log:
EXOJCR-267 : contains multiple fixes:
1) fixed critical bug, when result set was not properly processed, causing completely wrong nodeDatas and result list. CQ result set was processed as non-CQ. Fixed.
2) last node retrieved from DB is not added to result child list cause it can be incomplete. It is added only if current page is the last one;
3) updated logic with min page size.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -302,9 +302,9 @@
if (primaryTypeName == null)
{
throw new ConstraintViolationException("Can not define node type for " + name.getAsString()
- + ". No default primary type defined for child nodes in \""
- + nodeData().getPrimaryTypeName().getAsString()
- + "\" node type and no explicit primary type given to create a child node.");
+ + ". No default primary type defined for child nodes in \""
+ + nodeData().getPrimaryTypeName().getAsString()
+ + "\" node type and no explicit primary type given to create a child node.");
}
}
// try to make new node
@@ -460,7 +460,7 @@
{
checkValid();
-
+
if (!session.getAccessManager().hasPermission(getACL(),
new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
{
@@ -544,7 +544,7 @@
{
throw new LockException("Node " + getPath() + " is locked ");
}
-
+
if (checkedOut())
{
return;
@@ -911,8 +911,8 @@
NodeData parent = (NodeData)dataManager.getItemData(getParentIdentifier());
this.definition =
- nodeTypesHolder.getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(),
- parent.getPrimaryTypeName(), parent.getMixinTypeNames());
+ nodeTypesHolder.getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(), parent
+ .getPrimaryTypeName(), parent.getMixinTypeNames());
if (definition == null)
{
@@ -1295,8 +1295,8 @@
else
{
childs =
- new ArrayList<PropertyData>(dataManager.getChildPropertiesData(nodeData(),
- filter.getQPathEntryFilters()));
+ new ArrayList<PropertyData>(dataManager.getChildPropertiesData(nodeData(), filter
+ .getQPathEntryFilters()));
Collections.sort(childs, new PropertiesDataOrderComparator<PropertyData>());
}
@@ -1631,18 +1631,15 @@
new InternalQName[]{Constants.NT_BASE}, null, false);
return;
}
-
+
if (parent == null)
{
parent = (NodeData)dataManager.getItemData(getParentIdentifier());
}
this.definition =
- session
- .getWorkspace()
- .getNodeTypesHolder()
- .getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(), parent.getPrimaryTypeName(),
- parent.getMixinTypeNames());
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(getInternalName(),
+ nodeData().getPrimaryTypeName(), parent.getPrimaryTypeName(), parent.getMixinTypeNames());
if (definition == null)
{
@@ -2563,11 +2560,8 @@
}
// Check if node is not protected
NodeDefinitionData childNodeDefinition =
- session
- .getWorkspace()
- .getNodeTypesHolder()
- .getChildNodeDefinition(name, primaryTypeName, nodeData().getPrimaryTypeName(),
- nodeData().getMixinTypeNames());
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(name, primaryTypeName,
+ nodeData().getPrimaryTypeName(), nodeData().getMixinTypeNames());
if (childNodeDefinition == null)
{
throw new ConstraintViolationException("Can't find child node definition for "
@@ -3045,11 +3039,8 @@
if (def == null)
{
def =
- session
- .getWorkspace()
- .getNodeTypesHolder()
- .getChildNodeDefinition(nameToAdd, primaryTypeName, parentNode.getPrimaryTypeName(),
- parentNode.getMixinTypeNames());
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(nameToAdd, primaryTypeName,
+ parentNode.getPrimaryTypeName(), parentNode.getMixinTypeNames());
}
boolean allowSns = def.isAllowsSameNameSiblings();
@@ -3493,7 +3484,7 @@
private int fromOrderNum = 0;
private boolean hasNext = true;
-
+
private int pos = 0;
private LazyNodeIterator lazyNodeItetator = new LazyNodeIterator(new ArrayList<NodeData>());
@@ -3631,16 +3622,13 @@
LOG.error("There are no more elements in iterator", e);
throw new NoSuchElementException(e.toString());
}
-
+
Collections.sort(storedNodes, new NodeDataOrderComparator());
int size = storedNodes.size();
- fromOrderNum =
- size == 0 ? fromOrderNum + limit : Math.max(fromOrderNum + limit, storedNodes.get(size - 1)
- .getOrderNumber() + 1);
+ fromOrderNum = size == 0 ? fromOrderNum + limit : storedNodes.get(size - 1).getOrderNumber() + 1;
-
// skip some nodes
if (size != 0)
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -98,6 +98,9 @@
if (config.getContainer().getParameterInteger(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_DEFAULT) < WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN)
{
+ // set proper value
+ config.getContainer().putParameterValue(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
+ Integer.toString(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN));
LOG.warn("Value for \"lazy-node-iterator-page-size\" is too small. Using allowed minimum page size : "
+ WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN + ".");
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -257,10 +257,6 @@
this.lazyNodeIteatorPageSize =
wsConfig.getContainer().getParameterInteger(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_DEFAULT);
- if (this.lazyNodeIteatorPageSize < WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN)
- {
- this.lazyNodeIteatorPageSize = WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN;
- }
}
/**
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -109,7 +109,7 @@
* Read-only status.
*/
protected boolean readOnly = false;
-
+
/**
* The resource manager
*/
@@ -136,7 +136,7 @@
{
this.log = log;
}
-
+
protected ItemStateChangesLog getChangesLog()
{
return log;
@@ -180,7 +180,7 @@
{
this(dataContainer, systemDataContainerHolder, null);
}
-
+
/**
* WorkspacePersistentDataManager constructor.
*
@@ -290,7 +290,7 @@
{
// The rollback is done normally
persister.rollback();
- }
+ }
}
/**
@@ -310,29 +310,28 @@
// fail later in the tx
txResourceManager.addListener(new TransactionableResourceManagerListener()
{
-
+
public void onCommit(boolean onePhase) throws Exception
{
persister.commit();
}
-
+
public void onAfterCompletion(int status) throws Exception
{
}
-
+
public void onAbort() throws Exception
{
persister.rollback();
}
});
- }
+ }
}
- private enum ConnectionMode
- {
+ private enum ConnectionMode {
NORMAL, PARTIALLY_MANAGED
}
-
+
class ChangesLogPersister
{
@@ -629,11 +628,11 @@
con.close();
}
}
-
+
/**
* {@inheritDoc}
*/
- public boolean getChildNodesDataByPage(final NodeData nodeData, int fromOrderNum, int limit, List<NodeData> childs)
+ public boolean getChildNodesDataByPage(final NodeData nodeData, int fromOrderNum, int limit, List<NodeData> childNodes)
throws RepositoryException
{
final WorkspaceStorageConnection con = dataContainer.openConnection();
@@ -641,8 +640,7 @@
{
try
{
- childs.addAll(((JDBCStorageConnection)con).getChildNodesDataByPage(nodeData, fromOrderNum, limit));
- return childs.size() == limit;
+ return ((JDBCStorageConnection)con).getChildNodesDataByPage(nodeData, fromOrderNum, limit, childNodes);
}
finally
{
@@ -689,7 +687,7 @@
con.close();
}
}
-
+
/**
* {@inheritDoc}
*/
@@ -725,8 +723,8 @@
/**
* {@inheritDoc}
*/
- public List<PropertyData> getChildPropertiesData(final NodeData nodeData, final List<QPathEntryFilter> itemDataFilters)
- throws RepositoryException
+ public List<PropertyData> getChildPropertiesData(final NodeData nodeData,
+ final List<QPathEntryFilter> itemDataFilters) throws RepositoryException
{
final WorkspaceStorageConnection con = dataContainer.openConnection();
try
@@ -1050,8 +1048,7 @@
/**
* {@inheritDoc}
*/
- public ItemData getItemData(final NodeData parentData, final QPathEntry name)
- throws RepositoryException
+ public ItemData getItemData(final NodeData parentData, final QPathEntry name) throws RepositoryException
{
return getItemData(parentData, name, ItemType.UNKNOWN);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -73,6 +73,7 @@
import javax.jcr.InvalidItemStateException;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
/**
* Created by The eXo Platform SAS.
@@ -859,9 +860,11 @@
// update type
if (updatePropertyByIdentifier(data.getPersistedVersion(), data.getType(), cid) <= 0)
+ {
throw new JCRInvalidItemStateException("(update) Property not found " + data.getQPath().getAsString() + " "
+ data.getIdentifier() + ". Probably was deleted by another session ", data.getIdentifier(),
ItemState.UPDATED);
+ }
// update reference
try
@@ -893,13 +896,17 @@
catch (IOException e)
{
if (LOG.isDebugEnabled())
+ {
LOG.error("Property update. IO error: " + e, e);
+ }
throw new RepositoryException("Error of Property Value update " + e, e);
}
catch (SQLException e)
{
if (LOG.isDebugEnabled())
+ {
LOG.error("Property update. Database error: " + e, e);
+ }
exceptionHandler.handleUpdateException(e, data);
}
}
@@ -1045,7 +1052,9 @@
{
List<PropertyData> children = new ArrayList<PropertyData>();
while (prop.next())
+ {
children.add((PropertyData)itemData(parent.getQPath(), prop, I_CLASS_PROPERTY, null));
+ }
return children;
}
@@ -1092,8 +1101,8 @@
* @throws RepositoryException
* @throws IllegalStateException
*/
- public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int offset, int limit) throws RepositoryException,
- IllegalStateException
+ public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int offset, int limit)
+ throws RepositoryException, IllegalStateException
{
List<NodeDataIndexing> result = new ArrayList<NodeDataIndexing>();
@@ -1172,43 +1181,11 @@
* @throws RepositoryException
* @throws IllegalStateException
*/
- public List<NodeData> getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit) throws RepositoryException,
- IllegalStateException
+ public boolean getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit, List<NodeData> childNodes)
+ throws RepositoryException, IllegalStateException
{
- checkIfOpened();
- try
- {
- ResultSet node = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()), fromOrderNum, limit);
- try
- {
- List<NodeData> childrens = new ArrayList<NodeData>();
- while (node.next())
- {
- childrens.add((NodeData)itemData(parent.getQPath(), node, I_CLASS_NODE, parent.getACL()));
- }
-
- return childrens;
- }
- finally
- {
- try
- {
- node.close();
- }
- catch (SQLException e)
- {
- LOG.error("Can't close the ResultSet: " + e);
- }
- }
- }
- catch (SQLException e)
- {
- throw new RepositoryException(e);
- }
- catch (IOException e)
- {
- throw new RepositoryException(e);
- }
+ // not supported by non-CQ deprecated JDBC container
+ throw new UnsupportedRepositoryOperationException();
}
/**
@@ -1224,7 +1201,9 @@
{
List<PropertyData> children = new ArrayList<PropertyData>();
while (prop.next())
+ {
children.add(propertyData(parent.getQPath(), prop));
+ }
return children;
}
@@ -1342,8 +1321,8 @@
if (valueRecord.next())
{
String storageId = valueRecord.getString(COLUMN_VSTORAGE_DESC);
- return valueRecord.wasNull() ? readValueData(cid, orderNumb, persistedVersion,
- valueRecord.getBinaryStream(COLUMN_VDATA)) : readValueData(propertyId, orderNumb, storageId);
+ return valueRecord.wasNull() ? readValueData(cid, orderNumb, persistedVersion, valueRecord
+ .getBinaryStream(COLUMN_VDATA)) : readValueData(propertyId, orderNumb, storageId);
}
return null;
@@ -1516,7 +1495,9 @@
try
{
if (!parent.next())
+ {
throw new InvalidItemStateException("Parent not found, uuid: " + getIdentifier(caid));
+ }
QPathEntry qpe =
new QPathEntry(InternalQName.parse(parent.getString(COLUMN_NAME)), parent.getInt(COLUMN_INDEX));
@@ -1608,12 +1589,18 @@
{
MixinInfo naMixins = readMixins(caid);
if (naMixins.hasPrivilegeable())
+ {
return readACLPermisions(caid);
+ }
if (naMixins.parentId == null)
+ {
caid = findParentId(caid);
+ }
else
+ {
caid = naMixins.parentId;
+ }
}
throw new IllegalACLException("Can not find permissions for a node with id " + getIdentifier(cpid));
@@ -1625,9 +1612,13 @@
try
{
if (pidrs.next())
+ {
return pidrs.getString(COLUMN_PARENTID);
+ }
else
+ {
throw new RepositoryException("Item not found id: " + getIdentifier(cid));
+ }
}
finally
{
@@ -1666,12 +1657,18 @@
{
MixinInfo naMixins = readMixins(caid);
if (naMixins.hasOwneable())
+ {
return readACLOwner(caid);
+ }
if (naMixins.parentId == null)
+ {
caid = findParentId(caid);
+ }
else
+ {
caid = naMixins.parentId;
+ }
}
throw new IllegalACLException("Can not find owner for a node with id " + getIdentifier(cpid));
@@ -1707,19 +1704,27 @@
{
naOwner = readACLOwner(caid);
if (naPermissions != null)
+ {
break;
+ }
}
if (naPermissions == null && naMixins.hasPrivilegeable())
{
naPermissions = readACLPermisions(caid);
if (naOwner != null)
+ {
break;
+ }
}
if (naMixins.parentId == null)
+ {
caid = findParentId(caid);
+ }
else
+ {
caid = naMixins.parentId;
+ }
}
if (naOwner != null && naPermissions != null)
@@ -1733,8 +1738,10 @@
return new AccessControlList();
}
else
+ {
throw new IllegalACLException("ACL is not found for node with id " + getIdentifier(cpid)
+ " or for its ancestors. But repository is ACL enabled.");
+ }
}
/**
@@ -1787,7 +1794,9 @@
// parent = findItemByIdentifier(caid);
if (qrpath.size() <= 0)
+ {
throw new InvalidItemStateException("Parent not found, uuid: " + getIdentifier(cpid));
+ }
}
finally
@@ -1805,7 +1814,9 @@
}
if (cstmt != null)
+ {
cstmt.close();
+ }
}
QPathEntry[] qentries = new QPathEntry[qrpath.size()];
@@ -1989,7 +2000,9 @@
return mns;
}
else
+ {
return new InternalQName[0];
+ }
}
/**
@@ -2050,9 +2063,13 @@
mts.add(mxn);
if (!privilegeable && Constants.EXO_PRIVILEGEABLE.equals(mxn))
+ {
privilegeable = true;
+ }
else if (!owneable && Constants.EXO_OWNEABLE.equals(mxn))
+ {
owneable = true;
+ }
} // else, if SQL NULL - skip it
}
while (mtrs.next());
@@ -2103,8 +2120,10 @@
return naPermissions;
}
else
+ {
throw new IllegalACLException("Property exo:permissions is not found for node with id: "
+ getIdentifier(cid));
+ }
}
finally
{
@@ -2136,9 +2155,13 @@
try
{
if (exoOwner.next())
+ {
return new String(exoOwner.getBytes(COLUMN_VDATA));
+ }
else
+ {
throw new IllegalACLException("Property exo:owner is not found for node with id: " + getIdentifier(cid));
+ }
}
finally
{
@@ -2215,8 +2238,10 @@
{
if (!ptProp.next())
+ {
throw new PrimaryTypeNotFoundException("FATAL ERROR primary type record not found. Node "
+ qpath.getAsString() + ", id " + cid + ", container " + this.containerName, null);
+ }
byte[] data = ptProp.getBytes(COLUMN_VDATA);
InternalQName ptName = InternalQName.parse(new String((data != null ? data : new byte[]{})));
@@ -2239,8 +2264,8 @@
{
// use permissions from existed parent
acl =
- new AccessControlList(readACLOwner(cid), parentACL.hasPermissions()
- ? parentACL.getPermissionEntries() : null);
+ new AccessControlList(readACLOwner(cid), parentACL.hasPermissions() ? parentACL
+ .getPermissionEntries() : null);
}
else
{
@@ -2272,14 +2297,18 @@
else
{
if (parentACL != null)
+ {
// construct ACL from existed parent ACL
acl =
- new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions()
- ? parentACL.getPermissionEntries() : null);
+ new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions() ? parentACL
+ .getPermissionEntries() : null);
+ }
else
+ {
// have to search nearest ancestor owner and permissions in ACL manager
// acl = traverseACL(cpid);
acl = null;
+ }
}
return new PersistedNodeData(getIdentifier(cid), qpath, getIdentifier(parentCid), cversion, cnordernumb,
@@ -2449,8 +2478,8 @@
final int orderNum = valueRecords.getInt(COLUMN_VORDERNUM);
final String storageId = valueRecords.getString(COLUMN_VSTORAGE_DESC);
ValueData vdata =
- valueRecords.wasNull() ? readValueData(cid, orderNum, cversion,
- valueRecords.getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
+ valueRecords.wasNull() ? readValueData(cid, orderNum, cversion, valueRecords
+ .getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
data.add(vdata);
}
}
@@ -2531,6 +2560,7 @@
{
// stream from database
if (content != null)
+ {
while ((read = content.read(spoolBuffer)) >= 0)
{
if (out != null)
@@ -2566,6 +2596,7 @@
len += read;
}
}
+ }
}
finally
{
@@ -2747,8 +2778,7 @@
// build property data
PropertyData pdata =
- new PersistedPropertyData(identifier, qpath, tempNode.cid, prop.version, prop.type, prop.multi,
- valueData);
+ new PersistedPropertyData(identifier, qpath, tempNode.cid, prop.version, prop.type, prop.multi, valueData);
childProps.put(propName, pdata);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -322,6 +322,85 @@
* {@inheritDoc}
*/
@Override
+ public boolean getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit, List<NodeData> childNodes)
+ throws RepositoryException, IllegalStateException
+ {
+ checkIfOpened();
+ ResultSet resultSet = null;
+ try
+ {
+ // query will return nodes and properties in same result set
+ // last node can be incomplete, so reading one more ahead, to be sure returning
+ // at least "limit" nodes.
+ int rowsLimit = (limit + 1) * 4;
+ resultSet = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()), fromOrderNum, rowsLimit);
+ TempNodeData data = null;
+ int resultSetSize = 0;
+ while (resultSet.next())
+ {
+ resultSetSize++;
+ if (data == null)
+ {
+ data = new TempNodeData(resultSet);
+ }
+ else if (!resultSet.getString(COLUMN_ID).equals(data.cid))
+ {
+ NodeData nodeData = loadNodeFromTemporaryNodeData(data, parent.getQPath(), parent.getACL());
+ childNodes.add(nodeData);
+ data = new TempNodeData(resultSet);
+ }
+ Map<String, SortedSet<TempPropertyData>> properties = data.properties;
+ String key = resultSet.getString("PROP_NAME");
+ SortedSet<TempPropertyData> values = properties.get(key);
+ if (values == null)
+ {
+ values = new TreeSet<TempPropertyData>();
+ properties.put(key, values);
+ }
+ values.add(new TempPropertyData(resultSet));
+ }
+ // last node can be incomplete, so removed
+ boolean hasNext = resultSetSize == rowsLimit;
+ if (!hasNext)
+ {
+ // the last one node
+ if (data != null)
+ {
+ NodeData nodeData = loadNodeFromTemporaryNodeData(data, parent.getQPath(), parent.getACL());
+ childNodes.add(nodeData);
+ }
+ }
+
+ return hasNext;
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ catch (IOException e)
+ {
+ throw new RepositoryException(e);
+ }
+ finally
+ {
+ if (resultSet != null)
+ {
+ try
+ {
+ resultSet.close();
+ }
+ catch (SQLException e)
+ {
+ LOG.error("Can't close the ResultSet: " + e);
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public void update(PropertyData data) throws RepositoryException, UnsupportedOperationException,
InvalidItemStateException, IllegalStateException
{
@@ -357,7 +436,7 @@
+ data.getIdentifier() + ". Probably was deleted by another session ", data.getIdentifier(),
ItemState.UPDATED);
}
-
+
// update reference
try
{
@@ -652,8 +731,8 @@
try
{
qpath =
- QPath.makeChildPath(parentPath == null ? traverseQPath(cpid) : parentPath,
- InternalQName.parse(cname));
+ QPath.makeChildPath(parentPath == null ? traverseQPath(cpid) : parentPath, InternalQName
+ .parse(cname));
}
catch (IllegalNameException e)
{
@@ -670,8 +749,8 @@
{
final String storageId = resultSet.getString(COLUMN_VSTORAGE_DESC);
ValueData vdata =
- resultSet.wasNull() ? readValueData(cid, orderNum, cversion,
- resultSet.getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
+ resultSet.wasNull() ? readValueData(cid, orderNum, cversion, resultSet
+ .getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
data.add(vdata);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -226,9 +226,13 @@
protected int addNodeRecord(NodeData data) throws SQLException
{
if (insertNode == null)
+ {
insertNode = dbConnection.prepareStatement(INSERT_NODE);
+ }
else
+ {
insertNode.clearParameters();
+ }
insertNode.setString(1, data.getIdentifier());
insertNode.setString(2, data.getParentIdentifier() == null ? Constants.ROOT_PARENT_UUID : data
@@ -247,9 +251,13 @@
protected int addPropertyRecord(PropertyData data) throws SQLException
{
if (insertProperty == null)
+ {
insertProperty = dbConnection.prepareStatement(INSERT_PROPERTY);
+ }
else
+ {
insertProperty.clearParameters();
+ }
insertProperty.setString(1, data.getIdentifier());
insertProperty.setString(2, data.getParentIdentifier());
@@ -269,12 +277,18 @@
protected int addReference(PropertyData data) throws SQLException, IOException
{
if (insertReference == null)
+ {
insertReference = dbConnection.prepareStatement(INSERT_REF);
+ }
else
+ {
insertReference.clearParameters();
+ }
if (data.getQPath().getAsString().indexOf("versionableUuid") > 0)
+ {
LOG.info("add ref versionableUuid " + data.getQPath().getAsString());
+ }
List<ValueData> values = data.getValues();
int added = 0;
@@ -299,9 +313,13 @@
protected int deleteReference(String propertyIdentifier) throws SQLException
{
if (deleteReference == null)
+ {
deleteReference = dbConnection.prepareStatement(DELETE_REF);
+ }
else
+ {
deleteReference.clearParameters();
+ }
deleteReference.setString(1, propertyIdentifier);
return deleteReference.executeUpdate();
@@ -314,9 +332,13 @@
protected int deleteItemByIdentifier(String identifier) throws SQLException
{
if (deleteItem == null)
+ {
deleteItem = dbConnection.prepareStatement(DELETE_ITEM);
+ }
else
+ {
deleteItem.clearParameters();
+ }
deleteItem.setString(1, identifier);
return deleteItem.executeUpdate();
@@ -329,9 +351,13 @@
protected int updateNodeByIdentifier(int version, int index, int orderNumb, String identifier) throws SQLException
{
if (updateNode == null)
+ {
updateNode = dbConnection.prepareStatement(UPDATE_NODE);
+ }
else
+ {
updateNode.clearParameters();
+ }
updateNode.setInt(1, version);
updateNode.setInt(2, index);
@@ -347,9 +373,13 @@
protected int updatePropertyByIdentifier(int version, int type, String identifier) throws SQLException
{
if (updateProperty == null)
+ {
updateProperty = dbConnection.prepareStatement(UPDATE_PROPERTY);
+ }
else
+ {
updateProperty.clearParameters();
+ }
updateProperty.setInt(1, version);
updateProperty.setInt(2, type);
@@ -364,9 +394,13 @@
protected ResultSet findItemByName(String parentId, String name, int index) throws SQLException
{
if (findItemByName == null)
+ {
findItemByName = dbConnection.prepareStatement(FIND_ITEM_BY_NAME);
+ }
else
+ {
findItemByName.clearParameters();
+ }
findItemByName.setString(1, parentId);
findItemByName.setString(2, name);
@@ -381,9 +415,13 @@
protected ResultSet findPropertyByName(String parentId, String name) throws SQLException
{
if (findPropertyByName == null)
+ {
findPropertyByName = dbConnection.prepareStatement(FIND_PROPERTY_BY_NAME);
+ }
else
+ {
findPropertyByName.clearParameters();
+ }
findPropertyByName.setString(1, parentId);
findPropertyByName.setString(2, name);
@@ -397,9 +435,13 @@
protected ResultSet findItemByIdentifier(String identifier) throws SQLException
{
if (findItemById == null)
+ {
findItemById = dbConnection.prepareStatement(FIND_ITEM_BY_ID);
+ }
else
+ {
findItemById.clearParameters();
+ }
findItemById.setString(1, identifier);
return findItemById.executeQuery();
@@ -412,9 +454,13 @@
protected ResultSet findReferences(String nodeIdentifier) throws SQLException
{
if (findReferences == null)
+ {
findReferences = dbConnection.prepareStatement(FIND_REFERENCES);
+ }
else
+ {
findReferences.clearParameters();
+ }
findReferences.setString(1, nodeIdentifier);
return findReferences.executeQuery();
@@ -427,9 +473,13 @@
protected ResultSet findChildNodesByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findNodesByParentId == null)
+ {
findNodesByParentId = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID);
+ }
else
+ {
findNodesByParentId.clearParameters();
+ }
findNodesByParentId.setString(1, parentIdentifier);
return findNodesByParentId.executeQuery();
@@ -442,9 +492,13 @@
protected ResultSet findChildNodesByParentIdentifierCQ(String parentIdentifier) throws SQLException
{
if (findNodesByParentIdCQ == null)
+ {
findNodesByParentIdCQ = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID_CQ);
+ }
else
+ {
findNodesByParentIdCQ.clearParameters();
+ }
findNodesByParentIdCQ.setString(1, parentIdentifier);
return findNodesByParentIdCQ.executeQuery();
@@ -496,9 +550,13 @@
protected ResultSet findLastOrderNumberByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findLastOrderNumberByParentId == null)
+ {
findLastOrderNumberByParentId = dbConnection.prepareStatement(FIND_LAST_ORDER_NUMBER_BY_PARENTID);
+ }
else
+ {
findLastOrderNumberByParentId.clearParameters();
+ }
findLastOrderNumberByParentId.setString(1, parentIdentifier);
return findLastOrderNumberByParentId.executeQuery();
@@ -511,9 +569,13 @@
protected ResultSet findChildNodesCountByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findNodesCountByParentId == null)
+ {
findNodesCountByParentId = dbConnection.prepareStatement(FIND_NODES_COUNT_BY_PARENTID);
+ }
else
+ {
findNodesCountByParentId.clearParameters();
+ }
findNodesCountByParentId.setString(1, parentIdentifier);
return findNodesCountByParentId.executeQuery();
@@ -526,9 +588,13 @@
protected ResultSet findChildPropertiesByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findPropertiesByParentId == null)
+ {
findPropertiesByParentId = dbConnection.prepareStatement(FIND_PROPERTIES_BY_PARENTID);
+ }
else
+ {
findPropertiesByParentId.clearParameters();
+ }
findPropertiesByParentId.setString(1, parentIdentifier);
return findPropertiesByParentId.executeQuery();
@@ -577,9 +643,13 @@
throws SQLException
{
if (findNodesByParentIdLazilyCQ == null)
+ {
findNodesByParentIdLazilyCQ = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID_LAZILY_CQ);
+ }
else
+ {
findNodesByParentIdLazilyCQ.clearParameters();
+ }
findNodesByParentIdLazilyCQ.setString(1, parentCid);
findNodesByParentIdLazilyCQ.setInt(2, fromOrderNum);
@@ -599,9 +669,13 @@
{
if (insertValue == null)
+ {
insertValue = dbConnection.prepareStatement(INSERT_VALUE);
+ }
else
+ {
insertValue.clearParameters();
+ }
if (stream == null)
{
@@ -627,9 +701,13 @@
protected int deleteValueData(String cid) throws SQLException
{
if (deleteValue == null)
+ {
deleteValue = dbConnection.prepareStatement(DELETE_VALUE);
+ }
else
+ {
deleteValue.clearParameters();
+ }
deleteValue.setString(1, cid);
return deleteValue.executeUpdate();
@@ -642,9 +720,13 @@
protected ResultSet findValuesByPropertyId(String cid) throws SQLException
{
if (findValuesByPropertyId == null)
+ {
findValuesByPropertyId = dbConnection.prepareStatement(FIND_VALUES_BY_PROPERTYID);
+ }
else
+ {
findValuesByPropertyId.clearParameters();
+ }
findValuesByPropertyId.setString(1, cid);
return findValuesByPropertyId.executeQuery();
@@ -657,9 +739,13 @@
protected ResultSet findValueByPropertyIdOrderNumber(String cid, int orderNumb) throws SQLException
{
if (findValueByPropertyIdOrderNumber == null)
+ {
findValueByPropertyIdOrderNumber = dbConnection.prepareStatement(FIND_VALUE_BY_PROPERTYID_OREDERNUMB);
+ }
else
+ {
findValueByPropertyIdOrderNumber.clearParameters();
+ }
findValueByPropertyIdOrderNumber.setString(1, cid);
findValueByPropertyIdOrderNumber.setInt(2, orderNumb);
@@ -673,9 +759,13 @@
protected int renameNode(NodeData data) throws SQLException
{
if (renameNode == null)
+ {
renameNode = dbConnection.prepareStatement(RENAME_NODE);
+ }
else
+ {
renameNode.clearParameters();
+ }
renameNode.setString(1, data.getParentIdentifier() == null ? Constants.ROOT_PARENT_UUID : data
.getParentIdentifier());
@@ -694,10 +784,14 @@
protected ResultSet findValuesStorageDescriptorsByPropertyId(String cid) throws SQLException
{
if (findValuesStorageDescriptorsByPropertyId == null)
+ {
findValuesStorageDescriptorsByPropertyId =
dbConnection.prepareStatement(FIND_VALUES_VSTORAGE_DESC_BY_PROPERTYID);
+ }
else
+ {
findValuesStorageDescriptorsByPropertyId.clearParameters();
+ }
findValuesStorageDescriptorsByPropertyId.setString(1, cid);
return findValuesStorageDescriptorsByPropertyId.executeQuery();
@@ -710,9 +804,13 @@
protected ResultSet findChildPropertiesByParentIdentifierCQ(String parentIdentifier) throws SQLException
{
if (findPropertiesByParentIdCQ == null)
+ {
findPropertiesByParentIdCQ = dbConnection.prepareStatement(FIND_PROPERTIES_BY_PARENTID_CQ);
+ }
else
+ {
findPropertiesByParentIdCQ.clearParameters();
+ }
findPropertiesByParentIdCQ.setString(1, parentIdentifier);
return findPropertiesByParentIdCQ.executeQuery();
@@ -725,10 +823,14 @@
protected ResultSet findNodeMainPropertiesByParentIdentifierCQ(String parentIdentifier) throws SQLException
{
if (findNodeMainPropertiesByParentIdentifierCQ == null)
+ {
findNodeMainPropertiesByParentIdentifierCQ =
dbConnection.prepareStatement(FIND_NODE_MAIN_PROPERTIES_BY_PARENTID_CQ);
+ }
else
+ {
findNodeMainPropertiesByParentIdentifierCQ.clearParameters();
+ }
findNodeMainPropertiesByParentIdentifierCQ.setString(1, parentIdentifier);
return findNodeMainPropertiesByParentIdentifierCQ.executeQuery();
@@ -741,9 +843,13 @@
protected ResultSet findItemQPathByIdentifierCQ(String identifier) throws SQLException
{
if (findItemQPathByIdentifierCQ == null)
+ {
findItemQPathByIdentifierCQ = dbConnection.prepareStatement(FIND_ITEM_QPATH_BY_ID_CQ);
+ }
else
+ {
findItemQPathByIdentifierCQ.clearParameters();
+ }
findItemQPathByIdentifierCQ.setString(1, identifier);
return findItemQPathByIdentifierCQ.executeQuery();
@@ -752,9 +858,13 @@
protected int deleteValueDataByOrderNum(String id, int orderNum) throws SQLException
{
if (deleteValueDataByOrderNum == null)
+ {
deleteValueDataByOrderNum = dbConnection.prepareStatement(DELETE_VALUE_BY_ORDER_NUM);
+ }
else
+ {
deleteValueDataByOrderNum.clearParameters();
+ }
deleteValueDataByOrderNum.setString(1, id);
deleteValueDataByOrderNum.setInt(2, orderNum);
@@ -764,9 +874,13 @@
protected ResultSet findPropertyById(String id) throws SQLException
{
if (findPropertyById == null)
+ {
findPropertyById = dbConnection.prepareStatement(FIND_PROPERTY_BY_ID);
+ }
else
+ {
findPropertyById.clearParameters();
+ }
findPropertyById.setString(1, id);
return findPropertyById.executeQuery();
@@ -777,9 +891,13 @@
{
if (updateValue == null)
+ {
updateValue = dbConnection.prepareStatement(UPDATE_VALUE);
+ }
else
+ {
updateValue.clearParameters();
+ }
if (stream == null)
{
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -53,10 +53,12 @@
testRoot = (NodeImpl)session.getRootNode().addNode("TestGetNodesLazily");
// add first 150 child nodes
- nodesCount = 150;
+ nodesCount = 350;
for (int i = 0; i < nodesCount; i++)
{
- testRoot.addNode("child" + i).setProperty(INDEX_PROPERTY, i);
+ Node newNode = testRoot.addNode("child" + i);
+ newNode.setProperty(INDEX_PROPERTY, i);
+ newNode.addMixin("exo:owneable");
}
session.save();
txService = (TransactionService)container.getComponentInstanceOfType(TransactionService.class);
12 years, 9 months
exo-jcr SVN: r4754 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl and 2 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-08-15 10:18:02 -0400 (Mon, 15 Aug 2011)
New Revision: 4754
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
Log:
EXOJCR-1467: Concurrent repository creation
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java 2011-08-15 07:11:30 UTC (rev 4753)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/AbstractRepositoryServiceConfiguration.java 2011-08-15 14:18:02 UTC (rev 4754)
@@ -18,8 +18,8 @@
*/
package org.exoplatform.services.jcr.config;
-import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by The eXo Platform SAS .
@@ -31,7 +31,7 @@
public abstract class AbstractRepositoryServiceConfiguration
{
- protected List<RepositoryEntry> repositoryConfigurations = new ArrayList<RepositoryEntry>();
+ protected List<RepositoryEntry> repositoryConfigurations = new CopyOnWriteArrayList<RepositoryEntry>();
protected String defaultRepositoryName;
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java 2011-08-15 07:11:30 UTC (rev 4753)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryServiceConfiguration.java 2011-08-15 14:18:02 UTC (rev 4754)
@@ -33,6 +33,7 @@
import javax.jcr.RepositoryException;
+
/**
* Created by The eXo Platform SAS.
*
@@ -52,14 +53,16 @@
this.defaultRepositoryName = defaultRepositoryName;
this.repositoryConfigurations = repositoryEntries;
}
-
+
public final RepositoryEntry getRepositoryConfiguration(String name) throws RepositoryConfigurationException
{
for (int i = 0; i < getRepositoryConfigurations().size(); i++)
{
RepositoryEntry conf = getRepositoryConfigurations().get(i);
if (conf.getName().equals(name))
+ {
return conf;
+ }
}
throw new RepositoryConfigurationException("Repository not configured " + name);
}
@@ -74,11 +77,6 @@
this.defaultRepositoryName = conf.getDefaultRepositoryName();
this.repositoryConfigurations = conf.getRepositoryConfigurations();
-
- // setDefaultRepositoryName(conf.getDefaultRepositoryName());
- // getRepositoryConfigurations().clear();
- // getRepositoryConfigurations().addAll(conf.getRepositoryConfigurations());
-
}
catch (JiBXException e)
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java 2011-08-15 14:18:02 UTC (rev 4754)
@@ -48,6 +48,7 @@
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
import javax.jcr.RepositoryException;
@@ -67,7 +68,8 @@
private final ThreadLocal<String> currentRepositoryName = new ThreadLocal<String>();
- private final HashMap<String, RepositoryContainer> repositoryContainers = new HashMap<String, RepositoryContainer>();
+ private final ConcurrentHashMap<String, RepositoryContainer> repositoryContainers =
+ new ConcurrentHashMap<String, RepositoryContainer>();
private final List<ComponentPlugin> addNodeTypePlugins;
@@ -124,7 +126,7 @@
* Add namespaces and nodetypes from service plugins.
*
*/
- public synchronized void createRepository(RepositoryEntry rEntry) throws RepositoryConfigurationException,
+ public void createRepository(RepositoryEntry rEntry) throws RepositoryConfigurationException,
RepositoryException
{
// Need privileges to manage repository.
@@ -145,16 +147,22 @@
// key=repository_name
try
{
- repositoryContainers.put(rEntry.getName(), repositoryContainer);
- SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
+ if (repositoryContainers.putIfAbsent(rEntry.getName(), repositoryContainer) == null)
{
- public Void run()
+ SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
{
- managerStartChanges.registerListeners(repositoryContainer);
- repositoryContainer.start();
- return null;
- }
- });
+ public Void run()
+ {
+ managerStartChanges.registerListeners(repositoryContainer);
+ repositoryContainer.start();
+ return null;
+ }
+ });
+ }
+ else
+ {
+ throw new RepositoryConfigurationException("Repository container " + rEntry.getName() + " already started");
+ }
}
catch (Throwable t)
{
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java 2011-08-15 07:11:30 UTC (rev 4753)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestRepositoryManagement.java 2011-08-15 14:18:02 UTC (rev 4754)
@@ -18,13 +18,21 @@
*/
package org.exoplatform.services.jcr.impl.core;
+import org.exoplatform.container.xml.PropertiesParam;
import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.config.RepositoryServiceConfiguration;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.jcr.impl.config.JDBCConfigurationPersister;
import org.exoplatform.services.jcr.util.TesterConfigurationHelper;
+import org.jibx.runtime.BindingDirectory;
+import org.jibx.runtime.IBindingFactory;
+import org.jibx.runtime.IUnmarshallingContext;
+import java.util.concurrent.CountDownLatch;
+
/**
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
* @version $Id: TestRepositoryManagement.java 11907 2008-03-13 15:36:21Z ksm $
@@ -50,7 +58,6 @@
this.helper = TesterConfigurationHelper.getInstance();
}
-
public void testAddNewRepository() throws Exception
{
ManageableRepository repository = helper.createRepository(container, false, null);
@@ -128,4 +135,88 @@
}
}
+
+ public void testAddNewRepositorMultiThreading() throws Exception
+ {
+ int theadsCount = 10;
+
+ RepositoryCreationThread[] threads = new RepositoryCreationThread[theadsCount];
+ CountDownLatch latcher = new CountDownLatch(1);
+
+ for (int i = 0; i < theadsCount; i++)
+ {
+ threads[i] = new RepositoryCreationThread(latcher);
+ threads[i].start();
+ }
+
+ latcher.countDown();
+
+ for (int i = 0; i < theadsCount; i++)
+ {
+ threads[i].join();
+ }
+
+ PropertiesParam props = new PropertiesParam();
+ props.setProperty("dialect", "auto");
+ props.setProperty("source-name", "jdbcjcr");
+
+ JDBCConfigurationPersister persiter = new JDBCConfigurationPersister();
+ persiter.init(props);
+
+ IBindingFactory factory = BindingDirectory.getFactory(RepositoryServiceConfiguration.class);
+ IUnmarshallingContext uctx = factory.createUnmarshallingContext();
+ RepositoryServiceConfiguration storedConf =
+ (RepositoryServiceConfiguration)uctx.unmarshalDocument(persiter.read(), null);
+
+ for (int i = 0; i < theadsCount; i++)
+ {
+ // test if respository has been created
+ ManageableRepository repository = threads[i].getRepository();
+ assertNotNull(repository);
+
+ // check configuration in persiter
+ storedConf.getRepositoryConfiguration(repository.getConfiguration().getName());
+
+ // check configuration in RepositoryServic
+ assertNotNull(repositoryService.getConfig().getRepositoryConfiguration(repository.getConfiguration().getName()));
+
+ // login into newly created repository
+ ManageableRepository newRepository = repositoryService.getRepository(repository.getConfiguration().getName());
+ assertNotNull(repository.login(credentials, newRepository.getConfiguration().getSystemWorkspaceName())
+ .getRootNode());
+ }
+ }
+
+ private class RepositoryCreationThread extends Thread
+ {
+ private CountDownLatch latcher;
+
+ private ManageableRepository repository;
+
+ RepositoryCreationThread(CountDownLatch latcher)
+ {
+ this.latcher = latcher;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void run()
+ {
+ try
+ {
+ latcher.await();
+ repository = helper.createRepository(container, false, null);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public ManageableRepository getRepository()
+ {
+ return repository;
+ }
+ }
}
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java 2011-08-15 07:11:30 UTC (rev 4753)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/util/TesterConfigurationHelper.java 2011-08-15 14:18:02 UTC (rev 4754)
@@ -105,6 +105,7 @@
RepositoryService service = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class);
RepositoryEntry repoEntry = createRepositoryEntry(isMultiDb, null, dsName);
service.createRepository(repoEntry);
+ service.getConfig().retain();
return service.getRepository(repoEntry.getName());
}
12 years, 9 months
exo-jcr SVN: r4753 - core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap.
by do-not-reply@jboss.org
Author: areshetnyak
Date: 2011-08-15 03:11:30 -0400 (Mon, 15 Aug 2011)
New Revision: 4753
Added:
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/CacheHandler.java
Modified:
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADGroupDAOImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADMembershipDAOImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADUserDAOImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/BaseDAO.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/GroupDAOImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LDAPUserPageList.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LdapUserListAccess.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipDAOImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipTypeDAOImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/OrganizationServiceImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserDAOImpl.java
core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserProfileDAOImpl.java
Log:
EXOJCR-1480: Improve performance of ldap organization service
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADGroupDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADGroupDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADGroupDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -48,12 +48,14 @@
* items
* @param ldapService {@link LDAPService}
* @param ad See {@link ADSearchBySID}
+ * @param cacheHandler
+ * The Cache Handler
* @throws Exception if any errors occurs
*/
- public ADGroupDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, ADSearchBySID ad)
- throws Exception
+ public ADGroupDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, ADSearchBySID ad,
+ CacheHandler cacheHandler) throws Exception
{
- super(ldapAttrMapping, ldapService);
+ super(ldapAttrMapping, ldapService, cacheHandler);
adSearch = ad;
}
@@ -126,10 +128,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
finally
{
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADMembershipDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADMembershipDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADMembershipDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -23,6 +23,7 @@
import org.exoplatform.services.organization.Membership;
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.impl.MembershipImpl;
+import org.exoplatform.services.organization.ldap.CacheHandler.CacheType;
import java.util.ArrayList;
import java.util.Collection;
@@ -49,12 +50,14 @@
* items
* @param ldapService {@link LDAPService}
* @param ad See {@link ADSearchBySID}
+ * @param cacheHandler
+ * The Cache Handler
* @throws Exception if any errors occurs
*/
public ADMembershipDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, ADSearchBySID ad,
- OrganizationService service) throws Exception
+ OrganizationService service, CacheHandler cacheHandler) throws Exception
{
- super(ldapAttrMapping, ldapService, service);
+ super(ldapAttrMapping, ldapService, service, cacheHandler);
adSearch = ad;
}
@@ -65,6 +68,13 @@
@Override
public Membership findMembershipByUserGroupAndType(String userName, String groupId, String type) throws Exception
{
+ MembershipImpl membership =
+ (MembershipImpl)cacheHandler.get(cacheHandler.getMembershipKey(userName, groupId, type), CacheType.MEMBERSHIP);
+ if (membership != null)
+ {
+ return membership;
+ }
+
LdapContext ctx = ldapService.getLdapContext(true);
String groupDN = getGroupDNFromGroupId(groupId);
try
@@ -75,15 +85,16 @@
{
Collection memberships = findMemberships(ctx, userName, groupDN, type);
if (memberships.size() > 0)
- return (MembershipImpl)memberships.iterator().next();
+ {
+ membership = (MembershipImpl)memberships.iterator().next();
+ cacheHandler.put(cacheHandler.getMembershipKey(membership), membership, CacheType.MEMBERSHIP);
+ return membership;
+ }
return null;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -111,10 +122,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -143,10 +151,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADUserDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADUserDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/ADUserDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -20,6 +20,7 @@
import org.exoplatform.services.ldap.LDAPService;
import org.exoplatform.services.organization.User;
+import org.exoplatform.services.organization.ldap.CacheHandler.CacheType;
import javax.naming.Context;
import javax.naming.NamingException;
@@ -61,11 +62,14 @@
/**
* @param ldapAttrMapping {@link LDAPAttributeMapping}
* @param ldapService {@link LDAPService}
+ * @param cservice
+ * The Cache Handler
* @throws Exception if any errors occurs
*/
- public ADUserDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService) throws Exception
+ public ADUserDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, CacheHandler cacheHandler)
+ throws Exception
{
- super(ldapAttrMapping, ldapService);
+ super(ldapAttrMapping, ldapService, cacheHandler);
LDAPUserPageList.SEARCH_CONTROL = Control.CRITICAL;
}
@@ -93,14 +97,13 @@
ctx.createSubcontext(userDN, attrs);
if (broadcast)
postSave(user, true);
+
+ cacheHandler.put(user.getUserName(), user, CacheType.USER);
break;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -118,7 +121,7 @@
* {@inheritDoc}
*/
@Override
- void saveUserPassword(User user, String userDN) throws Exception
+ protected void saveUserPassword(User user, String userDN) throws Exception
{
Object v = ldapService.getLdapContext().getEnvironment().get(Context.SECURITY_PROTOCOL);
if (v == null)
@@ -147,10 +150,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/BaseDAO.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/BaseDAO.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/BaseDAO.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -24,6 +24,7 @@
import org.exoplatform.services.organization.Group;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.impl.GroupImpl;
+import org.exoplatform.services.organization.ldap.CacheHandler.CacheType;
import java.util.ArrayList;
import java.util.Enumeration;
@@ -82,14 +83,21 @@
private static int maxConnectionError = -1;
/**
+ * * The Cache Handler.
+ */
+ protected final CacheHandler cacheHandler;
+
+ /**
* @param ldapAttrMapping {@link LDAPAttributeMapping}
* @param ldapService {@link LDAPService}
* @throws Exception if any error occurs
*/
- public BaseDAO(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService) throws Exception
+ public BaseDAO(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, CacheHandler cacheHandler)
+ throws Exception
{
this.ldapAttrMapping = ldapAttrMapping;
this.ldapService = ldapService;
+ this.cacheHandler = cacheHandler;
initializeNameParser();
}
@@ -141,6 +149,26 @@
}
/**
+ * Construct object name from {@link Group} id.
+ *
+ * @param groupDN group DN
+ * @return object name
+ */
+ protected String getGroupIdFromGroupDN(String groupDN) throws NamingException
+ {
+ // extract group's id, group's name and parent's group from DN
+ StringBuffer buffer = new StringBuffer();
+ String[] baseParts = explodeDN(ldapAttrMapping.groupsURL, true);
+ String[] membershipParts = explodeDN(groupDN, true);
+ for (int x = (membershipParts.length - baseParts.length - 1); x > -1; x--)
+ {
+ buffer.append("/" + membershipParts[x]);
+ }
+
+ return buffer.toString();
+ }
+
+ /**
* Get collection of {@link Attribute} with specified name from
* {@link Attributes}.
*
@@ -204,6 +232,20 @@
*/
protected Group getGroupFromMembershipDN(LdapContext ctx, String membershipDN) throws NamingException
{
+ String groupDN = getGroupDNFromMembershipDN(membershipDN);
+ Group group = getGroupByDN(ctx, groupDN);
+ return group;
+ }
+
+ /**
+ * Retrieve Group DN from membership DN.
+ *
+ * @param membershipDN membership Distinguished Name
+ * @return GroupDN
+ * @throws NamingException if any naming errors occurs
+ */
+ protected String getGroupDNFromMembershipDN(String membershipDN) throws NamingException
+ {
String[] membershipParts = explodeDN(membershipDN, false);
StringBuffer buffer = new StringBuffer();
for (int x = 1; x < membershipParts.length; x++)
@@ -217,8 +259,7 @@
buffer.append(membershipParts[x] + ",");
}
}
- Group group = getGroupByDN(ctx, buffer.toString());
- return group;
+ return buffer.toString();
}
/**
@@ -245,12 +286,7 @@
}
catch (NamingException e)
{
- // check is allowed to try one more time
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- // not connection exception or error occurs more than MAX_CONNECTION_ERROR
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -261,6 +297,30 @@
}
/**
+ * Re-load the ctx if the context allows it
+ * @param ctx the previous context
+ * @param err the total of errors that have already occurred
+ * @param e the last exception that occurs
+ * @return the new context if the context reload is allowed throws an exception otherwise
+ * @throws NamingException if context could not be reloaded
+ */
+ protected LdapContext reloadCtx(LdapContext ctx, int err, NamingException e) throws NamingException
+ {
+ // check is allowed to try one more time
+ if (isConnectionError(e) && err < getMaxConnectionError())
+ {
+ // release the previous context
+ ldapService.release(ctx);
+ // reload the context
+ ctx = ldapService.getLdapContext(true);
+ }
+ else
+ // not connection exception or error occurs more than MAX_CONNECTION_ERROR
+ throw e;
+ return ctx;
+ }
+
+ /**
* Get Group what reflected to object with specified Distinguished Name.
*
* @param ctx {@link LdapContext}
@@ -270,6 +330,26 @@
*/
protected Group getGroupByDN(LdapContext ctx, String groupDN) throws NamingException
{
+ try
+ {
+ Attributes attrs = ctx.getAttributes(groupDN);
+ return buildGroup(groupDN, attrs);
+ }
+ catch (NameNotFoundException e)
+ {
+ if (LOG.isDebugEnabled())
+ e.printStackTrace();
+ // Object with specified Distinguished Name not found. Null will be
+ // returned. This result we regard as successful, just nothing found.
+ return null;
+ }
+ }
+
+ protected Group buildGroup(String groupDN, Attributes attrs) throws NamingException
+ {
+ GroupImpl group = new GroupImpl();
+
+ // extract group's id, group's name and parent's group from DN
StringBuffer idBuffer = new StringBuffer();
String parentId = null;
String[] baseParts = explodeDN(ldapAttrMapping.groupsURL, true);
@@ -280,25 +360,16 @@
if (x == 1)
parentId = idBuffer.toString();
}
- try
+ group.setGroupName(membershipParts[0]);
+ group.setId(idBuffer.toString());
+ if (attrs != null)
{
- Attributes attrs = ctx.getAttributes(groupDN);
- GroupImpl group = new GroupImpl();
- group.setGroupName(membershipParts[0]);
- group.setId(idBuffer.toString());
group.setDescription(ldapAttrMapping.getAttributeValueAsString(attrs, ldapAttrMapping.ldapDescriptionAttr));
group.setLabel(ldapAttrMapping.getAttributeValueAsString(attrs, ldapAttrMapping.groupLabelAttr));
- group.setParentId(parentId);
- return group;
}
- catch (NameNotFoundException e)
- {
- if (LOG.isDebugEnabled())
- LOG.debug(e.getLocalizedMessage(), e);
- // Object with specified Distinguished Name not found. Null will be
- // returned. This result we regard as successful, just nothing found.
- return null;
- }
+ group.setParentId(parentId);
+
+ return group;
}
/**
@@ -352,10 +423,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -381,9 +449,7 @@
answer = findUser(ctx, username, true);
while (answer.hasMoreElements())
{
- String userDN = answer.next().getNameInNamespace();
- Attributes attrs = ctx.getAttributes(userDN);
- return ldapAttrMapping.attributesToUser(attrs);
+ return ldapAttrMapping.attributesToUser(answer.next().getAttributes());
}
return null;
}
@@ -465,10 +531,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -525,6 +588,9 @@
removeAllSubtree(ctx, sr.getNameInNamespace());
}
ctx.destroySubcontext(dn);
+ String groupId = buildGroup(dn, null).getId();
+ cacheHandler.remove(groupId, CacheType.GROUP);
+ cacheHandler.remove(CacheHandler.GROUP_PREFIX + groupId, CacheType.MEMBERSHIP);
}
finally
{
@@ -649,14 +715,7 @@
}
catch (NamingException e)
{
- // check is allowed to try one more time
- if (isConnectionError(e) && err < getMaxConnectionError())
- // update LdapContext
- ctx = ldapService.getLdapContext(true);
- else
- // not connection exception or error occurs more than
- // MAX_CONNECTION_ERROR times
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
Added: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/CacheHandler.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/CacheHandler.java (rev 0)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/CacheHandler.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -0,0 +1,176 @@
+/*
+ * 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.organization.ldap;
+
+import org.exoplatform.services.cache.CacheService;
+import org.exoplatform.services.cache.ExoCache;
+import org.exoplatform.services.organization.Group;
+import org.exoplatform.services.organization.Membership;
+import org.exoplatform.services.organization.MembershipType;
+import org.exoplatform.services.organization.User;
+
+import java.io.Serializable;
+
+/**
+ * @author <a href="abazko(a)exoplatform.com">Anatoliy Bazko</a>
+ * @version $Id: CacheHandler.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+public class CacheHandler
+{
+ public static final String MEMBERSHIPTYPE_PREFIX = "mt=";
+
+ public static final String GROUP_PREFIX = "g=";
+
+ public static final String USER_PREFIX = "u=";
+
+ /**
+ * Cache for Users.
+ */
+ private final ExoCache<Serializable, User> userCache;
+
+ /**
+ * Cache for MembershipTypes.
+ */
+ private final ExoCache<Serializable, MembershipType> membershipTypeCache;
+
+ /**
+ * Cache for Memberships.
+ */
+ private final ExoCache<Serializable, Membership> membershipCache;
+
+ /**
+ * Cache for Groups.
+ */
+ private final ExoCache<Serializable, Group> groupCache;
+
+ /**
+ * Constructor CacheHandler.
+ *
+ * @param cservice
+ * The cache handler
+ */
+ public CacheHandler(CacheService cservice)
+ {
+ this.userCache = cservice.getCacheInstance(this.getClass().getName() + "userCache");
+ this.membershipTypeCache = cservice.getCacheInstance(this.getClass().getName() + "membershipTypeCache");
+ this.groupCache = cservice.getCacheInstance(this.getClass().getName() + "groupCache");
+ this.membershipCache = cservice.getCacheInstance(this.getClass().getName() + "membershipCache");
+ }
+
+ public void put(Serializable key, Object value, CacheType cacheType)
+ {
+ if (cacheType == CacheType.USER)
+ {
+ userCache.put(key, (User)value);
+ }
+ else if (cacheType == CacheType.GROUP)
+ {
+ groupCache.put(key, (Group)value);
+ }
+ else if (cacheType == CacheType.MEMBERSHIP)
+ {
+ membershipCache.put(key, (Membership)value);
+ }
+ else if (cacheType == CacheType.MEMBERSHIPTYPE)
+ {
+ membershipTypeCache.put(key, (MembershipType)value);
+ }
+ }
+
+ public Object get(Serializable key, CacheType cacheType)
+ {
+ if (cacheType == CacheType.USER)
+ {
+ return userCache.get(key);
+ }
+ else if (cacheType == CacheType.GROUP)
+ {
+ return groupCache.get(key);
+ }
+ else if (cacheType == CacheType.MEMBERSHIP)
+ {
+ return membershipCache.get(key);
+ }
+ else if (cacheType == CacheType.MEMBERSHIPTYPE)
+ {
+ return membershipTypeCache.get(key);
+ }
+
+ return null;
+ }
+
+ public void remove(Serializable key, CacheType cacheType)
+ {
+ if (cacheType == CacheType.USER)
+ {
+ userCache.remove(key);
+ }
+ else if (cacheType == CacheType.GROUP)
+ {
+ groupCache.remove(key);
+ }
+ else if (cacheType == CacheType.MEMBERSHIP)
+ {
+ try
+ {
+ String tKey = ((String)key).toUpperCase();
+ for (Membership m : membershipCache.getCachedObjects())
+ {
+ String mkey = getMembershipKey(m);
+ if (mkey.toUpperCase().indexOf(tKey) >= 0)
+ {
+ membershipCache.remove(mkey);
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ else if (cacheType == CacheType.MEMBERSHIPTYPE)
+ {
+ membershipTypeCache.remove(key);
+ }
+ }
+
+ public String getMembershipKey(Membership m)
+ {
+ StringBuilder key = new StringBuilder();
+ key.append(GROUP_PREFIX + m.getGroupId());
+ key.append(MEMBERSHIPTYPE_PREFIX + m.getMembershipType());
+ key.append(USER_PREFIX + m.getUserName());
+
+ return key.toString();
+ }
+
+ public String getMembershipKey(String username, String groupId, String type)
+ {
+ StringBuilder key = new StringBuilder();
+ key.append(GROUP_PREFIX + groupId);
+ key.append(MEMBERSHIPTYPE_PREFIX + type);
+ key.append(USER_PREFIX + username);
+
+ return key.toString();
+ }
+
+ static enum CacheType
+ {
+ USER, GROUP, MEMBERSHIP, MEMBERSHIPTYPE
+ }
+}
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/GroupDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/GroupDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/GroupDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -26,11 +26,14 @@
import org.exoplatform.services.organization.GroupEventListenerHandler;
import org.exoplatform.services.organization.GroupHandler;
import org.exoplatform.services.organization.impl.GroupImpl;
+import org.exoplatform.services.organization.ldap.CacheHandler.CacheType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.naming.CompositeName;
import javax.naming.Name;
@@ -69,11 +72,14 @@
* @param ldapAttrMapping mapping LDAP attributes to eXo organization service
* items (users, groups, etc)
* @param ldapService {@link LDAPService}
+ * @param cacheHandler
+ * The Cache Handler
* @throws Exception if any errors occurs
*/
- public GroupDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService) throws Exception
+ public GroupDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, CacheHandler cacheHandler)
+ throws Exception
{
- super(ldapAttrMapping, ldapService);
+ super(ldapAttrMapping, ldapService, cacheHandler);
this.listeners = new ArrayList<GroupEventListener>(3);
}
@@ -136,14 +142,13 @@
ctx.createSubcontext(groupDN, ldapAttrMapping.groupToAttributes(child));
if (broadcast)
postSave(group, true);
+
+ cacheHandler.put(child.getId(), group, CacheType.GROUP);
return;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
finally
{
@@ -192,14 +197,13 @@
ctx.modifyAttributes(groupDN, mods);
if (broadcast)
postSave(group, true);
+
+ cacheHandler.put(group.getId(), group, CacheType.GROUP);
return;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -255,15 +259,13 @@
removeAllSubtree(ctx, groupDN);
if (broadcast)
postDelete(group);
+
return group;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
finally
{
@@ -323,10 +325,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
finally
{
@@ -348,6 +347,13 @@
{
if (groupId == null)
return null;
+
+ Group group = (Group)cacheHandler.get(groupId, CacheType.GROUP);
+ if (group != null)
+ {
+ return group;
+ }
+
String parentId = null;
StringBuffer buffer = new StringBuffer();
String[] groupIdParts = groupId.split("/");
@@ -366,17 +372,19 @@
try
{
Attributes attrs = ctx.getAttributes(groupDN);
- Group group = ldapAttrMapping.attributesToGroup(attrs);
+ group = ldapAttrMapping.attributesToGroup(attrs);
((GroupImpl)group).setId(groupId);
((GroupImpl)group).setParentId(parentId);
+
+ if (group != null)
+ {
+ cacheHandler.put(groupId, group, CacheType.GROUP);
+ }
return group;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -402,6 +410,13 @@
{
if (groupId == null)
return null;
+
+ Group group = (Group)cacheHandler.get(groupId, CacheType.GROUP);
+ if (group != null)
+ {
+ return group;
+ }
+
String parentId = null;
StringBuffer buffer = new StringBuffer();
String[] groupIdParts = groupId.split("/");
@@ -415,9 +430,14 @@
try
{
Attributes attrs = ctx.getAttributes(groupDN);
- Group group = ldapAttrMapping.attributesToGroup(attrs);
+ group = ldapAttrMapping.attributesToGroup(attrs);
((GroupImpl)group).setId(groupId);
((GroupImpl)group).setParentId(parentId);
+
+ if (group != null)
+ {
+ cacheHandler.put(groupId, group, CacheType.GROUP);
+ }
return group;
}
catch (NameNotFoundException e)
@@ -473,7 +493,7 @@
{
Name entryName = parser.parse(name.get(0));
String groupDN = entryName + "," + ldapAttrMapping.groupsURL;
- Group group = this.getGroupByDN(ctx, groupDN);
+ Group group = this.buildGroup(groupDN, sr.getAttributes());
if (group != null)
addGroup(groups, group);
}
@@ -482,10 +502,7 @@
}
catch (NamingException e2)
{
- if (isConnectionError(e2) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e2;
+ ctx = reloadCtx(ctx, err, e2);
}
finally
{
@@ -555,7 +572,7 @@
{
Name entryName = parser.parse(name.get(0));
String groupDN = entryName + "," + searchBase;
- Group group = this.getGroupByDN(ctx, groupDN);
+ Group group = this.buildGroup(groupDN, sr.getAttributes());
if (group != null)
addGroup(groups, group);
}
@@ -564,10 +581,7 @@
}
catch (NamingException e2)
{
- if (isConnectionError(e2) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e2;
+ ctx = reloadCtx(ctx, err, e2);
}
finally
{
@@ -613,21 +627,24 @@
results = ctx.search(ldapAttrMapping.groupsURL, filter, constraints);
// add groups for memberships matching user
- // int total = 0;
+ Set<String> uniqueGroupsDN = new HashSet<String>();
while (results != null && results.hasMore())
{
SearchResult sr = results.next();
- // total++;
NameParser parser = ctx.getNameParser("");
CompositeName name = new CompositeName(sr.getName());
if (name.size() < 1)
break;
Name entryName = parser.parse(name.get(0));
String membershipDN = entryName + "," + ldapAttrMapping.groupsURL;
- Group group = this.getGroupFromMembershipDN(ctx, membershipDN);
- if (group != null)
- addGroup(groups, group);
+ uniqueGroupsDN.add(this.getGroupDNFromMembershipDN(membershipDN));
}
+ for(String groupDN : uniqueGroupsDN)
+ {
+ Group group = this.getGroupByDN(ctx, groupDN);
+ if (group != null)
+ addGroup(groups, group);
+ }
if (LOG.isDebugEnabled())
{
LOG.debug("Retrieved " + groups.size() + " groups from ldap for user " + userName);
@@ -636,10 +653,7 @@
}
catch (NamingException e2)
{
- if (isConnectionError(e2) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e2;
+ ctx = reloadCtx(ctx, err, e2);
}
finally
{
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LDAPUserPageList.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LDAPUserPageList.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LDAPUserPageList.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -142,7 +142,10 @@
catch (NamingException e)
{
if (BaseDAO.isConnectionError(e) && err < BaseDAO.getMaxConnectionError())
+ {
+ ldapService.release(ctx);
ctx = ldapService.getLdapContext(true);
+ }
else
throw e;
}
@@ -199,7 +202,10 @@
catch (NamingException e)
{
if (BaseDAO.isConnectionError(e) && err < 1)
+ {
+ ldapService.release(ctx);
ctx = ldapService.getLdapContext(true);
+ }
else
throw e;
}
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LdapUserListAccess.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LdapUserListAccess.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/LdapUserListAccess.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -84,7 +84,10 @@
catch (NamingException e)
{
if (BaseDAO.isConnectionError(e) && err < BaseDAO.getMaxConnectionError())
+ {
+ ldapService.release(ctx);
ctx = ldapService.getLdapContext(true);
+ }
else
throw e;
}
@@ -113,7 +116,10 @@
catch (NamingException e)
{
if (BaseDAO.isConnectionError(e) && err < BaseDAO.getMaxConnectionError())
+ {
+ ldapService.release(ctx);
ctx = ldapService.getLdapContext(true);
+ }
else
throw e;
}
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -30,6 +30,7 @@
import org.exoplatform.services.organization.OrganizationService;
import org.exoplatform.services.organization.User;
import org.exoplatform.services.organization.impl.MembershipImpl;
+import org.exoplatform.services.organization.ldap.CacheHandler.CacheType;
import java.util.ArrayList;
import java.util.Collection;
@@ -78,13 +79,15 @@
* {@link LDAPService}
* @param service
* Organization service implementation covering the handler.
+ * @param cacheHandler
+ * The Cache Handler
* @throws Exception
* if any errors occurs
*/
- public MembershipDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, OrganizationService service)
- throws Exception
+ public MembershipDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, OrganizationService service,
+ CacheHandler cacheHandler) throws Exception
{
- super(ldapAttrMapping, ldapService);
+ super(ldapAttrMapping, ldapService, cacheHandler);
this.listeners = new ArrayList<MembershipEventListener>(3);
this.service = service;
}
@@ -147,6 +150,7 @@
ctx.createSubcontext(membershipDN, ldapAttrMapping.membershipToAttributes(m, userDN));
if (broadcast)
postSave(m, true);
+ cacheHandler.put(cacheHandler.getMembershipKey(m), m, CacheType.MEMBERSHIP);
return;
}
// if contains membership
@@ -164,15 +168,13 @@
ctx.modifyAttributes(membershipDN, mods);
if (broadcast)
postSave(m, true);
+ cacheHandler.put(cacheHandler.getMembershipKey(m), m, CacheType.MEMBERSHIP);
return;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -266,6 +268,7 @@
ctx.modifyAttributes(membershipDN, mods);
if (broadcast)
postSave(m, true);
+ cacheHandler.put(cacheHandler.getMembershipKey(m), m, CacheType.MEMBERSHIP);
}
else
{
@@ -274,15 +277,13 @@
ctx.destroySubcontext(membershipDN);
if (broadcast)
postDelete(m);
+ cacheHandler.remove(cacheHandler.getMembershipKey(m), CacheType.MEMBERSHIP);
}
return m;
}
catch (NamingException e1)
{
- if (isConnectionError(e1) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e1;
+ ctx = reloadCtx(ctx, err, e1);
}
}
}
@@ -339,9 +340,13 @@
new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute(
ldapAttrMapping.membershipTypeMemberValue, userDN));
ctx.modifyAttributes(membershipDN, mods);
+ cacheHandler.put(cacheHandler.getMembershipKey(membership), membership, CacheType.MEMBERSHIP);
}
else
+ {
ctx.destroySubcontext(membershipDN);
+ cacheHandler.remove(cacheHandler.getMembershipKey(membership), CacheType.MEMBERSHIP);
+ }
}
catch (Exception e1)
{
@@ -352,10 +357,7 @@
}
catch (NamingException e2)
{
- if (isConnectionError(e2) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e2;
+ ctx = reloadCtx(ctx, err, e2);
}
finally
{
@@ -386,12 +388,19 @@
*/
public Membership findMembershipByUserGroupAndType(String userName, String groupId, String type) throws Exception
{
+ MembershipImpl membership =
+ (MembershipImpl)cacheHandler.get(cacheHandler.getMembershipKey(userName, groupId, type), CacheType.MEMBERSHIP);
+ if (membership != null)
+ {
+ return membership;
+ }
+
LdapContext ctx = ldapService.getLdapContext();
try
{
for (int err = 0;; err++)
{
- Membership membership = null;
+ membership = null;
try
{
String userDN = getDNFromUsername(ctx, userName);
@@ -416,14 +425,15 @@
membership = createMembershipObject(userName, groupId, type);
}
+ if (membership != null)
+ {
+ cacheHandler.put(cacheHandler.getMembershipKey(membership), membership, CacheType.MEMBERSHIP);
+ }
return membership;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -559,9 +569,9 @@
{
SearchResult sr = results.next();
String membershipDN = sr.getNameInNamespace();
- Group group = getGroupFromMembershipDN(ctx, membershipDN);
+ String groupId = getGroupIdFromGroupDN(getGroupDNFromMembershipDN(membershipDN));
String type = explodeDN(membershipDN, true)[0];
- Membership membership = createMembershipObject(userName, group.getId(), type);
+ Membership membership = createMembershipObject(userName, groupId, type);
memberships.add(membership);
}
if (LOG.isDebugEnabled())
@@ -572,10 +582,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
finally
{
@@ -640,10 +647,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
finally
{
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipTypeDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipTypeDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/MembershipTypeDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -24,6 +24,7 @@
import org.exoplatform.services.organization.MembershipType;
import org.exoplatform.services.organization.MembershipTypeHandler;
import org.exoplatform.services.organization.impl.MembershipTypeImpl;
+import org.exoplatform.services.organization.ldap.CacheHandler.CacheType;
import java.util.ArrayList;
import java.util.Collection;
@@ -56,11 +57,14 @@
* @param ldapAttrMapping mapping LDAP attributes to eXo organization service
* items (users, groups, etc)
* @param ldapService {@link LDAPService}
+ * @param cacheHandler
+ * The Cache Handler
* @throws Exception if any errors occurs
*/
- public MembershipTypeDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService) throws Exception
+ public MembershipTypeDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, CacheHandler cacheHandler)
+ throws Exception
{
- super(ldapAttrMapping, ldapService);
+ super(ldapAttrMapping, ldapService, cacheHandler);
}
/**
@@ -95,15 +99,14 @@
mt.setCreatedDate(now);
mt.setModifiedDate(now);
ctx.createSubcontext(membershipTypeDN, ldapAttrMapping.membershipTypeToAttributes(mt));
+
+ cacheHandler.put(mt.getName(), mt, CacheType.MEMBERSHIPTYPE);
}
return mt;
}
catch (NamingException e1)
{
- if (isConnectionError(e1) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e1;
+ ctx = reloadCtx(ctx, err, e1);
}
}
}
@@ -146,14 +149,13 @@
ldapAttrMapping.ldapDescriptionAttr, mt.getDescription()));
}
ctx.modifyAttributes(membershipTypeDN, mods);
+
+ cacheHandler.put(mt.getName(), mt, CacheType.MEMBERSHIPTYPE);
return mt;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -181,14 +183,13 @@
MembershipType m = ldapAttrMapping.attributesToMembershipType(attrs);
removeMembership(ctx, name);
ctx.destroySubcontext(membershipTypeDN);
+
+ cacheHandler.remove(name, CacheType.MEMBERSHIPTYPE);
return m;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -209,6 +210,12 @@
*/
public MembershipType findMembershipType(String name) throws Exception
{
+ MembershipType mt = (MembershipType)cacheHandler.get(name, CacheType.MEMBERSHIPTYPE);
+ if (mt != null)
+ {
+ return mt;
+ }
+
String membershipTypeDN =
ldapAttrMapping.membershipTypeNameAttr + "=" + name + "," + ldapAttrMapping.membershipTypeURL;
LdapContext ctx = ldapService.getLdapContext();
@@ -219,14 +226,16 @@
try
{
Attributes attrs = ctx.getAttributes(membershipTypeDN);
- return ldapAttrMapping.attributesToMembershipType(attrs);
+ mt = ldapAttrMapping.attributesToMembershipType(attrs);
+ if (mt != null)
+ {
+ cacheHandler.put(name, mt, CacheType.MEMBERSHIPTYPE);
+ }
+ return mt;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -274,10 +283,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
finally
{
@@ -307,6 +313,8 @@
{
SearchResult sr = results.next();
ctx.destroySubcontext(sr.getNameInNamespace());
+
+ cacheHandler.remove(CacheHandler.MEMBERSHIPTYPE_PREFIX + name, CacheType.MEMBERSHIP);
}
}
finally
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/OrganizationServiceImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/OrganizationServiceImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/OrganizationServiceImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -47,25 +47,27 @@
LDAPAttributeMapping ldapAttrMapping =
(LDAPAttributeMapping)params.getObjectParam("ldap.attribute.mapping").getObject();
+ CacheHandler cacheHandler = new CacheHandler(cservice);
+
if (ldapService.getServerType() == LDAPService.ACTIVE_DIRECTORY_SERVER)
{
- userDAO_ = new ADUserDAOImpl(ldapAttrMapping, ldapService);
+ userDAO_ = new ADUserDAOImpl(ldapAttrMapping, ldapService, cacheHandler);
// ADSearchBySID adSearch = new ADSearchBySID(ldapAttrMapping, ldapService);
ADSearchBySID adSearch = new ADSearchBySID(ldapAttrMapping);
- groupDAO_ = new ADGroupDAOImpl(ldapAttrMapping, ldapService, adSearch);
- membershipDAO_ = new ADMembershipDAOImpl(ldapAttrMapping, ldapService, adSearch, this);
+ groupDAO_ = new ADGroupDAOImpl(ldapAttrMapping, ldapService, adSearch, cacheHandler);
+ membershipDAO_ = new ADMembershipDAOImpl(ldapAttrMapping, ldapService, adSearch, this, cacheHandler);
}
else
{
// ValueParam param = params.getValueParam("ldap.userDN.key");
// ldapAttrMapping.userDNKey = param.getValue();
- userDAO_ = new UserDAOImpl(ldapAttrMapping, ldapService);
- groupDAO_ = new GroupDAOImpl(ldapAttrMapping, ldapService);
- membershipDAO_ = new MembershipDAOImpl(ldapAttrMapping, ldapService, this);
+ userDAO_ = new UserDAOImpl(ldapAttrMapping, ldapService, cacheHandler);
+ groupDAO_ = new GroupDAOImpl(ldapAttrMapping, ldapService, cacheHandler);
+ membershipDAO_ = new MembershipDAOImpl(ldapAttrMapping, ldapService, this, cacheHandler);
}
// userProfileHandler_ = new UserProfileHandlerImpl(ldapAttrMapping, ldapService) ;
userProfileDAO_ = new UserProfileDAOImpl(hservice, cservice);
- membershipTypeDAO_ = new MembershipTypeDAOImpl(ldapAttrMapping, ldapService);
+ membershipTypeDAO_ = new MembershipTypeDAOImpl(ldapAttrMapping, ldapService, cacheHandler);
ValueParam param = params.getValueParam("ldap.userDN.key");
if (param != null)
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -21,8 +21,13 @@
import org.exoplatform.commons.utils.LazyPageList;
import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.services.ldap.LDAPService;
-import org.exoplatform.services.organization.*;
+import org.exoplatform.services.organization.Query;
+import org.exoplatform.services.organization.User;
+import org.exoplatform.services.organization.UserEventListener;
+import org.exoplatform.services.organization.UserEventListenerHandler;
+import org.exoplatform.services.organization.UserHandler;
import org.exoplatform.services.organization.impl.UserImpl;
+import org.exoplatform.services.organization.ldap.CacheHandler.CacheType;
import java.util.ArrayList;
import java.util.Collections;
@@ -53,11 +58,14 @@
* @param ldapAttrMapping mapping LDAP attributes to eXo organization service
* items (users, groups, etc)
* @param ldapService {@link LDAPService}
+ * @param cacheHandler
+ * The Cache Handler
* @throws Exception if any errors occurs
*/
- public UserDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService) throws Exception
+ public UserDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, CacheHandler cacheHandler)
+ throws Exception
{
- super(ldapAttrMapping, ldapService);
+ super(ldapAttrMapping, ldapService, cacheHandler);
}
/**
@@ -104,14 +112,13 @@
ctx.createSubcontext(userDN, attrs);
if (broadcast)
postSave(user, true);
+
+ cacheHandler.put(user.getUserName(), user, CacheType.USER);
break;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -145,14 +152,13 @@
ctx.modifyAttributes(userDN, mods);
if (broadcast)
postSave(user, false);
+
+ cacheHandler.put(user.getUserName(), user, CacheType.USER);
break;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -174,7 +180,7 @@
* @param userDN Distinguished Name
* @throws Exception if any errors occurs
*/
- void saveUserPassword(User user, String userDN) throws Exception
+ protected void saveUserPassword(User user, String userDN) throws Exception
{
ModificationItem[] mods =
new ModificationItem[]{new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute(
@@ -191,10 +197,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -227,14 +230,14 @@
ctx.destroySubcontext(userDN);
if (broadcast)
postDelete(user);
+
+ cacheHandler.remove(userName, CacheType.USER);
+ cacheHandler.remove(CacheHandler.USER_PREFIX + userName, CacheType.MEMBERSHIP);
return user;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -249,6 +252,12 @@
*/
public User findUserByName(String userName) throws Exception
{
+ User user = (User)cacheHandler.get(userName, CacheType.USER);
+ if (user != null)
+ {
+ return user;
+ }
+
LdapContext ctx = ldapService.getLdapContext();
try
{
@@ -256,14 +265,16 @@
{
try
{
- return getUserFromUsername(ctx, userName);
+ user = getUserFromUsername(ctx, userName);
+ if (user != null)
+ {
+ cacheHandler.put(user.getUserName(), user, CacheType.USER);
+ }
+ return user;
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -283,51 +294,6 @@
*/
public ListAccess<User> findUsersByGroupId(String groupId) throws Exception
{
- // ArrayList<User> users = new ArrayList<User>();
- // TreeMap<String, User> map = new TreeMap<String, User>();
- //
- // LdapContext ctx = ldapService.getLdapContext();
- // try {
- // NamingEnumeration<SearchResult> results = null;
- // for (int err = 0;; err++) {
- // map.clear();
- // try {
- // String searchBase = this.getGroupDNFromGroupId(groupId);
- // String filter = ldapAttrMapping.membershipObjectClassFilter;
- // SearchControls constraints = new SearchControls();
- // constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);
- // results = ctx.search(searchBase, filter, constraints);
- // while (results.hasMoreElements()) {
- // SearchResult sr = results.next();
- // Attributes attrs = sr.getAttributes();
- // List<Object> members = this.getAttributes(attrs,
- // ldapAttrMapping.membershipTypeMemberValue);
- // for (int x = 0; x < members.size(); x++) {
- // User user = findUserByDN(ctx, (String) members.get(x));
- // if (user != null)
- // map.put(user.getUserName(), user);
- // }
- // }
- // break;
- // } catch (NamingException e) {
- // if (isConnectionError(e) && err < getMaxConnectionError())
- // ctx = ldapService.getLdapContext(true);
- // else
- // throw e;
- // } finally {
- // if (results != null)
- // results.close();
- // }
- // }
- // } finally {
- // ldapService.release(ctx);
- // }
- //
- // for (Iterator<String> i = map.keySet().iterator(); i.hasNext();)
- // users.add(map.get(i.next()));
- //
- // return new ObjectPageList(users, 10);
-
String searchBase = this.getGroupDNFromGroupId(groupId);
String filter = ldapAttrMapping.membershipObjectClassFilter;
return new ByGroupLdapUserListAccess(ldapAttrMapping, ldapService, searchBase, filter);
@@ -346,8 +312,6 @@
String searchBase = ldapAttrMapping.userURL;
String filter = ldapAttrMapping.userObjectClassFilter;
- // return new LDAPUserPageList(ldapAttrMapping, ldapService, searchBase, filter, pageSize);
-
return new SimpleLdapUserListAccess(ldapAttrMapping, ldapService, searchBase, filter);
}
Modified: core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserProfileDAOImpl.java
===================================================================
--- core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserProfileDAOImpl.java 2011-08-12 13:45:19 UTC (rev 4752)
+++ core/trunk/exo.core.component.organization.ldap/src/main/java/org/exoplatform/services/organization/ldap/UserProfileDAOImpl.java 2011-08-15 07:11:30 UTC (rev 4753)
@@ -62,9 +62,10 @@
*/
private static final Log LOG = ExoLogger.getLogger("exo.core.component.organization.ldap.UserProfileDAOImpl");
- public UserProfileDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService) throws Exception
+ public UserProfileDAOImpl(LDAPAttributeMapping ldapAttrMapping, LDAPService ldapService, CacheHandler cacheHandler)
+ throws Exception
{
- super(ldapAttrMapping, ldapService);
+ super(ldapAttrMapping, ldapService, cacheHandler);
this.listeners = new ArrayList<UserProfileEventListener>(3);
}
@@ -108,10 +109,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -154,10 +152,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -192,10 +187,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
@@ -230,10 +222,7 @@
}
catch (NamingException e)
{
- if (isConnectionError(e) && err < getMaxConnectionError())
- ctx = ldapService.getLdapContext(true);
- else
- throw e;
+ ctx = reloadCtx(ctx, err, e);
}
}
}
12 years, 9 months
exo-jcr SVN: r4752 - jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/metadata.
by do-not-reply@jboss.org
Author: dkuleshov
Date: 2011-08-12 09:45:19 -0400 (Fri, 12 Aug 2011)
New Revision: 4752
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java
Log:
EXOJCR-1438: removed exception printing reverted
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java 2011-08-12 13:45:06 UTC (rev 4751)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java 2011-08-12 13:45:19 UTC (rev 4752)
@@ -127,7 +127,7 @@
}
catch (DocumentReadException e)
{
- log.warn(e.getMessage());
+ log.warn(e.getMessage(), e);
}
Iterator entries = props.entrySet().iterator();
12 years, 9 months