You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2009/08/11 17:31:33 UTC
svn commit: r803164 -
/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
Author: mduerig
Date: Tue Aug 11 15:31:32 2009
New Revision: 803164
URL: http://svn.apache.org/viewvc?rev=803164&view=rev
Log:
JCR-2218: NodeEntryImpl.getWorkspaceId() very inefficient
Modified:
jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java?rev=803164&r1=803163&r2=803164&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/hierarchy/NodeEntryImpl.java Tue Aug 11 15:31:32 2009
@@ -297,34 +297,48 @@
* @see NodeEntry#getId()
*/
public NodeId getId() throws InvalidItemStateException, RepositoryException {
- IdFactory idFactory = getIdFactory();
- if (uniqueID != null) {
- return idFactory.createNodeId(uniqueID);
- } else {
- PathFactory pf = getPathFactory();
- if (parent == null) {
- // root node
- return idFactory.createNodeId((String) null, pf.getRootPath());
- } else {
- Path p = pf.create(getName(), getIndex());
- return idFactory.createNodeId(parent.getId(), p);
- }
- }
+ return getId(false);
}
/**
* @see NodeEntry#getWorkspaceId()
*/
public NodeId getWorkspaceId() throws InvalidItemStateException, RepositoryException {
- if (uniqueID != null || parent == null) {
- // uniqueID and root-node -> internal id is always the same as getId().
- return getId();
- } else {
- NodeId parentId = (revertInfo != null)
- ? revertInfo.oldParent.getWorkspaceId()
- : parent.getWorkspaceId();
- return getIdFactory().createNodeId(parentId,
- getPathFactory().create(getName(true), getIndex(true)));
+ return getId(true);
+ }
+
+ private NodeId getId(boolean wspId) throws RepositoryException {
+ if (parent == null) { // shortcut for root
+ return getIdFactory().createNodeId((String) null, getPathFactory().getRootPath()); // fixme: cache root
+ }
+ else if (uniqueID != null) { // shortcut for uniqueID based IDs
+ return getIdFactory().createNodeId(uniqueID);
+ }
+ else {
+ return buildNodeId(this, getPathFactory(), getIdFactory(), wspId);
+ }
+ }
+
+ private static NodeId buildNodeId(NodeEntryImpl entry, PathFactory pathFactory, IdFactory idFactory,
+ boolean wspId) throws RepositoryException {
+
+ PathBuilder pathBuilder = new PathBuilder(pathFactory);
+ while (entry.getParent() != null && entry.getUniqueID() == null) {
+ pathBuilder.addFirst(entry.getName(wspId), entry.getIndex(wspId));
+ entry = (wspId && entry.revertInfo != null)
+ ? entry.revertInfo.oldParent
+ : entry.parent;
+ }
+
+ // We either walked up to an entry below root or up to an uniqueID. In the former
+ // case we construct an NodeId with an absolute path. In the latter case we construct
+ // a NodeId from an uuid and a relative path.
+ if (entry.getParent() == null) {
+ pathBuilder.addRoot();
+ return idFactory.createNodeId((String) null, pathBuilder.getPath());
+ }
+ else {
+ return idFactory.createNodeId(entry.getUniqueID(), pathBuilder.getPath());
}
}