### 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.
*