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 2006/03/23 10:40:05 UTC

svn commit: r388123 - in /jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core: ./ nodetype/virtual/ observation/ version/

Author: mreutegg
Date: Thu Mar 23 01:39:44 2006
New Revision: 388123

URL: http://svn.apache.org/viewcvs?rev=388123&view=rev
Log:
JCR-257: Use separate index for jcr:system tree

Removed:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/SystemSearchManager.java
Modified:
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
    jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Thu Mar 23 01:39:44 2006
@@ -251,6 +251,9 @@
             throw e;
         }
 
+        // initialize system search manager
+        getSystemSearchManager(wspName);
+
         // amount of time in seconds before an idle workspace is automatically
         // shut down
         int maxIdleTime = repConfig.getWorkspaceMaxIdleTime();
@@ -558,8 +561,9 @@
             try {
                 if (repConfig.getSearchConfig() != null) {
                     SystemSession defSysSession = getSystemSession(wspName);
-                    systemSearchMgr = new SystemSearchManager(repConfig.getSearchConfig(),
-                            nsReg, ntReg, defSysSession.getItemStateManager(), SYSTEM_ROOT_NODE_ID);
+                    systemSearchMgr = new SearchManager(repConfig.getSearchConfig(),
+                            nsReg, ntReg, defSysSession.getItemStateManager(),
+                            SYSTEM_ROOT_NODE_ID, null, null);
                     ObservationManager obsMgr = defSysSession.getWorkspace().getObservationManager();
                     obsMgr.addEventListener(systemSearchMgr, Event.NODE_ADDED
                             | Event.NODE_REMOVED | Event.PROPERTY_ADDED

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/XASessionImpl.java Thu Mar 23 01:39:44 2006
@@ -150,7 +150,7 @@
             throws RepositoryException {
 
         VersionManagerImpl vMgr = (VersionManagerImpl) rep.getVersionManager();
-        return new XAVersionManager(vMgr, rep.getNodeTypeRegistry(), wsp);
+        return new XAVersionManager(vMgr, rep.getNodeTypeRegistry(), this);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java Thu Mar 23 01:39:44 2006
@@ -27,6 +27,8 @@
 import org.apache.jackrabbit.core.observation.EventState;
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
 import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.name.MalformedPathException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,6 +50,23 @@
      */
     private static Logger log = LoggerFactory.getLogger(VirtualNodeTypeStateManager.class);
 
+    /**
+     * Path: /jcr:system/jcr:nodeTypes
+     */
+    private static final Path NODE_TYPES_PATH;
+
+    static {
+        try {
+            Path.PathBuilder builder = new Path.PathBuilder();
+            builder.addRoot();
+            builder.addLast(QName.JCR_SYSTEM);
+            builder.addLast(QName.JCR_NODETYPES);
+            NODE_TYPES_PATH = builder.getPath();
+        } catch (MalformedPathException e) {
+            // will not happen. path is always valid
+            throw new InternalError("Cannot initialize path");
+        }
+    }
 
     /**
      * an item state provider for the virtual nodetype states
@@ -134,7 +153,7 @@
                 NodeImpl child = root.getNode(ntName);
                 List events = new ArrayList();
                 recursiveAdd(events, root, child);
-                obsDispatcher.dispatch(events, systemSession);
+                obsDispatcher.dispatch(events, systemSession, NODE_TYPES_PATH);
             }
         } catch (RepositoryException e) {
             log.error("Unable to index new nodetype: " + e.toString());
@@ -161,7 +180,7 @@
                 NodeImpl child = root.getNode(ntName);
                 List events = new ArrayList();
                 recursiveRemove(events, root, child);
-                obsDispatcher.dispatch(events, systemSession);
+                obsDispatcher.dispatch(events, systemSession, NODE_TYPES_PATH);
             }
             if (virtProvider != null) {
                 // allow provider to update

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/DelegatingObservationDispatcher.java Thu Mar 23 01:39:44 2006
@@ -18,6 +18,7 @@
 
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.state.ChangeLog;
+import org.apache.jackrabbit.name.Path;
 
 import java.util.HashSet;
 import java.util.Iterator;
@@ -59,8 +60,9 @@
      * @param session event source
      * @return new <code>EventStateCollection</code> instance
      */
-    public EventStateCollection createEventStateCollection(SessionImpl session) {
-        return new EventStateCollection(this, session);
+    public EventStateCollection createEventStateCollection(SessionImpl session,
+                                                           Path pathPrefix) {
+        return new EventStateCollection(this, session, pathPrefix);
     }
 
     //------------------------------------------------------< EventDispatcher >
@@ -83,7 +85,7 @@
      * {@inheritDoc}
      */
     void dispatchEvents(EventStateCollection events) {
-        dispatch(events.getEvents(), events.getSession());
+        dispatch(events.getEvents(), events.getSession(), events.getPathPrefix());
     }
 
     /**
@@ -94,11 +96,11 @@
      * @param eventList
      * @param session
      */
-    public void dispatch(List eventList, SessionImpl session) {
+    public void dispatch(List eventList, SessionImpl session, Path pathPrefix) {
         Iterator iter = dispatchers.iterator();
         while (iter.hasNext()) {
             ObservationManagerFactory fac = (ObservationManagerFactory) iter.next();
-            EventStateCollection events = new EventStateCollection(fac, session);
+            EventStateCollection events = new EventStateCollection(fac, session, pathPrefix);
             events.addAll(eventList);
             events.prepare();
             events.dispatch();

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java Thu Mar 23 01:39:44 2006
@@ -82,15 +82,30 @@
     private final SessionImpl session;
 
     /**
+     * The prefix to use for the event paths or <code>null</code> if no prefix
+     * should be used.
+     */
+    private final Path pathPrefix;
+
+    /**
      * Creates a new empty <code>EventStateCollection</code>.
+     * <p/>
+     * Because the item state manager in {@link #createEventStates} may represent
+     * only a subset of the over all item state hierarchy, this constructor
+     * also takes a path prefix argument. If non <code>null</code> all events
+     * created by this collection are prefixed with this path.
      *
      * @param dispatcher event dispatcher
-     * @param session the session that created these events.
+     * @param session    the session that created these events.
+     * @param pathPrefix the path to prefix the event paths or <code>null</code>
+     *                   if no prefix should be used.
      */
     EventStateCollection(EventDispatcher dispatcher,
-                         SessionImpl session) {
+                         SessionImpl session,
+                         Path pathPrefix) {
         this.dispatcher = dispatcher;
         this.session = session;
+        this.pathPrefix = pathPrefix;
     }
 
     /**
@@ -99,17 +114,17 @@
      *
      * @param rootNodeId   the id of the root node.
      * @param changes      the changes on <code>ItemState</code>s.
-     * @param provider     an <code>ItemStateProvider</code> to provide <code>ItemState</code>
+     * @param stateMgr     an <code>ItemStateManager</code> to provide <code>ItemState</code>
      *                     of items that are not contained in the <code>changes</code> collection.
      * @throws ItemStateException if an error occurs while creating events
      *                            states for the item state changes.
      */
-    public void createEventStates(NodeId rootNodeId, ChangeLog changes, ItemStateManager provider) throws ItemStateException {
+    public void createEventStates(NodeId rootNodeId, ChangeLog changes, ItemStateManager stateMgr) throws ItemStateException {
         // create a hierarchy manager, that is based on the ChangeLog and
         // the ItemStateProvider
         // todo use CachingHierarchyManager ?
         ChangeLogBasedHierarchyMgr hmgr =
-                new ChangeLogBasedHierarchyMgr(rootNodeId, provider, changes,
+                new ChangeLogBasedHierarchyMgr(rootNodeId, stateMgr, changes,
                         session.getNamespaceResolver());
 
         /**
@@ -158,7 +173,7 @@
                         } catch (NoSuchItemStateException e) {
                             // old parent has been deleted, retrieve from
                             // shared item state manager
-                            oldParent = (NodeState) provider.getItemState(oldParentId);
+                            oldParent = (NodeState) stateMgr.getItemState(oldParentId);
                         }
 
                         NodeTypeImpl oldParentNodeType = getNodeType(oldParent, session);
@@ -291,7 +306,7 @@
             } else {
                 // property changed
                 Path path = getPath(state.getId(), hmgr);
-                NodeState parent = (NodeState) provider.getItemState(state.getParentId());
+                NodeState parent = (NodeState) stateMgr.getItemState(state.getParentId());
                 NodeTypeImpl nodeType = getNodeType(parent, session);
                 Set mixins = parent.getMixinTypeNames();
                 events.add(EventState.propertyChanged(state.getParentId(),
@@ -310,7 +325,7 @@
             if (state.isNode()) {
                 // node deleted
                 NodeState n = (NodeState) state;
-                NodeState parent = (NodeState) provider.getItemState(n.getParentId());
+                NodeState parent = (NodeState) stateMgr.getItemState(n.getParentId());
                 NodeTypeImpl nodeType = getNodeType(parent, session);
                 Set mixins = parent.getMixinTypeNames();
                 Path path = getZombiePath(state.getId(), hmgr);
@@ -352,8 +367,8 @@
                 NodeId parentId = n.getParentId();
                 NodeState parent;
                 // unknown if parent node is also new
-                if (provider.hasItemState(parentId)) {
-                    parent = (NodeState) provider.getItemState(parentId);
+                if (stateMgr.hasItemState(parentId)) {
+                    parent = (NodeState) stateMgr.getItemState(parentId);
                 } else {
                     parent = (NodeState) changes.get(parentId);
                 }
@@ -416,6 +431,17 @@
     }
 
     /**
+     * Returns the path prefix for this event state collection or <code>null</code>
+     * if no path prefix was set in the constructor of this collection. See
+     * also {@link EventStateCollection#EventStateCollection}.
+     *
+     * @return the path prefix for this event state collection.
+     */
+    public Path getPathPrefix() {
+        return pathPrefix;
+    }
+
+    /**
      * Returns an iterator over {@link EventState} instance.
      *
      * @return an iterator over {@link EventState} instance.
@@ -491,7 +517,7 @@
     private Path getPath(ItemId itemId, HierarchyManager hmgr)
             throws ItemStateException {
         try {
-            return hmgr.getPath(itemId);
+            return prefixPath(hmgr.getPath(itemId));
         } catch (RepositoryException e) {
             // should never happen actually
             String msg = "Unable to resolve path for item: " + itemId;
@@ -511,12 +537,39 @@
     private Path getZombiePath(ItemId itemId, ChangeLogBasedHierarchyMgr hmgr)
             throws ItemStateException {
         try {
-            return hmgr.getZombiePath(itemId);
+            return prefixPath(hmgr.getZombiePath(itemId));
         } catch (RepositoryException e) {
             // should never happen actually
             String msg = "Unable to resolve zombie path for item: " + itemId;
             log.error(msg);
             throw new ItemStateException(msg, e);
+        }
+    }
+
+    /**
+     * Prefixes the Path <code>p</code> with {@link #pathPrefix}.
+     *
+     * @param p the Path to prefix.
+     * @return the prefixed path or <code>p</code> itself if {@link #pathPrefix}
+     *         is <code>null</code>.
+     * @throws RepositoryException if the path cannot be prefixed.
+     */
+    private Path prefixPath(Path p) throws RepositoryException {
+        if (pathPrefix == null) {
+            return p;
+        }
+        Path.PathBuilder builder = new Path.PathBuilder(pathPrefix.getElements());
+        Path.PathElement[] elements = p.getElements();
+        for (int i = 0; i < elements.length; i++) {
+            if (elements[i].denotesRoot()) {
+                continue;
+            }
+            builder.addLast(elements[i]);
+        }
+        try {
+            return builder.getPath();
+        } catch (MalformedPathException e) {
+            throw new RepositoryException(e);
         }
     }
 }

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/observation/ObservationManagerImpl.java Thu Mar 23 01:39:44 2006
@@ -187,6 +187,6 @@
      * which is attached to this <code>ObservationManager</code> instance.
      */
     public EventStateCollection createEventStateCollection() {
-        return new EventStateCollection(obsMgrFactory, session);
+        return new EventStateCollection(obsMgrFactory, session, null);
     }
 }

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java Thu Mar 23 01:39:44 2006
@@ -38,6 +38,8 @@
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
 import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.Path;
+import org.apache.jackrabbit.name.MalformedPathException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,6 +68,24 @@
     private static Logger log = LoggerFactory.getLogger(VersionManager.class);
 
     /**
+     * The path to the version storage: /jcr:system/jcr:versionStorage
+     */
+    private static final Path VERSION_STORAGE_PATH;
+
+    static {
+        try {
+            Path.PathBuilder builder = new Path.PathBuilder();
+            builder.addRoot();
+            builder.addLast(QName.JCR_SYSTEM);
+            builder.addLast(QName.JCR_VERSIONSTORAGE);
+            VERSION_STORAGE_PATH = builder.getPath();
+        } catch (MalformedPathException e) {
+            // will not happen. path is always valid
+            throw new InternalError("Cannot initialize path");
+        }
+    }
+
+    /**
      * The persistence manager for the versions
      */
     private final PersistenceManager pMgr;
@@ -454,7 +474,16 @@
         if (eventSource == null) {
             throw new RepositoryException("Unknown event source.");
         }
-        return obsMgr.createEventStateCollection(eventSource);
+        return createEventStateCollection(eventSource);
+    }
+
+    /**
+     * Creates an {@link EventStateCollection} using the given <code>source</code>.
+     * @param source the Session that did the changes.
+     * @return <code>EventStateCollection</code>.
+     */
+    EventStateCollection createEventStateCollection(SessionImpl source) {
+        return obsMgr.createEventStateCollection(source, VERSION_STORAGE_PATH);
     }
 
     //--------------------------------------------------------< inner classes >

Modified: jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java
URL: http://svn.apache.org/viewcvs/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java?rev=388123&r1=388122&r2=388123&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java (original)
+++ jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/version/XAVersionManager.java Thu Mar 23 01:39:44 2006
@@ -25,6 +25,7 @@
 import org.apache.jackrabbit.core.TransactionException;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.observation.EventStateCollectionFactory;
+import org.apache.jackrabbit.core.observation.EventStateCollection;
 import org.apache.jackrabbit.core.state.ChangeLog;
 import org.apache.jackrabbit.core.state.ItemState;
 import org.apache.jackrabbit.core.state.ItemStateException;
@@ -53,7 +54,7 @@
  * manager.
  */
 public class XAVersionManager extends AbstractVersionManager
-        implements VirtualItemStateProvider, InternalXAResource {
+        implements EventStateCollectionFactory, VirtualItemStateProvider, InternalXAResource {
 
     /**
      * Attribute name for associated change log.
@@ -76,6 +77,11 @@
     private NodeTypeRegistry ntReg;
 
     /**
+     * The session that uses this version manager.
+     */
+    private SessionImpl session;
+
+    /**
      * Items that have been modified and are part of the XA environment.
      */
     private Map xaItems;
@@ -84,13 +90,14 @@
      * Creates a new instance of this class.
      */
     public XAVersionManager(VersionManagerImpl vMgr, NodeTypeRegistry ntReg,
-                            EventStateCollectionFactory factory)
+                            SessionImpl session)
             throws RepositoryException {
 
         this.vMgr = vMgr;
         this.ntReg = ntReg;
+        this.session = session;
         this.stateMgr = new XAItemStateManager(vMgr.getSharedStateMgr(),
-                factory, CHANGE_LOG_ATTRIBUTE_NAME);
+                this, CHANGE_LOG_ATTRIBUTE_NAME);
 
         NodeState state;
         try {
@@ -99,6 +106,16 @@
             throw new RepositoryException("Unable to retrieve history root", e);
         }
         this.historyRoot = new NodeStateEx(stateMgr, ntReg, state, QName.JCR_VERSIONSTORAGE);
+    }
+
+    //------------------------------------------< EventStateCollectionFactory >
+
+    /**
+     * @inheritDoc
+     */
+    public EventStateCollection createEventStateCollection()
+            throws RepositoryException {
+        return vMgr.createEventStateCollection(session);
     }
 
     //-------------------------------------------------------< VersionManager >