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 2010/09/15 10:34:40 UTC

svn commit: r997227 - in /jackrabbit/trunk: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/ j...

Author: jukka
Date: Wed Sep 15 08:34:39 2010
New Revision: 997227

URL: http://svn.apache.org/viewvc?rev=997227&view=rev
Log:
JCR-2744: Avoid element arrays in PathImpl

Use relative paths instead of path elements in event states

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ChangeLogRecord.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventState.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/UpdateEventFactory.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/AbstractPath.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/CurrentPath.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NamePath.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/ParentPath.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/RelativePath.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/Path.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ChangeLogRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ChangeLogRecord.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ChangeLogRecord.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ChangeLogRecord.java Wed Sep 15 08:34:39 2010
@@ -273,7 +273,7 @@ public class ChangeLogRecord extends Clu
         NodeId parentId = record.readNodeId();
         Path parentPath = record.readPath();
         NodeId childId = record.readNodeId();
-        Path.Element childRelPath = record.readPathElement();
+        Path childRelPath = record.readPathElement();
         Name ntName = record.readQName();
 
         Set<Name> mixins = new HashSet<Name>();
@@ -324,7 +324,7 @@ public class ChangeLogRecord extends Clu
      * @return event state
      */
     private EventState createEventState(int type, NodeId parentId, Path parentPath,
-                                        NodeId childId, Path.Element childRelPath,
+                                        NodeId childId, Path childRelPath,
                                         Name ntName, Set<Name> mixins, String userId) {
         switch (type) {
             case Event.NODE_ADDED:

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/AbstractRecord.java Wed Sep 15 08:34:39 2010
@@ -96,9 +96,9 @@ public abstract class AbstractRecord imp
     /**
      * {@inheritDoc}
      */
-    public void writePathElement(Path.Element element) throws JournalException {
-        writeQName(element.getName());
-        writeInt(element.getIndex());
+    public void writePathElement(Path path) throws JournalException {
+        writeQName(path.getName());
+        writeInt(path.getIndex());
     }
 
     /**
@@ -175,14 +175,14 @@ public abstract class AbstractRecord imp
     /**
      * {@inheritDoc}
      */
-    public Path.Element readPathElement() throws JournalException {
+    public Path readPathElement() throws JournalException {
         try {
             Name name = resolver.getQName(readString());
             int index = readInt();
             if (index != 0) {
-                return PathFactoryImpl.getInstance().createElement(name, index);
+                return PathFactoryImpl.getInstance().create(name, index);
             } else {
-                return PathFactoryImpl.getInstance().createElement(name);
+                return PathFactoryImpl.getInstance().create(name);
             }
         } catch (NameException e) {
             String msg = "Unknown prefix error while reading path element.";

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/journal/Record.java Wed Sep 15 08:34:39 2010
@@ -113,12 +113,12 @@ public interface Record {
     Name readQName() throws JournalException;
 
     /**
-     * Read a <code>Path.Element</code> from the underlying stream.
+     * Read a named path element from the underlying stream.
      *
      * @return path element
      * @throws JournalException if an error occurs
      */
-    Path.Element readPathElement() throws JournalException;
+    Path readPathElement() throws JournalException;
 
     /**
      * Read a <code>Path</code> from the underlying stream.
@@ -222,7 +222,7 @@ public interface Record {
      * @param element path element
      * @throws JournalException if an error occurs
      */
-    void writePathElement(Path.Element element) throws JournalException;
+    void writePathElement(Path element) throws JournalException;
 
     /**
      * Write a <code>Path</code> to the underlying stream.

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/virtual/VirtualNodeTypeStateManager.java Wed Sep 15 08:34:39 2010
@@ -219,7 +219,7 @@ public class VirtualNodeTypeStateManager
                 parent.getNodeId(),
                 parent.getPrimaryPath(),
                 node.getNodeId(),
-                node.getPrimaryPath().getNameElement(),
+                node.getPrimaryPath().getLastElement(),
                 ((NodeTypeImpl) parent.getPrimaryNodeType()).getQName(),
                 parent.getMixinTypeNames(),
                 node.getSession()
@@ -231,7 +231,7 @@ public class VirtualNodeTypeStateManager
             events.add(EventState.propertyAdded(
                     (NodeId) node.getId(),
                     node.getPrimaryPath(),
-                    prop.getPrimaryPath().getNameElement(),
+                    prop.getPrimaryPath().getLastElement(),
                     ((NodeTypeImpl) node.getPrimaryNodeType()).getQName(),
                     node.getMixinTypeNames(),
                     node.getSession()
@@ -260,7 +260,7 @@ public class VirtualNodeTypeStateManager
                 parent.getNodeId(),
                 parent.getPrimaryPath(),
                 node.getNodeId(),
-                node.getPrimaryPath().getNameElement(),
+                node.getPrimaryPath().getLastElement(),
                 ((NodeTypeImpl) parent.getPrimaryNodeType()).getQName(),
                 parent.getMixinTypeNames(),
                 node.getSession()

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventImpl.java Wed Sep 15 08:34:39 2010
@@ -164,7 +164,7 @@ public final class EventImpl implements 
     public Path getQPath() throws RepositoryException {
         try {
             Path parent = eventState.getParentPath();
-            Path.Element child = eventState.getChildRelPath();
+            Path child = eventState.getChildRelPath();
             int index = child.getIndex();
             if (index > 0) {
                 return PathFactoryImpl.getInstance().create(parent, child.getName(), index, false);

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventState.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventState.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventState.java Wed Sep 15 08:34:39 2010
@@ -24,8 +24,6 @@ import org.apache.jackrabbit.core.value.
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.Name;
-import org.apache.jackrabbit.spi.commons.name.PathBuilder;
-import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
 import javax.jcr.observation.Event;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
@@ -99,7 +97,7 @@ public class EventState {
      * The relative path of the child item associated with this event.
      * This is basically the name of the item with an optional index.
      */
-    private final Path.Element childRelPath;
+    private final Path childRelPath;
 
     /**
      * The node type name of the parent node.
@@ -170,7 +168,7 @@ public class EventState {
      * @param session    the {@link javax.jcr.Session} that caused this event.
      */
     private EventState(int type, NodeId parentId, Path parentPath,
-                       NodeId childId, Path.Element childPath, Name nodeType,
+                       NodeId childId, Path childPath, Name nodeType,
                        Set<Name> mixins, Session session, boolean external) {
 
         int mask = (Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED | Event.PROPERTY_REMOVED);
@@ -214,7 +212,7 @@ public class EventState {
     public static EventState childNodeAdded(NodeId parentId,
                                             Path parentPath,
                                             NodeId childId,
-                                            Path.Element childPath,
+                                            Path childPath,
                                             Name nodeType,
                                             Set<Name> mixins,
                                             Session session) {
@@ -242,7 +240,7 @@ public class EventState {
     public static EventState childNodeAdded(NodeId parentId,
                                             Path parentPath,
                                             NodeId childId,
-                                            Path.Element childPath,
+                                            Path childPath,
                                             Name nodeType,
                                             Set<Name> mixins,
                                             Session session,
@@ -270,7 +268,7 @@ public class EventState {
     public static EventState childNodeRemoved(NodeId parentId,
                                               Path parentPath,
                                               NodeId childId,
-                                              Path.Element childPath,
+                                              Path childPath,
                                               Name nodeType,
                                               Set<Name> mixins,
                                               Session session) {
@@ -298,7 +296,7 @@ public class EventState {
     public static EventState childNodeRemoved(NodeId parentId,
                                               Path parentPath,
                                               NodeId childId,
-                                              Path.Element childPath,
+                                              Path childPath,
                                               Name nodeType,
                                               Set<Name> mixins,
                                               Session session,
@@ -330,12 +328,11 @@ public class EventState {
     public static EventState nodeMoved(NodeId parentId,
                                        Path parentPath,
                                        NodeId childId,
-                                       Path.Element childPath,
+                                       Path childPath,
                                        Name nodeType,
                                        Set<Name> mixins,
                                        Session session,
                                        boolean external) {
-
         return new EventState(Event.NODE_MOVED, parentId, parentPath,
                 childId, childPath, nodeType, mixins, session, external);
     }
@@ -358,18 +355,13 @@ public class EventState {
      * @throws ItemStateException if <code>destPath</code> does not have a
      *                            parent.
      */
-    public static EventState nodeMoved(NodeId parentId,
-                                       Path destPath,
-                                       NodeId childId,
-                                       Path srcPath,
-                                       Name nodeType,
-                                       Set<Name> mixins,
-                                       Session session,
-                                       boolean external)
+    public static EventState nodeMovedWithInfo(
+            NodeId parentId, Path destPath, NodeId childId, Path srcPath,
+            Name nodeType, Set<Name> mixins, Session session, boolean external)
             throws ItemStateException {
         try {
             EventState es = nodeMoved(parentId, destPath.getAncestor(1),
-                    childId, destPath.getNameElement(), nodeType, mixins,
+                    childId, destPath, nodeType, mixins,
                     session, external);
             Map<String, InternalValue> info = new HashMap<String, InternalValue>();
             info.put(SRC_ABS_PATH, InternalValue.create(srcPath));
@@ -410,15 +402,16 @@ public class EventState {
     public static EventState nodeReordered(NodeId parentId,
                                            Path parentPath,
                                            NodeId childId,
-                                           Path.Element destChildPath,
-                                           Path.Element srcChildPath,
-                                           Path.Element beforeChildPath,
+                                           Path destChildPath,
+                                           Path srcChildPath,
+                                           Path beforeChildPath,
                                            Name nodeType,
                                            Set<Name> mixins,
                                            Session session,
                                            boolean external) {
-        EventState es = nodeMoved(parentId, parentPath, childId, destChildPath,
-               nodeType, mixins, session, external);
+        EventState es = nodeMoved(
+                parentId, parentPath, childId, destChildPath,
+                nodeType, mixins, session, external);
         Map<String, InternalValue> info = new HashMap<String, InternalValue>();
         info.put(SRC_CHILD_REL_PATH, createValue(srcChildPath));
         InternalValue value = null;
@@ -446,7 +439,7 @@ public class EventState {
      */
     public static EventState propertyAdded(NodeId parentId,
                                            Path parentPath,
-                                           Path.Element childPath,
+                                           Path childPath,
                                            Name nodeType,
                                            Set<Name> mixins,
                                            Session session) {
@@ -472,7 +465,7 @@ public class EventState {
      */
     public static EventState propertyAdded(NodeId parentId,
                                            Path parentPath,
-                                           Path.Element childPath,
+                                           Path childPath,
                                            Name nodeType,
                                            Set<Name> mixins,
                                            Session session,
@@ -498,7 +491,7 @@ public class EventState {
      */
     public static EventState propertyRemoved(NodeId parentId,
                                              Path parentPath,
-                                             Path.Element childPath,
+                                             Path childPath,
                                              Name nodeType,
                                              Set<Name> mixins,
                                              Session session) {
@@ -524,7 +517,7 @@ public class EventState {
      */
     public static EventState propertyRemoved(NodeId parentId,
                                              Path parentPath,
-                                             Path.Element childPath,
+                                             Path childPath,
                                              Name nodeType,
                                              Set<Name> mixins,
                                              Session session,
@@ -550,7 +543,7 @@ public class EventState {
      */
     public static EventState propertyChanged(NodeId parentId,
                                              Path parentPath,
-                                             Path.Element childPath,
+                                             Path childPath,
                                              Name nodeType,
                                              Set<Name> mixins,
                                              Session session) {
@@ -576,7 +569,7 @@ public class EventState {
      */
     public static EventState propertyChanged(NodeId parentId,
                                              Path parentPath,
-                                             Path.Element childPath,
+                                             Path childPath,
                                              Name nodeType,
                                              Set<Name> mixins,
                                              Session session,
@@ -626,9 +619,9 @@ public class EventState {
      * Returns the relative {@link Path} of the child
      * {@link javax.jcr.Item} associated with this event.
      *
-     * @return the <code>Path.Element</code> associated with this event.
+     * @return the <code>Path</code> associated with this event.
      */
-    public Path.Element getChildRelPath() {
+    public Path getChildRelPath() {
         return childRelPath;
     }
 
@@ -846,19 +839,12 @@ public class EventState {
     }
 
     /**
-     * Creates an internal path value from the given path <code>element</code>.
+     * Creates an internal path value from the given path.
      *
-     * @param element the path element.
-     * @return an internal value wrapping the path element.
+     * @param path the path
+     * @return an internal value wrapping the path
      */
-    private static InternalValue createValue(Path.Element element) {
-        PathBuilder builder = new PathBuilder();
-        builder.addFirst(element);
-        try {
-            return InternalValue.create(builder.getPath());
-        } catch (MalformedPathException e) {
-            // this exception is only thrown when number of element is zero
-            throw new InternalError();
-        }
+    private static InternalValue createValue(Path path) {
+        return InternalValue.create(path);
     }
 }

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java Wed Sep 15 08:34:39 2010
@@ -209,7 +209,7 @@ public final class EventStateCollection 
                             NodeTypeImpl oldParentNodeType = getNodeType(oldParent, session);
                             events.add(EventState.childNodeRemoved(oldParentId,
                                     getParent(oldPath), n.getNodeId(),
-                                    oldPath.getNameElement(),
+                                    oldPath.getLastElement(),
                                     oldParentNodeType.getQName(),
                                     oldParent.getMixinTypeNames(), session));
                         } else {
@@ -230,12 +230,12 @@ public final class EventStateCollection 
                         Path newPath = getPath(n.getNodeId(), hmgr);
                         events.add(EventState.childNodeAdded(newParentId,
                                 getParent(newPath), n.getNodeId(),
-                                newPath.getNameElement(),
+                                newPath.getLastElement(),
                                 newParentNodeType.getQName(),
                                 mixins, session));
 
-                        events.add(EventState.nodeMoved(newParentId,
-                                newPath, n.getNodeId(), oldPath,
+                        events.add(EventState.nodeMovedWithInfo(
+                                newParentId, newPath, n.getNodeId(), oldPath,
                                 newParentNodeType.getQName(), mixins,
                                 session, false));
                     } else {
@@ -283,15 +283,15 @@ public final class EventStateCollection 
                                 }
                                 events.add(EventState.childNodeRemoved(
                                         parent.getNodeId(), parentPath,
-                                        n.getNodeId(), oldPath.getNameElement(),
+                                        n.getNodeId(), oldPath.getLastElement(),
                                         nodeType.getQName(), mixins, session));
 
                                 events.add(EventState.childNodeAdded(
                                         parent.getNodeId(), parentPath,
-                                        n.getNodeId(), newPath.getNameElement(),
+                                        n.getNodeId(), newPath.getLastElement(),
                                         nodeType.getQName(), mixins, session));
 
-                                events.add(EventState.nodeMoved(
+                                events.add(EventState.nodeMovedWithInfo(
                                         parent.getNodeId(), newPath, n.getNodeId(),
                                         oldPath, nodeType.getQName(), mixins,
                                         session, false));
@@ -308,7 +308,7 @@ public final class EventStateCollection 
                     // create a node removed and a node added event for every
                     // reorder
                     for (ChildNodeEntry child : reordered) {
-                        Path.Element addedElem = getPathElement(child);
+                        Path addedElem = getPathElement(child);
                         Path parentPath = getPath(n.getNodeId(), hmgr);
                         // get removed index
                         NodeState overlayed = (NodeState) n.getOverlayedState();
@@ -316,7 +316,7 @@ public final class EventStateCollection 
                         if (entry == null) {
                             throw new ItemStateException("Unable to retrieve old child index for item: " + child.getId());
                         }
-                        Path.Element removedElem = getPathElement(entry);
+                        Path removedElem = getPathElement(entry);
 
                         events.add(EventState.childNodeRemoved(n.getNodeId(),
                                 parentPath, child.getId(), removedElem,
@@ -330,7 +330,7 @@ public final class EventStateCollection 
                         // index of the child node entry before which this
                         // child node entry was reordered
                         int idx = cne.indexOf(child) + 1;
-                        Path.Element beforeElem = null;
+                        Path beforeElem = null;
                         if (idx < cne.size()) {
                             beforeElem = getPathElement(cne.get(idx));
                         }
@@ -351,7 +351,7 @@ public final class EventStateCollection 
                 NodeTypeImpl nodeType = getNodeType(parent, session);
                 Set<Name> mixins = parent.getMixinTypeNames();
                 events.add(EventState.propertyChanged(state.getParentId(),
-                        getParent(path), path.getNameElement(),
+                        getParent(path), path.getLastElement(),
                         nodeType.getQName(), mixins, session));
             }
         }
@@ -368,7 +368,7 @@ public final class EventStateCollection 
                 events.add(EventState.childNodeRemoved(n.getParentId(),
                         getParent(path),
                         n.getNodeId(),
-                        path.getNameElement(),
+                        path.getLastElement(),
                         nodeType.getQName(),
                         mixins,
                         session));
@@ -386,7 +386,7 @@ public final class EventStateCollection 
                     Path path = getZombiePath(state.getId(), hmgr);
                     events.add(EventState.propertyRemoved(state.getParentId(),
                             getParent(path),
-                            path.getNameElement(),
+                            path.getLastElement(),
                             nodeType.getQName(),
                             mixins,
                             session));
@@ -415,7 +415,7 @@ public final class EventStateCollection 
                 events.add(EventState.childNodeAdded(parentId,
                         getParent(path),
                         n.getNodeId(),
-                        path.getNameElement(),
+                        path.getLastElement(),
                         nodeType.getQName(),
                         mixins,
                         session));
@@ -435,7 +435,7 @@ public final class EventStateCollection 
                 Path path = getPath(state.getId(), hmgr);
                 events.add(EventState.propertyAdded(state.getParentId(),
                         getParent(path),
-                        path.getNameElement(),
+                        path.getLastElement(),
                         nodeType.getQName(),
                         mixins,
                         session));
@@ -695,15 +695,12 @@ public final class EventStateCollection 
      * @return the name element for the node.
      * @throws ItemStateException if an error occurs while resolving the name.
      */
-    private Path.Element getNameElement(NodeId nodeId,
-                                        NodeId parentId,
-                                        HierarchyManager hmgr)
+    private Path getNameElement(
+            NodeId nodeId, NodeId parentId, HierarchyManager hmgr)
             throws ItemStateException {
         try {
             Name name = hmgr.getName(nodeId, parentId);
-            PathBuilder builder = new PathBuilder();
-            builder.addFirst(name);
-            return builder.getPath().getNameElement();
+            return PathFactoryImpl.getInstance().create(name);
         } catch (RepositoryException e) {
             String msg = "Unable to get name for node with id: " + nodeId;
             throw new ItemStateException(msg, e);
@@ -722,15 +719,12 @@ public final class EventStateCollection 
      * @return the name element for the node.
      * @throws ItemStateException if an error occurs while resolving the name.
      */
-    private Path.Element getZombieNameElement(NodeId nodeId,
-                                              NodeId parentId,
-                                              ChangeLogBasedHierarchyMgr hmgr)
+    private Path getZombieNameElement(
+            NodeId nodeId, NodeId parentId, ChangeLogBasedHierarchyMgr hmgr)
             throws ItemStateException {
         try {
             Name name = hmgr.getZombieName(nodeId, parentId);
-            PathBuilder builder = new PathBuilder();
-            builder.addFirst(name);
-            return builder.getPath().getNameElement();
+            return PathFactoryImpl.getInstance().create(name);
         } catch (RepositoryException e) {
             // should never happen actually
             String msg = "Unable to resolve zombie name for item: " + nodeId;
@@ -788,10 +782,10 @@ public final class EventStateCollection 
      * @param entry a child node entry.
      * @return the path element for the given entry.
      */
-    private Path.Element getPathElement(ChildNodeEntry entry) {
+    private Path getPathElement(ChildNodeEntry entry) {
         Name name = entry.getName();
         int index = (entry.getIndex() != 1) ? entry.getIndex() : 0;
-        return PathFactoryImpl.getInstance().createElement(name, index);
+        return PathFactoryImpl.getInstance().create(name, index);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/UpdateEventFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/UpdateEventFactory.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/UpdateEventFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/cluster/UpdateEventFactory.java Wed Sep 15 08:34:39 2010
@@ -187,7 +187,7 @@ public class UpdateEventFactory {
      */
     protected EventState createEventState(NodeState n, int type, String name,
                                           Session session) {
-        Path.Element relPath = pathFactory.createElement(nameFactory.create(name));
+        Path relPath = pathFactory.create(nameFactory.create(name));
 
         switch (type) {
         case Event.NODE_ADDED:
@@ -215,7 +215,7 @@ public class UpdateEventFactory {
      */
     protected EventState createEventState(PropertyState p, NodeState parent, int type,
                                           Session session) {
-        Path.Element relPath = pathFactory.createElement(p.getName());
+        Path relPath = pathFactory.create(p.getName());
 
         switch (type) {
         case Event.PROPERTY_ADDED:

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/AbstractPath.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/AbstractPath.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/AbstractPath.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/AbstractPath.java Wed Sep 15 08:34:39 2010
@@ -98,6 +98,26 @@ abstract class AbstractPath implements P
         return false;
     }
 
+    /**
+     * Returns this path, except when overridden by the {@link RelativePath}
+     * subclasses.
+     *
+     * @return this path
+     */
+    public Path getLastElement() {
+        return this;
+    }
+
+    /**
+     * Returns <code>null</code>, except when overridden by the
+     * {@link RelativePath} subclass.
+     *
+     * @return <code>null</code>
+     */
+    public Path getFirstElements() {
+        return null;
+    }
+
     public final Path resolve(Element element) {
         if (element.denotesName()) {
             return new NamePath(this, element);

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/CurrentPath.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/CurrentPath.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/CurrentPath.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/CurrentPath.java Wed Sep 15 08:34:39 2010
@@ -96,6 +96,16 @@ final class CurrentPath extends Relative
         return CurrentElement.INSTANCE;
     }
 
+    /**
+     * Returns the current path ".".
+     *
+     * @return current path
+     */
+    @Override
+    public Path getLastElement() {
+        return new CurrentPath(null);
+    }
+
     public String getString() {
         if (parent != null) {
             return parent.getString() + Path.DELIMITER + ".";

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NamePath.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NamePath.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NamePath.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NamePath.java Wed Sep 15 08:34:39 2010
@@ -108,6 +108,16 @@ final class NamePath extends RelativePat
         return element;
     }
 
+    /**
+     * Returns the last element of this path.
+     *
+     * @return last element of this path
+     */
+    @Override
+    public Path getLastElement() {
+        return new NamePath(null, element);
+    }
+
     public String getString() {
         if (parent != null) {
             return parent.getString() + Path.DELIMITER + element.getString();

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/ParentPath.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/ParentPath.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/ParentPath.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/ParentPath.java Wed Sep 15 08:34:39 2010
@@ -106,6 +106,16 @@ final class ParentPath extends RelativeP
         return ParentElement.INSTANCE;
     }
 
+    /**
+     * Returns the parent path "..".
+     *
+     * @return parent path
+     */
+    @Override
+    public Path getLastElement() {
+        return new ParentPath(null);
+    }
+
     public String getString() {
         if (parent != null) {
             return parent.getString() + Path.DELIMITER + "..";

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/RelativePath.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/RelativePath.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/RelativePath.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/RelativePath.java Wed Sep 15 08:34:39 2010
@@ -124,6 +124,16 @@ abstract class RelativePath extends Abst
         return elements;
     }
 
+    /**
+     * Returns the first elements of this path.
+     *
+     * @return first elements of this path, or <code>null</code>
+     */
+    @Override
+    public Path getFirstElements() {
+        return parent;
+    }
+
     //--------------------------------------------------------------< Object >
 
     public final boolean equals(Object that) {

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/Path.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/Path.java?rev=997227&r1=997226&r2=997227&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/Path.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/Path.java Wed Sep 15 08:34:39 2010
@@ -445,6 +445,23 @@ public interface Path extends Serializab
     public Element getNameElement();
 
     /**
+     * Returns a path that consists of only the last element of this path.
+     *
+     * @see #getFirstElements()
+     * @return last element of this path
+     */
+    Path getLastElement();
+
+    /**
+     * Returns a path that consists of all but the last element of this path.
+     * Returns <code>null</code> if this path contains just a single element.
+     *
+     * @see #getLastElement()
+     * @return first elements of this path, or <code>null</code>
+     */
+    Path getFirstElements();
+
+    /**
      * Returns the String representation of this Path as it is used
      * by {@link PathFactory#create(String)}.<p/>
      * The String representation must consist of the String representation of