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 an...@apache.org on 2013/10/16 20:21:58 UTC

svn commit: r1532842 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/

Author: angela
Date: Wed Oct 16 18:21:58 2013
New Revision: 1532842

URL: http://svn.apache.org/r1532842
Log:
OAK-1098 : AuthorizableImpl methods should convert path to Oak path (WIP)

Added:
    jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/RemappingTest.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImpl.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java?rev=1532842&r1=1532841&r2=1532842&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizableImpl.java Wed Oct 16 18:21:58 2013
@@ -230,7 +230,7 @@ abstract class AuthorizableImpl implemen
      */
     private AuthorizableProperties getAuthorizableProperties() {
         if (properties == null) {
-            properties = new AuthorizablePropertiesImpl(this);
+            properties = new AuthorizablePropertiesImpl(this, userManager.getNamePathMapper());
         }
         return properties;
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java?rev=1532842&r1=1532841&r2=1532842&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/AuthorizablePropertiesImpl.java Wed Oct 16 18:21:58 2013
@@ -54,25 +54,26 @@ class AuthorizablePropertiesImpl impleme
     private static final Logger log = LoggerFactory.getLogger(AuthorizablePropertiesImpl.class);
 
     private final AuthorizableImpl authorizable;
+    private final NamePathMapper namePathMapper;
 
-    AuthorizablePropertiesImpl(AuthorizableImpl authorizable) {
+    AuthorizablePropertiesImpl(AuthorizableImpl authorizable, NamePathMapper namePathMapper) {
         this.authorizable = authorizable;
+        this.namePathMapper = namePathMapper;
     }
 
     //---------------------------------------------< AuthorizableProperties >---
     @Override
     public Iterator<String> getNames(String relPath) throws RepositoryException {
-        checkRelativePath(relPath);
-
+        String oakPath = getOakPath(relPath);
         Tree tree = getTree();
-        TreeLocation location = getLocation(tree, relPath);
+        TreeLocation location = getLocation(tree, oakPath);
         Tree parent = location.getTree();
         if (parent != null && Text.isDescendantOrEqual(tree.getPath(), parent.getPath())) {
             List<String> l = new ArrayList<String>();
             for (PropertyState property : parent.getProperties()) {
                 String propName = property.getName();
                 if (isAuthorizableProperty(tree, location.getChild(propName), false)) {
-                    l.add(propName);
+                    l.add(namePathMapper.getJcrName(propName));
                 }
             }
             return l.iterator();
@@ -86,9 +87,8 @@ class AuthorizablePropertiesImpl impleme
      */
     @Override
     public boolean hasProperty(String relPath) throws RepositoryException {
-        checkRelativePath(relPath);
-
-        return isAuthorizableProperty(getTree(), getLocation(getTree(), relPath), true);
+        String oakPath = getOakPath(relPath);
+        return isAuthorizableProperty(getTree(), getLocation(getTree(), oakPath), true);
     }
 
     /**
@@ -96,18 +96,16 @@ class AuthorizablePropertiesImpl impleme
      */
     @Override
     public Value[] getProperty(String relPath) throws RepositoryException {
-        checkRelativePath(relPath);
-
+        String oakPath = getOakPath(relPath);
         Tree tree = getTree();
         Value[] values = null;
-        PropertyState property = getAuthorizableProperty(tree, getLocation(tree, relPath), true);
+        PropertyState property = getAuthorizableProperty(tree, getLocation(tree, oakPath), true);
         if (property != null) {
-            NamePathMapper npMapper = authorizable.getUserManager().getNamePathMapper();
             if (property.isArray()) {
-                List<Value> vs = ValueFactoryImpl.createValues(property, npMapper);
+                List<Value> vs = ValueFactoryImpl.createValues(property, namePathMapper);
                 values = vs.toArray(new Value[vs.size()]);
             } else {
-                values = new Value[]{ValueFactoryImpl.createValue(property, npMapper)};
+                values = new Value[]{ValueFactoryImpl.createValue(property, namePathMapper)};
             }
         }
         return values;
@@ -121,13 +119,11 @@ class AuthorizablePropertiesImpl impleme
         if (value == null) {
             removeProperty(relPath);
         } else {
-            checkRelativePath(relPath);
+            String oakPath = getOakPath(relPath);
+            String name = Text.getName(oakPath);
+            PropertyState propertyState = PropertyStates.createProperty(name, value);
 
-            String name = Text.getName(relPath);
-            PropertyState propertyState =
-                    PropertyStates.createProperty(name, value);
-
-            String intermediate = (relPath.equals(name)) ? null : Text.getRelativeParent(relPath, 1);
+            String intermediate = (oakPath.equals(name)) ? null : Text.getRelativeParent(oakPath, 1);
             Tree parent = getOrCreateTargetTree(intermediate);
             checkProtectedProperty(parent, propertyState);
 
@@ -143,13 +139,12 @@ class AuthorizablePropertiesImpl impleme
         if (values == null) {
             removeProperty(relPath);
         } else {
-            checkRelativePath(relPath);
-
-            String name = Text.getName(relPath);
+            String oakPath = getOakPath(relPath);
+            String name = Text.getName(oakPath);
             PropertyState propertyState =
                     PropertyStates.createProperty(name, Arrays.asList(values));
 
-            String intermediate = (relPath.equals(name)) ? null : Text.getRelativeParent(relPath, 1);
+            String intermediate = (oakPath.equals(name)) ? null : Text.getRelativeParent(oakPath, 1);
             Tree parent = getOrCreateTargetTree(intermediate);
             checkProtectedProperty(parent, propertyState);
 
@@ -162,10 +157,9 @@ class AuthorizablePropertiesImpl impleme
      */
     @Override
     public boolean removeProperty(String relPath) throws RepositoryException {
-        checkRelativePath(relPath);
-
+        String oakPath = getOakPath(relPath);
         Tree node = getTree();
-        TreeLocation propertyLocation = getLocation(node, relPath);
+        TreeLocation propertyLocation = getLocation(node, oakPath);
         if (propertyLocation.getProperty() != null) {
             if (isAuthorizableProperty(node, propertyLocation, true)) {
                 return propertyLocation.remove();
@@ -304,9 +298,14 @@ class AuthorizablePropertiesImpl impleme
         return loc;
     }
 
-    private static void checkRelativePath(String relativePath) throws RepositoryException {
-        if (relativePath == null || relativePath.isEmpty() || relativePath.charAt(0) == '/') {
-            throw new RepositoryException("Relative path expected. Found " + relativePath);
+    private String getOakPath(String relPath) throws RepositoryException {
+        if (relPath == null || relPath.isEmpty() || relPath.charAt(0) == '/') {
+            throw new RepositoryException("Relative path expected. Found " + relPath);
+        }
+        String oakPath = namePathMapper.getOakPathKeepIndex(relPath);
+        if (oakPath == null) {
+            throw new RepositoryException("Failed to resolve relative path: " + relPath);
         }
+        return oakPath;
     }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImpl.java?rev=1532842&r1=1532841&r2=1532842&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImpl.java Wed Oct 16 18:21:58 2013
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.spi.security.user.AuthorizableType;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.spi.security.user.util.PasswordUtil;
@@ -64,10 +65,11 @@ class UserImpl extends AuthorizableImpl 
     public Principal getPrincipal() throws RepositoryException {
         Tree userTree = getTree();
         String principalName = getPrincipalName();
+        NamePathMapper npMapper = getUserManager().getNamePathMapper();
         if (isAdmin()) {
-            return new AdminPrincipalImpl(principalName, userTree, getUserManager().getNamePathMapper());
+            return new AdminPrincipalImpl(principalName, userTree, npMapper);
         } else {
-            return new TreeBasedPrincipal(principalName, userTree, getUserManager().getNamePathMapper());
+            return new TreeBasedPrincipal(principalName, userTree, npMapper);
         }
     }
 

Added: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/RemappingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/RemappingTest.java?rev=1532842&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/RemappingTest.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/RemappingTest.java Wed Oct 16 18:21:58 2013
@@ -0,0 +1,211 @@
+/*
+ * 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.jcr.security.user;
+
+import java.util.Iterator;
+import java.util.List;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Value;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.oak.plugins.name.NamespaceConstants;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.junit.Test;
+
+/**
+ * Tests to assert that all user mgt methods that include name/path conversion
+ * from JCR to OAK and back are properly implemented.
+ */
+public class RemappingTest extends AbstractUserTest {
+
+    private Session session;
+    private Authorizable authorizable;
+
+    private List<String> unmappedPaths = ImmutableList.of("uTest:property", "uTest:node/uTest:property2");
+    private List<String> mappedPaths = ImmutableList.of("my:property", "my:node/my:property2");
+    private Value value;
+    private Value value2;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        superuser.getWorkspace().getNamespaceRegistry().registerNamespace("uTest", "http://jackrabbit-oak.apache.org");
+        value = superuser.getValueFactory().createValue("uTest:value", PropertyType.NAME);
+        value2 = superuser.getValueFactory().createValue("uTest:value2", PropertyType.NAME);
+        for (String relPath : unmappedPaths) {
+            user.setProperty(relPath, value);
+        }
+        superuser.save();
+
+        session = getHelper().getSuperuserSession();
+        session.setNamespacePrefix("my", "http://jackrabbit-oak.apache.org");
+        session.setNamespacePrefix("myRep", NamespaceConstants.NAMESPACE_REP);
+
+        authorizable = getUserManager(session).getAuthorizable(user.getID());
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        session.logout();
+        super.tearDown();
+    }
+
+    @Test
+    public void testGetAuthorizablePath() throws Exception {
+        assertTrue(user.getPath().startsWith(UserConstants.DEFAULT_USER_PATH));
+
+        String path = authorizable.getPath();
+        assertFalse(path.startsWith(UserConstants.DEFAULT_USER_PATH));
+    }
+
+    @Test
+    public void testGetAuthorizableByPath() throws Exception {
+        assertNotNull(getUserManager(session).getAuthorizableByPath(authorizable.getPath()));
+    }
+
+    @Test
+    public void testGetAuthorizableByPath2() throws Exception {
+        try {
+            getUserManager(session).getAuthorizableByPath(user.getPath());
+            fail("invalid path must be detected");
+        } catch (RepositoryException e) {
+            // success
+        }
+    }
+
+    @Test
+    public void testFindAuthorizable() throws Exception {
+        // TODO
+    }
+
+    @Test
+    public void testGetPropertyNames() throws Exception {
+        Iterator it = authorizable.getPropertyNames();
+        assertTrue(it.hasNext());
+        assertEquals("my:property", it.next());
+        assertFalse(it.hasNext());
+    }
+
+    @Test
+    public void testGetPropertyNames2() throws Exception {
+        Iterator it = authorizable.getPropertyNames("my:node");
+        assertTrue(it.hasNext());
+        assertEquals("my:property2", it.next());
+        assertFalse(it.hasNext());
+    }
+
+    @Test
+    public void testGetPropertyNames3() throws Exception {
+        try {
+            Iterator it = authorizable.getPropertyNames("uTest:node");
+            fail();
+        } catch (RepositoryException e) {
+            // success
+        }
+    }
+
+    @Test
+    public void testHasProperty() throws Exception {
+        for (String relPath : mappedPaths) {
+            assertTrue(authorizable.hasProperty(relPath));
+        }
+    }
+
+    @Test
+    public void testHasProperty2() throws Exception {
+        for (String relPath : unmappedPaths) {
+            try {
+                authorizable.hasProperty(relPath);
+                fail();
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+
+    @Test
+    public void testGetProperty() throws Exception {
+        for (String relPath : mappedPaths) {
+            Value[] values = authorizable.getProperty(relPath);
+            assertNotNull(values);
+            assertEquals(1, values.length);
+            assertEquals("my:value", values[0].getString());
+        }
+    }
+
+    @Test
+    public void testGetProperty2() throws Exception {
+        for (String relPath : unmappedPaths) {
+            try {
+                authorizable.getProperty(relPath);
+                fail();
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+
+    @Test
+    public void testSetProperty() throws Exception {
+        for (String relPath : mappedPaths) {
+            authorizable.setProperty(relPath, value2);
+            authorizable.setProperty(relPath, new Value[] {value2});
+        }
+    }
+
+    @Test
+    public void testSetProperty2() throws Exception {
+        for (String relPath : unmappedPaths) {
+            try {
+                authorizable.setProperty(relPath, value2);
+                fail();
+            } catch (RepositoryException e) {
+                // success
+            }
+
+            try {
+                authorizable.setProperty(relPath, new Value[] {value2});
+                fail();
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+
+    @Test
+    public void testRemoveProperty() throws Exception {
+        for (String relPath : mappedPaths) {
+            authorizable.removeProperty(relPath);
+        }
+    }
+
+    @Test
+    public void testRemoveProperty2() throws Exception {
+        for (String relPath : unmappedPaths) {
+            try {
+                authorizable.removeProperty(relPath);
+                fail();
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+}
\ No newline at end of file