You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2012/04/25 16:07:21 UTC

svn commit: r1330298 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/ oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/

Author: reschke
Date: Wed Apr 25 14:07:20 2012
New Revision: 1330298

URL: http://svn.apache.org/viewvc?rev=1330298&view=rev
Log:
OAK-61: add oak->jcr conversion plus test cases, add transformation to a few experimental places in *Impl (WIP)

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/Paths.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/PathsTest.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/AbstractNameMapper.java Wed Apr 25 14:07:20 2012
@@ -57,8 +57,7 @@ public abstract class AbstractNameMapper
             String name = jcrName.substring(pos + 1);
             String oakPrefix = getOakPrefix(pref);
             if (oakPrefix == null) {
-                // TODO
-                return null;
+                throw new IllegalArgumentException("prefix '" + pref + "' is not mapped" );
             } else {
                 return oakPrefix + ":" + name;
             }
@@ -74,10 +73,16 @@ public abstract class AbstractNameMapper
         } else {
             String pref = oakName.substring(0, pos);
             String name = oakName.substring(pos + 1);
+
+            if (pref.startsWith("{")) {
+                throw new IllegalStateException(
+                        "invalid oak name (maybe expanded name leaked out?): "
+                                + oakName);
+            }
+
             String jcrPrefix = getJcrPrefix(pref);
             if (jcrPrefix == null) {
-                // TODO
-                return null;
+                throw new IllegalStateException("invalid oak name: " + oakName);
             } else {
                 return jcrPrefix + ":" + name;
             }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/Paths.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/Paths.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/Paths.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/Paths.java Wed Apr 25 14:07:20 2012
@@ -16,15 +16,14 @@
 */
 package org.apache.jackrabbit.oak.namepath;
 
-import org.apache.jackrabbit.mk.util.PathUtils;
-import org.apache.jackrabbit.oak.namepath.JcrNameParser.Listener;
-import org.apache.jackrabbit.oak.util.Function1;
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 
+import org.apache.jackrabbit.mk.util.PathUtils;
+import org.apache.jackrabbit.oak.namepath.JcrNameParser.Listener;
+
 /**
  * All path in the Oak API have the following form
  * <p>
@@ -188,18 +187,18 @@ public final class Paths {
         return true;
     }
 
-    public static String toOakName(String name, final NameMapper nm) {
+    public static String toOakName(String name, final NameMapper mapper) {
         final StringBuilder element = new StringBuilder();
         
         Listener listener = new JcrNameParser.Listener() {
             @Override
             public void error(String message) {
-                // todo implement error
+                throw new RuntimeException(message);
             }
 
             @Override
             public void name(String name) {
-                String p = nm.getOakName(name);
+                String p = mapper.getOakName(name);
                 element.append(p);
             }
         };
@@ -208,14 +207,14 @@ public final class Paths {
         return element.toString();
     }
     
-    public static String toOakPath(String path, final NameMapper nm) {
+    public static String toOakPath(String jcrPath, final NameMapper mapper) {
         final List<String> elements = new ArrayList<String>();
         
         JcrPathParser.Listener listener = new JcrPathParser.Listener() {
             @Override
             public void root() {
                 if (!elements.isEmpty()) {
-                    // todo error
+                    throw new RuntimeException("/ on non-empty path");
                 }
                 elements.add("");
             }
@@ -223,7 +222,7 @@ public final class Paths {
             @Override
             public void identifier(String identifier) {
                 if (!elements.isEmpty()) {
-                    // todo error
+                    throw new RuntimeException("[identifier] on non-empty path");
                 }
                 elements.add(identifier);  // todo resolve identifier
                 // todo seal
@@ -237,7 +236,7 @@ public final class Paths {
             @Override
             public void parent() {
                 if (elements.isEmpty()) {
-                    // todo error
+                    throw new RuntimeException(".. of empty path");
                 }
                 elements.remove(elements.size() - 1);
             }
@@ -245,7 +244,7 @@ public final class Paths {
             @Override
             public void index(int index) {
                 if (index > 1) {
-                    // todo error
+                    throw new RuntimeException("index > 1");
                 }
             }
 
@@ -256,12 +255,12 @@ public final class Paths {
 
             @Override
             public void name(String name) {
-                String p = nm.getOakName(name);
+                String p = mapper.getOakName(name);
                 elements.add(p);
             }
         };
 
-        JcrPathParser.parse(path, listener);
+        JcrPathParser.parse(jcrPath, listener);
         
         StringBuilder oakPath = new StringBuilder();
         for (String element : elements) {
@@ -279,6 +278,77 @@ public final class Paths {
         return oakPath.toString();
     }
     
+    public static String toJcrPath(String oakPath, final NameMapper mapper) {
+        final List<String> elements = new ArrayList<String>();
+        
+        JcrPathParser.Listener listener = new JcrPathParser.Listener() {
+            @Override
+            public void root() {
+                if (!elements.isEmpty()) {
+                    throw new RuntimeException("/ on non-empty path");
+                }
+                elements.add("");
+            }
+
+            @Override
+            public void identifier(String identifier) {
+                if (!elements.isEmpty()) {
+                    throw new RuntimeException("[identifier] on non-empty path");
+                }
+                elements.add(identifier);  // todo resolve identifier
+                // todo seal
+            }
+
+            @Override
+            public void current() {
+                // nothing to do here
+            }
+
+            @Override
+            public void parent() {
+                if (elements.isEmpty()) {
+                    throw new RuntimeException(".. of empty path");
+                }
+                elements.remove(elements.size() - 1);
+            }
+
+            @Override
+            public void index(int index) {
+                if (index > 1) {
+                    throw new RuntimeException("index > 1");
+                }
+            }
+
+            @Override
+            public void error(String message) {
+                throw new RuntimeException(message);
+            }
+
+            @Override
+            public void name(String name) {
+                String p = mapper.getJcrName(name);
+                elements.add(p);
+            }
+        };
+
+        JcrPathParser.parse(oakPath, listener);
+        
+        StringBuilder jcrPath = new StringBuilder();
+        for (String element : elements) {
+            if (element.isEmpty()) {
+                // root
+                jcrPath.append('/');
+            }
+            else {
+                jcrPath.append(element);
+                jcrPath.append('/');
+            }
+        }
+        
+        jcrPath.deleteCharAt(jcrPath.length() - 1);
+        return jcrPath.toString();
+    }
+
     //------------------------------------------------------------< private >--- 
 
     private static Iterable<String> split(final String string, final char separator) {

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/PathsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/PathsTest.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/PathsTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/namepath/PathsTest.java Wed Apr 25 14:07:20 2012
@@ -1,24 +1,25 @@
 /*
-* 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.
-*/
+ * 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.oak.namepath;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -28,13 +29,13 @@ import org.junit.Test;
 public class PathsTest {
 
     private TestNameMapper mapper = new TestNameMapper();
-    
+
     @Test
     public void getPrefix() {
         assertEquals(null, Paths.getPrefixFromElement("foo"));
         assertEquals("foo", Paths.getPrefixFromElement("foo:bar"));
     }
-    
+
     @Test
     public void getName() {
         assertEquals("foo", Paths.getNameFromElement("foo"));
@@ -67,7 +68,7 @@ public class PathsTest {
         assertFalse(Paths.isValidPath("/p:a//r:c"));
         assertFalse(Paths.isValidPath("//"));
     }
-    
+
     @Test
     public void isValidRelativePath() {
         assertTrue(Paths.isValidPath("a/b/c"));
@@ -79,20 +80,45 @@ public class PathsTest {
         assertFalse(Paths.isValidPath("p:a/:/r:c"));
         assertFalse(Paths.isValidPath("p:a//r:c"));
     }
-    
+
     @Test
     public void testJcrToOak() {
         assertEquals("/oak-foo:bar", Paths.toOakPath("/foo:bar", mapper));
-        assertEquals("/oak-foo:bar/oak-quu:qux", Paths.toOakPath("/foo:bar/quu:qux", mapper));
+        assertEquals("/oak-foo:bar/oak-quu:qux",
+                Paths.toOakPath("/foo:bar/quu:qux", mapper));
         assertEquals("oak-foo:bar", Paths.toOakPath("foo:bar", mapper));
-        assertEquals("oak-nt:unstructured", Paths.toOakPath("{http://www.jcp.org/jcr/nt/1.0}unstructured", mapper));
-        assertEquals("foobar/oak-jcr:content", Paths.toOakPath("foobar/{http://www.jcp.org/jcr/1.0}content", mapper));
+        assertEquals("oak-nt:unstructured", Paths.toOakPath(
+                "{http://www.jcp.org/jcr/nt/1.0}unstructured", mapper));
+        assertEquals("foobar/oak-jcr:content", Paths.toOakPath(
+                "foobar/{http://www.jcp.org/jcr/1.0}content", mapper));
+    }
+
+    @Test
+    public void testOakToJcr() {
+        assertEquals("/jcr-foo:bar", Paths.toJcrPath("/foo:bar", mapper));
+        assertEquals("/jcr-foo:bar/jcr-quu:qux",
+                Paths.toJcrPath("/foo:bar/quu:qux", mapper));
+        assertEquals("jcr-foo:bar", Paths.toJcrPath("foo:bar", mapper));
+
+        try {
+            Paths.toJcrPath("{http://www.jcp.org/jcr/nt/1.0}unstructured",
+                    mapper);
+            fail("expanded name should not be accepted");
+        } catch (IllegalStateException expected) {
+        }
+
+        try {
+            Paths.toJcrPath("foobar/{http://www.jcp.org/jcr/1.0}content",
+                    mapper);
+            fail("expanded name should not be accepted");
+        } catch (IllegalStateException expected) {
+        }
     }
-    
+
     private class TestNameMapper extends AbstractNameMapper {
 
         private Map<String, String> uri2oakprefix = new HashMap<String, String>();
-        
+
         public TestNameMapper() {
             uri2oakprefix.put("", "");
             uri2oakprefix.put("http://www.jcp.org/jcr/1.0", "jcr");
@@ -100,7 +126,7 @@ public class PathsTest {
             uri2oakprefix.put("http://www.jcp.org/jcr/mix/1.0", "mix");
             uri2oakprefix.put("http://www.w3.org/XML/1998/namespace", "xml");
         }
-        
+
         @Override
         protected String getJcrPrefix(String oakPrefix) {
             if (oakPrefix.length() == 0) {
@@ -123,6 +149,6 @@ public class PathsTest {
         protected String getOakPrefixFromURI(String uri) {
             return "oak-" + uri2oakprefix.get(uri);
         }
-        
+
     }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java Wed Apr 25 14:07:20 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.jcr;
 
+import org.apache.jackrabbit.oak.namepath.Paths;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -131,4 +132,17 @@ abstract class ItemImpl implements Item 
         return sessionContext.getValueFactory();
     }
 
+    
+    String toOakPath(String jcrPath) throws RepositoryException {
+        try {
+            return Paths.toOakPath(jcrPath, sessionContext.getNameMapper());
+        }
+        catch (IllegalArgumentException ex) {
+            throw new RepositoryException(ex);
+        }
+    }
+
+    String toJcrPath(String oakPath) {
+        return Paths.toJcrPath(oakPath, sessionContext.getNameMapper());
+    }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java Wed Apr 25 14:07:20 2012
@@ -901,14 +901,17 @@ public class NodeImpl extends ItemImpl i
             : new NodeImpl(sessionContext, tree);
     }
     
-    private PropertyImpl getPropertyOrNull(String relPath) {
-        String absPath = Paths.concat(path(), Paths.getParentPath(relPath));
+    private PropertyImpl getPropertyOrNull(String relJcrPath) throws RepositoryException {
+        
+        String relOakPath = toOakPath(relJcrPath);
+        
+        String absPath = Paths.concat(path(), Paths.getParentPath(relOakPath));
         Tree parent = getBranch().getTree(absPath);
         if (parent == null) {
             return null;
         }
 
-        String name = Paths.getName(relPath);
+        String name = Paths.getName(relOakPath);
         PropertyState propertyState = parent.getProperty(name);
         return propertyState == null
             ? null

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java Wed Apr 25 14:07:20 2012
@@ -78,7 +78,7 @@ public class PropertyImpl extends ItemIm
      */
     @Override
     public String getName() throws RepositoryException {
-        return name();
+        return toJcrPath(name());
     }
 
     /**

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionContext.java Wed Apr 25 14:07:20 2012
@@ -23,6 +23,7 @@ import org.apache.jackrabbit.oak.api.Con
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.jcr.value.ValueFactoryImpl;
+import org.apache.jackrabbit.oak.namepath.NameMapper;
 
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
@@ -36,6 +37,7 @@ public interface SessionContext<T extend
     String getWorkspaceName();
     ContentSession getContentSession();
     ValueFactoryImpl getValueFactory();
+    NameMapper getNameMapper();
     LockManager getLockManager() throws RepositoryException;
     NodeTypeManager getNodeTypeManager() throws RepositoryException;
     VersionManager getVersionManager() throws RepositoryException;

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1330298&r1=1330297&r2=1330298&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java Wed Apr 25 14:07:20 2012
@@ -21,7 +21,6 @@ import java.security.AccessControlExcept
 
 import javax.jcr.Credentials;
 import javax.jcr.InvalidItemStateException;
-import javax.jcr.NamespaceException;
 import javax.jcr.NamespaceRegistry;
 import javax.jcr.Node;
 import javax.jcr.Repository;
@@ -500,6 +499,11 @@ public class SessionImpl extends Abstrac
         }
 
         @Override
+        public NameMapper getNameMapper() {
+            return nameMapper;
+        }
+
+        @Override
         public LockManager getLockManager() throws RepositoryException {
             return getWorkspace().getLockManager();
         }