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 2011/06/07 15:24:28 UTC

svn commit: r1133002 - in /jackrabbit/sandbox/spi2microkernel/src: main/java/org/apache/jackrabbit/spi2microkernel/ main/java/org/apache/jackrabbit/spi2microkernel/util/ test/java/org/apache/jackrabbit/spi2microkernel/

Author: mduerig
Date: Tue Jun  7 13:24:28 2011
New Revision: 1133002

URL: http://svn.apache.org/viewvc?rev=1133002&view=rev
Log:
spi2microkernel prototype (WIP)
write support: addProperty

Modified:
    jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java
    jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/JsonBuilder.java
    jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java
    jackrabbit/sandbox/spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/RepositoryTest.java

Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java?rev=1133002&r1=1133001&r2=1133002&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java Tue Jun  7 13:24:28 2011
@@ -376,18 +376,12 @@ public class RepositoryServiceImpl exten
         }
 
         public void addNode(NodeId parentId, Name nodeName, Name nodetypeName, String uuid) throws RepositoryException {
-            String wspName = sessionInfo.getWorkspaceName();
-            Path path = parentId.getPath();
-            String mkPath = Paths.translateQPath(wspName, path);
-            mkPath = PathUtil.relativize("/", mkPath);
-            String name = Paths.translateQName(nodeName);
-
-            sb.append('+').append(PathUtil.concat(mkPath, name)).append(" : {}\n");
+            sb.append('+').append(target(parentId, nodeName)).append(" : {}\n");
         }
 
         public void addProperty(NodeId parentId, Name propertyName, QValue value) throws RepositoryException {
-            // todo implement addProperty
-            throw new UnsupportedRepositoryOperationException("addProperty");
+            String val = Values.create(value);
+            sb.append('^').append(target(parentId, propertyName)).append(" : ").append(val);
         }
 
         public void addProperty(NodeId parentId, Name propertyName, QValue[] values) throws RepositoryException {
@@ -435,6 +429,12 @@ public class RepositoryServiceImpl exten
             rev = microKernel.commit("/", sb.toString(), rev);
             setRevision(sessionInfo, rev);
         }
+
+        private String target(NodeId parentId, Name itemName) throws RepositoryException {
+            String path = Paths.translateQPath(sessionInfo.getWorkspaceName(), parentId.getPath());
+            String name = Paths.translateQName(itemName);
+            return PathUtil.concat(PathUtil.relativize("/", path), name);
+        }
     }
 
     private static class ChangeLog extends ConsolidatingChangeLog {

Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/JsonBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/JsonBuilder.java?rev=1133002&r1=1133001&r2=1133002&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/JsonBuilder.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/JsonBuilder.java Tue Jun  7 13:24:28 2011
@@ -236,6 +236,64 @@ public final class JsonBuilder {
         }
     }
 
+    /**
+     * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
+     */
+    public static String escape(String string) {
+        if(string == null) {
+            return null;
+        }
+
+        StringBuffer sb = new StringBuffer();
+        for(int i = 0; i < string.length(); i++) {
+            char ch = string.charAt(i);
+            switch(ch) {
+                case '"':
+                    sb.append("\\\"");
+                    break;
+                case '\\':
+                    sb.append("\\\\");
+                    break;
+                case '\b':
+                    sb.append("\\b");
+                    break;
+                case '\f':
+                    sb.append("\\f");
+                    break;
+                case '\n':
+                    sb.append("\\n");
+                    break;
+                case '\r':
+                    sb.append("\\r");
+                    break;
+                case '\t':
+                    sb.append("\\t");
+                    break;
+                case '/':
+                    sb.append("\\/");
+                    break;
+                default:
+                    //Reference: http://www.unicode.org/versions/Unicode5.1.0/
+                    if (ch >= '\u0000' && ch <= '\u001F' ||
+                            ch >= '\u007F' && ch <= '\u009F' ||
+                            ch >= '\u2000' && ch <= '\u20FF') {
+
+                        String ss = Integer.toHexString(ch);
+                        sb.append("\\u");
+                        for (int k = 0; k < 4 - ss.length(); k++) {
+                            sb.append('0');
+                        }
+                        sb.append(ss.toUpperCase());
+                    }
+                    else {
+                        sb.append(ch);
+                    }
+            }
+        }
+
+        return sb.toString();
+    }
+
     //------------------------------------------< private >---
 
     private static String quote(String string) {
@@ -243,7 +301,7 @@ public final class JsonBuilder {
     }
 
     private static String encode(String value) {
-        return quote(escape(value)); 
+        return quote(escape(value));
     }
 
     private static String encode(int value) {
@@ -251,7 +309,7 @@ public final class JsonBuilder {
     }
 
     private static String encode(long value) {
-        return Long.toString(value); 
+        return Long.toString(value);
     }
 
     private static String encode(float value) {
@@ -271,7 +329,7 @@ public final class JsonBuilder {
     }
 
     private static String encode(boolean value) {
-        return Boolean.toString(value); 
+        return Boolean.toString(value);
     }
 
     private static String encode(String[] values) {
@@ -386,62 +444,4 @@ public final class JsonBuilder {
         return sb.toString();
     }
 
-    /**
-     * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
-     */
-    private static String escape(String string) {
-        if(string == null) {
-            return null;
-        }
-
-        StringBuffer sb = new StringBuffer();
-		for(int i = 0; i < string.length(); i++) {
-			char ch = string.charAt(i);
-			switch(ch) {
-                case '"':
-                    sb.append("\\\"");
-                    break;
-                case '\\':
-                    sb.append("\\\\");
-                    break;
-                case '\b':
-                    sb.append("\\b");
-                    break;
-                case '\f':
-                    sb.append("\\f");
-                    break;
-                case '\n':
-                    sb.append("\\n");
-                    break;
-                case '\r':
-                    sb.append("\\r");
-                    break;
-                case '\t':
-                    sb.append("\\t");
-                    break;
-                case '/':
-                    sb.append("\\/");
-                    break;
-                default:
-                    //Reference: http://www.unicode.org/versions/Unicode5.1.0/
-                    if (ch >= '\u0000' && ch <= '\u001F' ||
-                        ch >= '\u007F' && ch <= '\u009F' ||
-                        ch >= '\u2000' && ch <= '\u20FF') {
-
-                        String ss = Integer.toHexString(ch);
-                        sb.append("\\u");
-                        for (int k = 0; k < 4 - ss.length(); k++) {
-                            sb.append('0');
-                        }
-                        sb.append(ss.toUpperCase());
-                    }
-                    else {
-                        sb.append(ch);
-                    }
-			}
-		}
-
-        return sb.toString();
-	}
-
 }

Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java?rev=1133002&r1=1133001&r2=1133002&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java Tue Jun  7 13:24:28 2011
@@ -82,6 +82,31 @@ public final class Values {
         }
     }
 
+    public static String create(QValue value) throws RepositoryException {
+        switch(value.getType()) {
+            case PropertyType.STRING:
+                return JsonBuilder.escape(value.getString());
+
+            case PropertyType.LONG:
+                return value.getString();
+
+            // todo implement other types
+            case PropertyType.BINARY:
+            case PropertyType.DOUBLE:
+            case PropertyType.DATE:
+            case PropertyType.BOOLEAN:
+            case PropertyType.NAME:
+            case PropertyType.PATH:
+            case PropertyType.REFERENCE:
+            case PropertyType.WEAKREFERENCE:
+            case PropertyType.URI:
+            case PropertyType.DECIMAL:
+            default:
+                throw new UnsupportedRepositoryOperationException("Cannot handle value of type " +
+                        PropertyType.nameFromValue(value.getType()));
+        }
+    }
+
     //------------------------------------------< private >---
 
     private static QValue create(boolean value) {

Modified: jackrabbit/sandbox/spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/RepositoryTest.java?rev=1133002&r1=1133001&r2=1133002&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/RepositoryTest.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/RepositoryTest.java Tue Jun  7 13:24:28 2011
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.spi2microk
 import org.apache.jackrabbit.mk.MicroKernelImpl;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import javax.imageio.spi.ServiceRegistry;
@@ -211,15 +212,45 @@ public class RepositoryTest {
 
         Session session2 = getRepository().login();
         try {
-            assertTrue(session.nodeExists("/bar/new"));
+            assertTrue(session2.nodeExists("/bar/new"));
         }
         finally {
             session2.logout();
         }
     }
 
+    @Test
+    public void addStringProperty() throws RepositoryException {
+        Node parentNode = getNode("/bar");
+        addProperty(parentNode, "string", getSession().getValueFactory().createValue("string value"));
+    }
+
+    @Test
+    @Ignore  // todo fix in microkernel
+    public void addLongProperty() throws RepositoryException {
+        Node parentNode = getNode("/bar");
+        addProperty(parentNode, "long", getSession().getValueFactory().createValue(42L));
+    }
+
     //------------------------------------------< private >---
 
+    private void addProperty(Node parentNode, String name, Value value) throws RepositoryException {
+        String propertyPath = parentNode.getPath() + '/' + name;
+        assertFalse(getSession().propertyExists(propertyPath));
+
+        parentNode.setProperty(name, value);
+        getSession().save();
+
+        Session session2 = getRepository().login();
+        try {
+            assertTrue(session2.propertyExists(propertyPath));
+            assertEquals(value, session2.getProperty(propertyPath).getValue());
+        }
+        finally {
+            session2.logout();
+        }
+    }
+
     private Repository getRepository() throws RepositoryException {
         if (repository == null) {
             Iterator<RepositoryFactory> factories = ServiceRegistry.lookupProviders(RepositoryFactory.class);