You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2008/03/02 12:14:37 UTC

svn commit: r632738 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: RepositoryImpl.java state/SharedItemStateManager.java

Author: jukka
Date: Sun Mar  2 03:14:28 2008
New Revision: 632738

URL: http://svn.apache.org/viewvc?rev=632738&view=rev
Log:
JCR-954: Allow to disable referential integrity checking for workspace
    - Added protected RepositoryImpl.setReferentialIntegrityChecking method
      and supporting functionality in SharedItemStateManager
    - Based on patches by Przemo Pakulski

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=632738&r1=632737&r2=632738&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Sun Mar  2 03:14:28 2008
@@ -787,6 +787,24 @@
         return getWorkspaceInfo(workspaceName).getItemStateProvider();
     }
 
+    /**
+     * Enables or disables referential integrity checking for given workspace.
+     * Disabling referential integrity checks can result in a corrupted
+     * workspace, and thus this feature is only available to customized
+     * implementations that subclass RepositoryImpl.
+     *
+     * @see https://issues.apache.org/jira/browse/JCR-954
+     * @param workspace name of the workspace
+     * @param enabled <code>true</code> to enable integrity checking (default),
+     *                <code>false</code> to disable it
+     * @throws RepositoryException if an error occurs
+     */
+    protected void setReferentialIntegrityChecking(
+            String workspace, boolean enabled) throws RepositoryException {
+        SharedItemStateManager manager = getWorkspaceStateManager(workspace);
+        manager.setCheckReferences(enabled);
+    }
+
     ObservationDispatcher getObservationDispatcher(String workspaceName)
             throws NoSuchWorkspaceException {
         // check sanity of this instance

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?rev=632738&r1=632737&r2=632738&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Sun Mar  2 03:14:28 2008
@@ -142,6 +142,16 @@
     private final boolean usesReferences;
 
     /**
+     * Flag indicating whether this item state manager is checking referential
+     * integrity when storing modifications. The default is to to check
+     * for referential integrity.
+     * Should be changed very carefully by experienced developers only.
+     *
+     * @see https://issues.apache.org/jira/browse/JCR-954
+     */
+    private boolean checkReferences = true;
+
+    /**
      * id of root node
      */
     private final NodeId rootNodeId;
@@ -194,6 +204,17 @@
     }
 
     /**
+     * Enables or disables the referential integrity checking, this
+     * should be used very carefully by experienced developers only.
+     *
+     * @see https://issues.apache.org/jira/browse/JCR-954
+     * @param checkReferences whether to do referential integrity checks
+     */
+    public void setCheckReferences(boolean checkReferences) {
+        this.checkReferences = checkReferences;
+    }
+
+    /**
      * enables or disables the write-lock hack. this should only be called by
      * the {@link XAVersionManager}.
      *
@@ -549,10 +570,11 @@
                     updateReferences(local, virtualProvider);
                 }
 
-                /**
-                 * Check whether reference targets exist/were not removed
-                 */
-                checkReferentialIntegrity(local);
+                // If enabled, check whether reference targets
+                // exist/were not removed
+                if (checkReferences) {
+                    checkReferentialIntegrity(local);
+                }
 
                 /**
                  * prepare the events. this needs to be after the referential