You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/04/16 15:32:15 UTC

svn commit: r648691 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ./ query/ query/lucene/

Author: mreutegg
Date: Wed Apr 16 06:32:11 2008
New Revision: 648691

URL: http://svn.apache.org/viewvc?rev=648691&view=rev
Log:
JCR-1492: Make behaviour configurable when re-indexing detects workspace inconsistency

Added:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/OnWorkspaceInconsistency.java   (with props)
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/SearchManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/AbstractQueryHandler.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.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=648691&r1=648690&r2=648691&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 Wed Apr 16 06:32:11 2008
@@ -657,7 +657,7 @@
                 SystemSession defSysSession = getSystemSession(wspName);
                 systemSearchMgr = new SearchManager(repConfig.getSearchConfig(),
                         nsReg, ntReg, defSysSession.getItemStateManager(),
-                        SYSTEM_ROOT_NODE_ID, null, null);
+                        vMgr.getPersistenceManager(), SYSTEM_ROOT_NODE_ID, null, null);
                 ObservationManager obsMgr = defSysSession.getWorkspace().getObservationManager();
                 obsMgr.addEventListener(systemSearchMgr, Event.NODE_ADDED
                         | Event.NODE_REMOVED | Event.PROPERTY_ADDED
@@ -1714,6 +1714,7 @@
                             nsReg,
                             ntReg,
                             itemStateMgr,
+                            persistMgr,
                             rootNodeId,
                             getSystemSearchManager(getName()),
                             SYSTEM_ROOT_NODE_ID);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java?rev=648691&r1=648690&r2=648691&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SearchManager.java Wed Apr 16 06:32:11 2008
@@ -31,6 +31,7 @@
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.NodeStateIterator;
+import org.apache.jackrabbit.core.persistence.PersistenceManager;
 import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
 import org.apache.jackrabbit.spi.commons.query.jsr283.qom.QueryObjectModel;
 import org.apache.jackrabbit.spi.commons.query.qom.QueryObjectModelTree;
@@ -115,6 +116,11 @@
     private final ItemStateManager itemMgr;
 
     /**
+     * The underlying persistence manager.
+     */
+    private final PersistenceManager pm;
+
+    /**
      * Storage for search index
      */
     private final FileSystem fs;
@@ -160,22 +166,24 @@
     /**
      * Creates a new <code>SearchManager</code>.
      *
-     * @param config the search configuration.
-     * @param nsReg            the namespace registry.
-     * @param ntReg the node type registry.
-     * @param itemMgr the shared item state manager.
+     * @param config         the search configuration.
+     * @param nsReg          the namespace registry.
+     * @param ntReg          the node type registry.
+     * @param itemMgr        the shared item state manager.
+     * @param pm             the underlying persistence manager.
      * @param rootNodeId     the id of the root node.
-     * @param parentMgr        the parent search manager or <code>null</code> if
-     *                         there is no parent search manager.
+     * @param parentMgr      the parent search manager or <code>null</code> if
+     *                       there is no parent search manager.
      * @param excludedNodeId id of the node that should be excluded from
-     *                         indexing. Any descendant of that node will also
-     *                         be excluded from indexing.
+     *                       indexing. Any descendant of that node will also be
+     *                       excluded from indexing.
      * @throws RepositoryException if the search manager cannot be initialized
      */
     public SearchManager(SearchConfig config,
                          final NamespaceRegistryImpl nsReg,
                          NodeTypeRegistry ntReg,
                          ItemStateManager itemMgr,
+                         PersistenceManager pm,
                          NodeId rootNodeId,
                          SearchManager parentMgr,
                          NodeId excludedNodeId) throws RepositoryException {
@@ -188,6 +196,7 @@
         this.ntReg = ntReg;
         this.nsReg = nsReg;
         this.itemMgr = itemMgr;
+        this.pm = pm;
         this.rootNodeId = rootNodeId;
         this.parentHandler = (parentMgr != null) ? parentMgr.handler : null;
         this.excludedNodeId = excludedNodeId;
@@ -505,7 +514,7 @@
         try {
             handler = (QueryHandler) config.newInstance();
             QueryHandlerContext context
-                    = new QueryHandlerContext(fs, itemMgr, rootNodeId,
+                    = new QueryHandlerContext(fs, itemMgr, pm, rootNodeId,
                             ntReg, nsReg, parentHandler, excludedNodeId);
             handler.init(context);
         } catch (Exception e) {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/AbstractQueryHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/AbstractQueryHandler.java?rev=648691&r1=648690&r2=648691&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/AbstractQueryHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/AbstractQueryHandler.java Wed Apr 16 06:32:11 2008
@@ -17,13 +17,9 @@
 package org.apache.jackrabbit.core.query;
 
 import org.apache.jackrabbit.core.NodeIdIterator;
-import org.apache.jackrabbit.core.SessionImpl;
-import org.apache.jackrabbit.core.ItemManager;
 import org.apache.jackrabbit.core.state.NodeStateIterator;
-import org.apache.jackrabbit.spi.commons.query.qom.QueryObjectModelTree;
 
 import javax.jcr.RepositoryException;
-import javax.jcr.query.InvalidQueryException;
 import java.io.IOException;
 
 /**
@@ -37,6 +33,11 @@
     private QueryHandlerContext context;
 
     /**
+     * The {@link OnWorkspaceInconsistency} handler. Defaults to 'fail'.
+     */
+    private OnWorkspaceInconsistency owi = OnWorkspaceInconsistency.FAIL;
+
+    /**
      * Initializes this query handler by setting all properties in this class
      * with appropriate parameter values.
      *
@@ -64,7 +65,7 @@
     }
 
     /**
-     * This default implementation calls the individual {@link #deleteNode(NodeId)}
+     * This default implementation calls the individual {@link #deleteNode(org.apache.jackrabbit.core.NodeId)}
      * and {@link #addNode(org.apache.jackrabbit.core.state.NodeState)} methods
      * for each entry in the iterators. First the nodes to remove are processed
      * then the nodes to add.
@@ -82,5 +83,34 @@
         while (add.hasNext()) {
             addNode(add.nextNodeState());
         }
+    }
+
+    /**
+     * @return the {@link OnWorkspaceInconsistency} handler.
+     */
+    public OnWorkspaceInconsistency getOnWorkspaceInconsistencyHandler() {
+        return owi;
+    }
+
+    //--------------------------< properties >----------------------------------
+
+    /**
+     * Sets the {@link OnWorkspaceInconsistency} handler with the given name.
+     * Currently the only valid name is:
+     * <ul>
+     * <li><code>fail</code></li>
+     * </ul>
+     *
+     * @param name the name of a {@link OnWorkspaceInconsistency} handler.
+     */
+    public void setOnWorkspaceInconsistency(String name) {
+        owi = OnWorkspaceInconsistency.fromString(name);
+    }
+
+    /**
+     * @return the name of the currently set {@link OnWorkspaceInconsistency}.
+     */
+    public String getOnWorkspaceInconsistency() {
+        return owi.getName();
     }
 }

Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/OnWorkspaceInconsistency.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/OnWorkspaceInconsistency.java?rev=648691&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/OnWorkspaceInconsistency.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/OnWorkspaceInconsistency.java Wed Apr 16 06:32:11 2008
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query;
+
+import org.apache.jackrabbit.core.state.NodeState;
+import org.apache.jackrabbit.core.state.ItemStateException;
+import org.apache.jackrabbit.core.state.NoSuchItemStateException;
+import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+
+import javax.jcr.RepositoryException;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * <code>OnWorkspaceInconsistency</code> defines an interface to handle
+ * workspace inconsistencies.
+ */
+public abstract class OnWorkspaceInconsistency {
+
+    /**
+     * Logger instance for this class.
+     */
+    private static final Logger log = LoggerFactory.getLogger(OnWorkspaceInconsistency.class);
+
+    /**
+     * An handler that simply logs the path of the parent node and the name
+     * of the missing child node and then re-throws the exception.
+     */
+    public static final OnWorkspaceInconsistency FAIL = new OnWorkspaceInconsistency("fail") {
+
+        public void handleMissingChildNode(NoSuchItemStateException exception,
+                                           QueryHandler handler,
+                                           Path path,
+                                           NodeState node,
+                                           NodeState.ChildNodeEntry child)
+                throws RepositoryException, ItemStateException {
+            NamePathResolver resolver = new DefaultNamePathResolver(
+                    handler.getContext().getNamespaceRegistry());
+            log.error("Node {} ({}) has missing child '{}' ({})",
+                    new Object[]{
+                        resolver.getJCRPath(path),
+                        node.getNodeId().getUUID().toString(),
+                        resolver.getJCRName(child.getName()),
+                        child.getId().getUUID().toString()
+                    });
+            throw exception;
+        }
+    };
+
+    protected static final Map INSTANCES = new HashMap();
+
+    static {
+        INSTANCES.put(FAIL.name, FAIL);
+    }
+
+    /**
+     * The name of the {@link OnWorkspaceInconsistency} handler.
+     */
+    private final String name;
+
+    /**
+     * Private constructor.
+     */
+    private OnWorkspaceInconsistency(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the name of this {@link OnWorkspaceInconsistency}.
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Returns the {@link OnWorkspaceInconsistency} with the given
+     * <code>name</code>.
+     *
+     * @param name the name of a {@link OnWorkspaceInconsistency}.
+     * @return the {@link OnWorkspaceInconsistency} with the given
+     *         <code>name</code>.
+     * @throws IllegalArgumentException if <code>name</code> is not a well-known
+     *                                  {@link OnWorkspaceInconsistency} name.
+     */
+    public static OnWorkspaceInconsistency fromString(String name)
+            throws IllegalArgumentException {
+        OnWorkspaceInconsistency handler = (OnWorkspaceInconsistency) INSTANCES.get(name.toLowerCase());
+        if (handler == null) {
+            throw new IllegalArgumentException("Unknown name: " + name);
+        } else {
+            return handler;
+        }
+    }
+
+    /**
+     * Handle a missing child node state.
+     *
+     * @param exception the exception that was thrown when the query handler
+     *                  tried to load the child node state.
+     * @param handler   the query handler.
+     * @param path      the path of the parent node.
+     * @param node      the parent node state.
+     * @param child     the child node entry, for which no node state could be
+     *                  found.
+     * @throws ItemStateException  if an error occurs while handling the missing
+     *                             child node state. This may also be the passed
+     *                             <code>exception</code> instance.
+     * @throws RepositoryException if another error occurs not related to item
+     *                             state reading.
+     */
+    public abstract void handleMissingChildNode(NoSuchItemStateException exception,
+                                                QueryHandler handler,
+                                                Path path,
+                                                NodeState node,
+                                                NodeState.ChildNodeEntry child)
+            throws ItemStateException, RepositoryException;
+}

Propchange: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/OnWorkspaceInconsistency.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java?rev=648691&r1=648690&r2=648691&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/QueryHandlerContext.java Wed Apr 16 06:32:11 2008
@@ -21,6 +21,7 @@
 import org.apache.jackrabbit.core.state.ItemStateManager;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.NamespaceRegistryImpl;
+import org.apache.jackrabbit.core.persistence.PersistenceManager;
 
 /**
  * Acts as an argument for the {@link QueryHandler} to keep the interface
@@ -40,6 +41,11 @@
     private final ItemStateManager stateMgr;
 
     /**
+     * The underlying persistence manager.
+     */
+    private final PersistenceManager pm;
+
+    /**
      * The node type registry of the repository
      */
     private final NodeTypeRegistry ntRegistry;
@@ -77,6 +83,7 @@
      *                         <code>FileSystem</code> has been configured
      *                         <code>fs</code> is <code>null</code>.
      * @param stateMgr         provides persistent item states.
+     * @param pm               the underlying persistence manager.
      * @param rootId           the id of the root node.
      * @param ntRegistry       the node type registry.
      * @param nsRegistry       the namespace registry.
@@ -88,6 +95,7 @@
      */
     public QueryHandlerContext(FileSystem fs,
                                ItemStateManager stateMgr,
+                               PersistenceManager pm,
                                NodeId rootId,
                                NodeTypeRegistry ntRegistry,
                                NamespaceRegistryImpl nsRegistry,
@@ -95,6 +103,7 @@
                                NodeId excludedNodeId) {
         this.fs = fs;
         this.stateMgr = stateMgr;
+        this.pm = pm;
         this.rootId = rootId;
         this.ntRegistry = ntRegistry;
         this.nsRegistry = nsRegistry;
@@ -113,6 +122,13 @@
      */
     public ItemStateManager getItemStateManager() {
         return stateMgr;
+    }
+
+    /**
+     * @return the underlying persistence manager.
+     */
+    public PersistenceManager getPersistenceManager() {
+        return pm;
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?rev=648691&r1=648690&r2=648691&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Wed Apr 16 06:32:11 2008
@@ -29,8 +29,6 @@
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.PathFactory;
 import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
-import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
-import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.lucene.document.Document;
@@ -1042,20 +1040,12 @@
             NodeState.ChildNodeEntry child = (NodeState.ChildNodeEntry) it.next();
             Path childPath = PATH_FACTORY.create(path, child.getName(),
                     child.getIndex(), false);
-            NodeState childState;
+            NodeState childState = null;
             try {
                 childState = (NodeState) stateMgr.getItemState(child.getId());
             } catch (NoSuchItemStateException e) {
-                NamePathResolver resolver = new DefaultNamePathResolver(
-                        handler.getContext().getNamespaceRegistry());
-                log.error("Node {} ({}) has missing child '{}' ({})",
-                        new Object[]{
-                            resolver.getJCRPath(path),
-                            node.getNodeId().getUUID().toString(),
-                            resolver.getJCRName(child.getName()),
-                            child.getId().getUUID().toString()
-                        });
-                throw e;
+                handler.getOnWorkspaceInconsistencyHandler().handleMissingChildNode(
+                        e, handler, path, node, child);
             }
             if (childState != null) {
                 createIndex(childState, childPath, stateMgr);