### Eclipse Workspace Patch 1.0 #P jackrabbit-core Index: src/main/java/org/apache/jackrabbit/core/ItemValidator.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/ItemValidator.java (revision 984800) +++ src/main/java/org/apache/jackrabbit/core/ItemValidator.java (working copy) @@ -16,18 +16,6 @@ */ package org.apache.jackrabbit.core; -import javax.jcr.InvalidItemStateException; -import javax.jcr.ItemNotFoundException; -import javax.jcr.NamespaceException; -import javax.jcr.Node; -import javax.jcr.Property; -import javax.jcr.PropertyType; -import javax.jcr.RepositoryException; -import javax.jcr.lock.LockException; -import javax.jcr.nodetype.ConstraintViolationException; -import javax.jcr.nodetype.ItemDefinition; -import javax.jcr.version.VersionException; - import org.apache.jackrabbit.core.id.ItemId; import org.apache.jackrabbit.core.nodetype.EffectiveNodeType; import org.apache.jackrabbit.core.nodetype.NodeTypeConflictException; @@ -39,12 +27,24 @@ import org.apache.jackrabbit.core.value.InternalValue; import org.apache.jackrabbit.spi.Name; import org.apache.jackrabbit.spi.Path; -import org.apache.jackrabbit.spi.QPropertyDefinition; import org.apache.jackrabbit.spi.QItemDefinition; import org.apache.jackrabbit.spi.QNodeDefinition; +import org.apache.jackrabbit.spi.QPropertyDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.jcr.InvalidItemStateException; +import javax.jcr.ItemNotFoundException; +import javax.jcr.NamespaceException; +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; +import javax.jcr.lock.LockException; +import javax.jcr.nodetype.ConstraintViolationException; +import javax.jcr.nodetype.ItemDefinition; +import javax.jcr.version.VersionException; + /** * Utility class for validating an item against constraints * specified by its definition. @@ -95,7 +95,7 @@ * option to check for effective retention policies */ public static final int CHECK_RETENTION = 256; - + /** * Logger instance for this class */ @@ -106,6 +106,8 @@ */ protected final SessionContext sessionContext; + private int enabledChecks = ~0; + /** * node type registry */ @@ -216,12 +218,24 @@ EffectiveNodeType.checkSetPropertyValueConstraints(def, values); } + public void enableChecks(int options) { + enabledChecks = enabledChecks | options; + } + + public void disableChecks(int options) { + enabledChecks = enabledChecks & ~options; + } + + public int getEnabledChecks() { + return enabledChecks; + } + public void checkModify(ItemImpl item, int options, int permissions) throws RepositoryException { - checkCondition(item, options, permissions, false); + checkCondition(item, options & enabledChecks, permissions, false); } public void checkRemove(ItemImpl item, int options, int permissions) throws RepositoryException { - checkCondition(item, options, permissions, true); + checkCondition(item, options & enabledChecks, permissions, true); } private void checkCondition(ItemImpl item, int options, int permissions, boolean isRemoval) throws RepositoryException { @@ -275,7 +289,7 @@ } public boolean canModify(ItemImpl item, int options, int permissions) throws RepositoryException { - return hasCondition(item, options, permissions, false); + return hasCondition(item, options & enabledChecks, permissions, false); } private boolean hasCondition(ItemImpl item, int options, int permissions, boolean isRemoval) throws RepositoryException { @@ -370,7 +384,7 @@ } - + //-------------------------------------------------< misc. helper methods > /** * Helper method that builds the effective (i.e. merged and resolved) @@ -511,4 +525,5 @@ return id.toString(); } } + } Index: src/main/java/org/apache/jackrabbit/core/session/SessionState.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/session/SessionState.java (revision 984800) +++ src/main/java/org/apache/jackrabbit/core/session/SessionState.java (working copy) @@ -16,14 +16,13 @@ */ package org.apache.jackrabbit.core.session; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.jcr.RepositoryException; import javax.jcr.Session; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.concurrent.locks.ReentrantLock; /** * Internal session state. This class keeps track of the lifecycle of @@ -59,7 +58,7 @@ * synchronization in order to be able to log attempts to concurrently * use a session. */ - private final Lock lock = new ReentrantLock(); + private final ReentrantLock lock = new ReentrantLock(); /** * Flag to indicate a closed session. When null, the session @@ -125,6 +124,29 @@ } } + public T performUnchecked(SessionOperation operation, int disabledChecks) throws RepositoryException { + if (!lock.tryLock()) { + log.debug("Attempt to perform {} while another thread is" + + " concurrently accessing the session. Blocking until" + + " the other thread is finished using this session.", operation); + lock.lock(); + } + try { + checkAlive(); + log.debug("Performing {}", operation); + if (lock.getHoldCount() == 1) { + context.getItemValidator().disableChecks(disabledChecks); + } + return operation.perform(context); + } + finally { + if (lock.getHoldCount() == 1) { + context.getItemValidator().enableChecks(disabledChecks); + } + lock.unlock(); + } + } + /** * Closes this session. *