You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2009/05/14 11:20:54 UTC

svn commit: r774702 - in /jackrabbit/trunk: jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/identifier/ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/sp...

Author: angela
Date: Thu May 14 09:20:52 2009
New Revision: 774702

URL: http://svn.apache.org/viewvc?rev=774702&view=rev
Log:
JCR-2111: JSR 283 Node Identifier

Modified:
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
    jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/identifier/AbstractIdFactory.java
    jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/IdFactoryLogger.java
    jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/IdFactoryImpl.java
    jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java?rev=774702&r1=774701&r2=774702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java Thu May 14 09:20:52 2009
@@ -562,8 +562,7 @@
      */
     public String getIdentifier() throws RepositoryException {
         checkStatus();
-        // TODO: check again and add SPI method to create Node-Identifier from String
-        return getNodeEntry().getId().toString();
+        return session.getIdFactory().toJcrIdentifier(getNodeEntry().getId());
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java?rev=774702&r1=774701&r2=774702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java Thu May 14 09:20:52 2009
@@ -502,8 +502,7 @@
      * @see Session#getNodeByIdentifier(String)
      */
     public Node getNodeByIdentifier(String id) throws RepositoryException {
-        // TODO: implementation missing
-        throw new UnsupportedRepositoryOperationException("JCR-1104");
+        return getNodeById(getIdFactory().fromJcrIdentifier(id));
     }
 
     /**
@@ -985,7 +984,7 @@
          */
         public Path getPath(String identifier) throws MalformedPathException {
             try {
-                NodeId id = getIdFactory().createNodeId(identifier);
+                NodeId id = getIdFactory().fromJcrIdentifier(identifier);
                 return getHierarchyManager().getNodeEntry(id).getPath();
             } catch (RepositoryException e) {
                 throw new MalformedPathException("Invalid identifier '" + identifier + "'.");
@@ -997,7 +996,7 @@
          */
         public void checkFormat(String identifier) throws MalformedPathException {
             try {
-                NodeId id = getIdFactory().createNodeId(identifier);
+                NodeId id = getIdFactory().fromJcrIdentifier(identifier);
             } catch (Exception e) {
                 throw new MalformedPathException("Invalid identifier '" + identifier + "'.");
             }

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/identifier/AbstractIdFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/identifier/AbstractIdFactory.java?rev=774702&r1=774701&r2=774702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/identifier/AbstractIdFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/identifier/AbstractIdFactory.java Thu May 14 09:20:52 2009
@@ -23,6 +23,7 @@
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.PathFactory;
+import org.apache.jackrabbit.util.Text;
 
 import javax.jcr.RepositoryException;
 import java.io.Serializable;
@@ -32,13 +33,9 @@
  */
 public abstract class AbstractIdFactory implements IdFactory {
 
-    /**
-     * Subclassed need to define a PathFactory used to create IDs
-     *
-     * @return a implementation of <code>PathFactory</code>.
-     */
-    protected abstract PathFactory getPathFactory();
+    private static final char DELIMITER = '@';
 
+    //----------------------------------------------------------< IdFactory >---
     /**
      * {@inheritDoc}
      * @see IdFactory#createNodeId(NodeId, Path)
@@ -79,6 +76,52 @@
         }
     }
 
+    /**
+     * @see IdFactory#toJcrIdentifier(NodeId)
+     */
+    public String toJcrIdentifier(NodeId nodeId) {
+        // TODO improve
+        String uniqueId = nodeId.getUniqueID();
+        Path path = nodeId.getPath();
+        if (path == null) {
+            return uniqueId;
+        } else if (uniqueId == null) {
+            return DELIMITER + path.toString();
+        } else {
+            StringBuffer bf = new StringBuffer();
+            bf.append(Text.escape(uniqueId, DELIMITER));
+            bf.append(DELIMITER);
+            bf.append(path.toString());
+            return bf.toString();
+        }
+    }
+
+    /**
+     * @see IdFactory#fromJcrIdentifier(String)
+     */
+    public NodeId fromJcrIdentifier(String jcrIdentifier) {
+        // TODO improve
+        int pos = jcrIdentifier.indexOf(DELIMITER);
+        switch (pos) {
+            case -1:
+                return createNodeId(jcrIdentifier);
+            case 0:
+                return createNodeId((String) null, getPathFactory().create(jcrIdentifier.substring(1)));
+            default:
+                String uniqueId = Text.unescape(jcrIdentifier.substring(0, pos), DELIMITER);
+                Path path = getPathFactory().create(jcrIdentifier.substring(pos+1));
+                return createNodeId(uniqueId, path);
+        }        
+    }
+
+    //--------------------------------------------------------------------------
+    /**
+     * Subclassed need to define a PathFactory used to create IDs
+     *
+     * @return a implementation of <code>PathFactory</code>.
+     */
+    protected abstract PathFactory getPathFactory();
+
     //------------------------------------------------------< Inner classes >---
 
     private static abstract class ItemIdImpl implements ItemId, Serializable {

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/IdFactoryLogger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/IdFactoryLogger.java?rev=774702&r1=774701&r2=774702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/IdFactoryLogger.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/IdFactoryLogger.java Thu May 14 09:20:52 2009
@@ -74,4 +74,18 @@
             }}, "createNodeId(String)", new Object[]{uniqueID});
     }
 
+    public String toJcrIdentifier(final NodeId nodeId) {
+        return (String) execute(new SafeCallable() {
+            public Object call() {
+                return idFactory.toJcrIdentifier(nodeId);
+            }}, "toJcrIdentifier(String)", new Object[]{nodeId});
+    }
+
+    public NodeId fromJcrIdentifier(final String jcrIdentifier) {
+        return (NodeId) execute(new SafeCallable() {
+            public Object call() {
+                return idFactory.fromJcrIdentifier(jcrIdentifier);
+            }}, "fromJcrIdentifier(String)", new Object[]{jcrIdentifier});
+    }
+
 }

Modified: jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java?rev=774702&r1=774701&r2=774702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java (original)
+++ jackrabbit/trunk/jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/IdFactory.java Thu May 14 09:20:52 2009
@@ -68,5 +68,22 @@
      * @see ItemId ItemId for a description of the uniqueID defined by the SPI
      * item identifiers.
      */
-    public NodeId createNodeId(String uniqueID);
+    public NodeId createNodeId(String uniqueID);    
+
+    /**
+     * Returns the JCR string representation of the given <code>nodeId</code>.
+     *
+     * @return a JCR node identifier string.
+     * @see #fromJcrIdentifier(String)
+     */
+    public String toJcrIdentifier(NodeId nodeId);
+
+    /**
+     * Create a new <code>NodeId</code> from the given JCR string representation.
+     *
+     * @param jcrIdentifier
+     * @return a new <code>NodeId</code>.
+     * @see #toJcrIdentifier(NodeId)
+     */
+    public NodeId fromJcrIdentifier(String jcrIdentifier);
 }
\ No newline at end of file

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/IdFactoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/IdFactoryImpl.java?rev=774702&r1=774701&r2=774702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/IdFactoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/IdFactoryImpl.java Thu May 14 09:20:52 2009
@@ -29,7 +29,6 @@
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
-import javax.jcr.UnsupportedRepositoryOperationException;
 import javax.jcr.Property;
 
 /**
@@ -61,39 +60,8 @@
             throws RepositoryException {
         PathBuilder builder = new PathBuilder();
         int pathElements = 0;
-        String uniqueId = null;
-        while (uniqueId == null) {
-            try {
-                uniqueId = node.getUUID();
-            } catch (UnsupportedRepositoryOperationException e) {
-                // not referenceable
-                pathElements++;
-                String jcrName = node.getName();
-                if (jcrName.equals("")) {
-                    // root node
-                    builder.addRoot();
-                    break;
-                } else {
-                    Name name;
-                    try {
-                        name = resolver.getQName(node.getName());
-                    } catch (NameException ex) {
-                       throw new RepositoryException(ex.getMessage(), ex);
-                    }
-                    if (node.getIndex() == 1) {
-                        builder.addFirst(name);
-                    } else {
-                        builder.addFirst(name, node.getIndex());
-                    }
-                }
-                node = node.getParent();
-            }
-        }
-        if (pathElements > 0) {
-            return createNodeId(uniqueId, builder.getPath());
-        } else {
-            return createNodeId(uniqueId);
-        }
+        String uniqueId = node.getIdentifier();
+        return createNodeId(uniqueId);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java?rev=774702&r1=774701&r2=774702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/main/java/org/apache/jackrabbit/spi2jcr/RepositoryServiceImpl.java Thu May 14 09:20:52 2009
@@ -1490,7 +1490,7 @@
         Session session = sessionInfo.getSession();
         StringBuffer path = new StringBuffer();
         if (id.getUniqueID() != null) {
-            path.append(session.getNodeByUUID(id.getUniqueID()).getPath());
+            path.append(session.getNodeByIdentifier(id.getUniqueID()).getPath());
         } else {
             path.append("/");
         }
@@ -1522,6 +1522,10 @@
             // if the parent of an batch operation is not available, this indicates
             // that it has been destroyed by another session.
             throw new InvalidItemStateException(e);
+        } catch (ItemNotFoundException e) {
+            // if the parent of an batch operation is not available, this indicates
+            // that it has been destroyed by another session.
+            throw new InvalidItemStateException(e);
         }
     }
 
@@ -1529,7 +1533,7 @@
         Session session = sessionInfo.getSession();
         Node n;
         if (id.getUniqueID() != null) {
-            n = session.getNodeByUUID(id.getUniqueID());
+            n = session.getNodeByIdentifier(id.getUniqueID());
         } else {
             n = session.getRootNode();
         }
@@ -1554,7 +1558,7 @@
         Session session = sessionInfo.getSession();
         Node n;
         if (id.getUniqueID() != null) {
-            n = session.getNodeByUUID(id.getUniqueID());
+            n = session.getNodeByIdentifier(id.getUniqueID());
         } else {
             n = session.getRootNode();
         }