Index: jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitWorkspace.java =================================================================== --- jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitWorkspace.java (revision 542914) +++ jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitWorkspace.java (working copy) @@ -16,12 +16,12 @@ */ package org.apache.jackrabbit.api; -import org.xml.sax.InputSource; - import javax.jcr.AccessDeniedException; import javax.jcr.RepositoryException; import javax.jcr.Workspace; +import org.xml.sax.InputSource; + /** * The Jackrabbit workspace interface. This interface contains the * Jackrabbit-specific extensions to the JCR {@link Workspace} interface. @@ -55,4 +55,16 @@ */ void createWorkspace(String workspaceName, InputSource workspaceTemplate) throws AccessDeniedException, RepositoryException; + + /** + * Disables/enables referential integrity checking for given worskspace. + * + * @param workspaceName name of the workspace + * @param checkingEnabled false to disable, true to enable integrity checking. + * + * @throws RepositoryException if a workspace with the given name + * does not exists or if another error occurs + */ + void setReferentialIntegrityChecking(String workspaceName, boolean checkingEnabled) + throws RepositoryException; } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (revision 542914) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (working copy) @@ -16,10 +16,35 @@ */ package org.apache.jackrabbit.core; -import EDU.oswego.cs.dl.util.concurrent.Mutex; -import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock; -import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock; -import EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.security.AccessControlContext; +import java.security.AccessController; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +import javax.jcr.AccessDeniedException; +import javax.jcr.Credentials; +import javax.jcr.LoginException; +import javax.jcr.NamespaceRegistry; +import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.observation.Event; +import javax.jcr.observation.EventIterator; +import javax.jcr.observation.EventListener; +import javax.jcr.observation.ObservationManager; +import javax.security.auth.Subject; + import org.apache.commons.collections.map.ReferenceMap; import org.apache.jackrabbit.api.JackrabbitRepository; import org.apache.jackrabbit.core.cluster.ClusterContext; @@ -64,35 +89,11 @@ import org.slf4j.LoggerFactory; import org.xml.sax.InputSource; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.security.AccessControlContext; -import java.security.AccessController; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; -import java.util.Set; +import EDU.oswego.cs.dl.util.concurrent.Mutex; +import EDU.oswego.cs.dl.util.concurrent.ReadWriteLock; +import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock; +import EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock; -import javax.jcr.AccessDeniedException; -import javax.jcr.Credentials; -import javax.jcr.LoginException; -import javax.jcr.NamespaceRegistry; -import javax.jcr.NoSuchWorkspaceException; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.observation.Event; -import javax.jcr.observation.EventIterator; -import javax.jcr.observation.EventListener; -import javax.jcr.observation.ObservationManager; -import javax.security.auth.Subject; - /** * A RepositoryImpl ... */ @@ -2018,4 +2019,17 @@ getWorkspaceInfo(workspace).getLockManager(); } } + + /** + * Disables/enables referential integrity checking for given worskspace. + * + * @param workspaceName name of the workspace + * @param checkingEnabled false to disable, true to enable integrity checking. + * + * @throws RepositoryException if an error occurs + */ + public void setReferentialIntegrityChecking(String workspaceName, boolean checkingEnabled) throws RepositoryException { + SharedItemStateManager sism = getWorkspaceStateManager(workspaceName); + sism.setReferentialIntegrityChecking(checkingEnabled); + } } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (revision 542914) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (working copy) @@ -16,14 +16,24 @@ */ package org.apache.jackrabbit.core.state; +import java.io.PrintStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import javax.jcr.PropertyType; +import javax.jcr.ReferentialIntegrityException; +import javax.jcr.RepositoryException; +import javax.jcr.nodetype.ConstraintViolationException; +import javax.jcr.nodetype.NoSuchNodeTypeException; + import org.apache.jackrabbit.core.ItemId; import org.apache.jackrabbit.core.NodeId; import org.apache.jackrabbit.core.PropertyId; import org.apache.jackrabbit.core.RepositoryImpl; import org.apache.jackrabbit.core.cluster.UpdateEventChannel; -import org.apache.jackrabbit.core.persistence.PersistenceManager; -import org.apache.jackrabbit.core.persistence.bundle.CachingPersistenceManager; -import org.apache.jackrabbit.core.version.XAVersionManager; import org.apache.jackrabbit.core.nodetype.EffectiveNodeType; import org.apache.jackrabbit.core.nodetype.NodeDefId; import org.apache.jackrabbit.core.nodetype.NodeTypeConflictException; @@ -31,26 +41,17 @@ import org.apache.jackrabbit.core.nodetype.PropDef; import org.apache.jackrabbit.core.observation.EventStateCollection; import org.apache.jackrabbit.core.observation.EventStateCollectionFactory; +import org.apache.jackrabbit.core.persistence.PersistenceManager; +import org.apache.jackrabbit.core.persistence.bundle.CachingPersistenceManager; import org.apache.jackrabbit.core.util.Dumpable; import org.apache.jackrabbit.core.value.InternalValue; +import org.apache.jackrabbit.core.version.XAVersionManager; import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider; import org.apache.jackrabbit.name.QName; import org.apache.jackrabbit.uuid.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.jcr.PropertyType; -import javax.jcr.ReferentialIntegrityException; -import javax.jcr.RepositoryException; -import javax.jcr.nodetype.ConstraintViolationException; -import javax.jcr.nodetype.NoSuchNodeTypeException; -import java.io.PrintStream; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import java.util.HashMap; - /** * Shared ItemStateManager (SISM). Caches objects returned from a * PersistenceManager. Objects returned by this item state @@ -167,6 +168,12 @@ * Update event channel. */ private UpdateEventChannel eventChannel; + + /** + * Flag indicating whether this item state manager checks uses node references to + * verify integrity of its reference properties. + */ + private boolean referentialIntegrityCheckingEnabled = true; /** * Creates a new SharedItemStateManager instance. @@ -549,10 +556,12 @@ updateReferences(local, virtualProvider); } - /** - * Check whether reference targets exist/were not removed - */ - checkReferentialIntegrity(local); + if (referentialIntegrityCheckingEnabled) { + /** + * Check whether reference targets exist/were not removed + */ + checkReferentialIntegrity(local); + } /** * prepare the events. this needs to be after the referential @@ -1454,4 +1463,13 @@ throw new ItemStateException("Interrupted while acquiring write lock"); } } + + /** + * Sets referential integrity checking flag. + * + * @param checkingEnabled true to enable, false to disable integrity checking. + */ + public void setReferentialIntegrityChecking(boolean checkingEnabled) { + this.referentialIntegrityCheckingEnabled = checkingEnabled; + } } Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java =================================================================== --- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java (revision 542914) +++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java (working copy) @@ -16,28 +16,10 @@ */ package org.apache.jackrabbit.core; -import org.apache.jackrabbit.api.JackrabbitWorkspace; -import org.apache.jackrabbit.core.config.WorkspaceConfig; -import org.apache.jackrabbit.core.lock.LockManager; -import org.apache.jackrabbit.core.observation.EventStateCollection; -import org.apache.jackrabbit.core.observation.EventStateCollectionFactory; -import org.apache.jackrabbit.core.observation.ObservationManagerImpl; -import org.apache.jackrabbit.core.query.QueryManagerImpl; -import org.apache.jackrabbit.core.state.LocalItemStateManager; -import org.apache.jackrabbit.core.state.SharedItemStateManager; -import org.apache.jackrabbit.core.version.DateVersionSelector; -import org.apache.jackrabbit.core.version.VersionImpl; -import org.apache.jackrabbit.core.version.VersionSelector; -import org.apache.jackrabbit.core.xml.ImportHandler; -import org.apache.jackrabbit.core.xml.Importer; -import org.apache.jackrabbit.core.xml.WorkspaceImporter; -import org.apache.jackrabbit.name.NameException; -import org.apache.jackrabbit.name.Path; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.ContentHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Iterator; import javax.jcr.AccessDeniedException; import javax.jcr.InvalidItemStateException; @@ -62,10 +44,28 @@ import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Iterator; +import org.apache.jackrabbit.api.JackrabbitWorkspace; +import org.apache.jackrabbit.core.config.WorkspaceConfig; +import org.apache.jackrabbit.core.lock.LockManager; +import org.apache.jackrabbit.core.observation.EventStateCollection; +import org.apache.jackrabbit.core.observation.EventStateCollectionFactory; +import org.apache.jackrabbit.core.observation.ObservationManagerImpl; +import org.apache.jackrabbit.core.query.QueryManagerImpl; +import org.apache.jackrabbit.core.state.LocalItemStateManager; +import org.apache.jackrabbit.core.state.SharedItemStateManager; +import org.apache.jackrabbit.core.version.DateVersionSelector; +import org.apache.jackrabbit.core.version.VersionImpl; +import org.apache.jackrabbit.core.version.VersionSelector; +import org.apache.jackrabbit.core.xml.ImportHandler; +import org.apache.jackrabbit.core.xml.Importer; +import org.apache.jackrabbit.core.xml.WorkspaceImporter; +import org.apache.jackrabbit.name.NameException; +import org.apache.jackrabbit.name.Path; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.ContentHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; /** * A WorkspaceImpl ... @@ -770,6 +770,13 @@ return ((ObservationManagerImpl) getObservationManager()).createEventStateCollection(); } + + /** + * {@inheritDoc} + */ + void setReferentialIntegrityChecking(String workspaceName, boolean enabled) throws RepositoryException { + rep.setReferentialIntegrityChecking(workspaceName, enabled); + } }