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 md...@apache.org on 2012/04/25 16:39:08 UTC

svn commit: r1330314 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel: KernelNodeStateBuilder.java KernelNodeStore.java NodeStateBuilder.java NodeStore.java

Author: mduerig
Date: Wed Apr 25 14:39:07 2012
New Revision: 1330314

URL: http://svn.apache.org/viewvc?rev=1330314&view=rev
Log:
OAK-9: Internal tree builder
- add NodeStateBuilder
- add method to acquire and apply NodeStateBuilder to NodeStore

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateBuilder.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStateBuilder.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateBuilder.java?rev=1330314&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateBuilder.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStateBuilder.java Wed Apr 25 14:39:07 2012
@@ -0,0 +1,196 @@
+/*
+ * 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.kernel;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.mk.api.MicroKernelException;
+import org.apache.jackrabbit.mk.util.PathUtils;
+import org.apache.jackrabbit.oak.api.CoreValueFactory;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.util.CoreValueUtil;
+
+/**
+ * FIXME document
+ */
+public class KernelNodeStateBuilder implements NodeStateBuilder {
+    private final MicroKernel kernel;
+    private final CoreValueFactory valueFactory;
+    private final String path;
+
+    private String revision;
+
+    public KernelNodeStateBuilder(MicroKernel kernel, CoreValueFactory valueFactory, String path,
+            String revision) {
+
+        this.kernel = kernel;
+        this.valueFactory = valueFactory;
+        this.path = path;
+
+        this.revision = revision;
+    }
+
+    @Override
+    public NodeState getNodeState() {
+        assertNotStale();
+
+        return new KernelNodeState(kernel, valueFactory, path, revision);
+    }
+
+    @Override
+    public NodeStateBuilder getChildBuilder(String name) {
+        String targetPath = PathUtils.concat(path, name);
+        return kernel.nodeExists(targetPath, revision)
+            ? new KernelNodeStateBuilder(kernel, valueFactory, targetPath, revision)
+            : null;
+    }
+
+    @Override
+    public NodeStateBuilder addNode(String name, NodeState nodeState) {
+        String targetPath = PathUtils.concat(path, name);
+        StringBuilder jsop = new StringBuilder();
+        buildJsop(targetPath, nodeState, jsop);
+        revision = kernel.commit("", jsop.toString(), revision, null);
+        return new KernelNodeStateBuilder(kernel, valueFactory, targetPath, revision);
+    }
+
+    @Override
+    public NodeStateBuilder addNode(String name) {
+        String targetPath = PathUtils.concat(path, name);
+        if (kernel.nodeExists(targetPath, revision)) {
+            return null;
+        }
+        else {
+            revision = kernel.commit("", "+\""  + targetPath + "\":{}", revision, null);
+            return new KernelNodeStateBuilder(kernel, valueFactory, targetPath, revision);
+        }
+    }
+
+    @Override
+    public boolean removeNode(String name) {
+        String targetPath = PathUtils.concat(path, name);
+        if (kernel.nodeExists(targetPath, revision)) {
+            revision = kernel.commit("", "-\""  + targetPath + '"', revision, null);
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    @Override
+    public void setProperty(PropertyState property) {
+        String targetPath = PathUtils.concat(path, property.getName());
+        String value = property.isArray()
+            ? CoreValueUtil.toJsonArray(property.getValues())
+            : CoreValueUtil.toJsonValue(property.getValue());
+
+        revision = kernel.commit("", "^\"" + targetPath + "\":" + value, revision, null);
+    }
+
+    @Override
+    public void removeProperty(String name) {
+        String targetPath = PathUtils.concat(path, name);
+        revision = kernel.commit("", "^\"" + targetPath + "\":null", revision, null);
+    }
+
+    @Override
+    public boolean moveTo(NodeStateBuilder destParent, String destName) {
+        if (!(destParent instanceof KernelNodeStateBuilder)) {
+            throw new IllegalArgumentException("Alien builder for destParent");
+        }
+
+        if (destParent.getChildBuilder(destName) != null) {
+            return false;
+        }
+
+        KernelNodeStateBuilder destParentBuilder = (KernelNodeStateBuilder) destParent;
+
+        String destParentPath = destParentBuilder.getPath();
+        String targetPath = PathUtils.concat(destParentPath, destName);
+
+        revision = kernel.commit("", ">\"" + path + "\":\"" + targetPath + '"',
+                revision, null);
+        return true;
+    }
+
+    @Override
+    public boolean copyTo(NodeStateBuilder destParent, String destName) {
+        if (!(destParent instanceof KernelNodeStateBuilder)) {
+            throw new IllegalArgumentException("Alien builder for destParent");
+        }
+
+        if (destParent.getChildBuilder(destName) != null) {
+            return false;
+        }
+
+        KernelNodeStateBuilder destParentBuilder = (KernelNodeStateBuilder) destParent;
+
+        String destParentPath = destParentBuilder.getPath();
+        String targetPath = PathUtils.concat(destParentPath, destName);
+
+        revision = kernel.commit("", "*\"" + path + "\":\"" + targetPath + '"',
+                revision, null);
+        return true;
+    }
+
+    //------------------------------------------------------------< internal >---
+
+    String getPath() {
+        return path;
+    }
+
+    boolean apply() {
+        assertNotStale();
+
+        try {
+            kernel.merge(revision, null);
+            revision = null;
+            return true;
+        }
+        catch (MicroKernelException e) {
+            // TODO log
+            return false;
+        }
+    }
+
+    //------------------------------------------------------------< private >---
+
+    private void assertNotStale() {
+        if (revision == null) {
+            throw new IllegalStateException("This branch has been merged already");
+        }
+    }
+
+    private static void buildJsop(String path, NodeState nodeState, StringBuilder jsop) {
+        jsop.append("+\"").append(path).append("\":{}");
+
+        for (PropertyState property : nodeState.getProperties()) {
+            String targetPath = PathUtils.concat(path, property.getName());
+            String value = property.isArray()
+                ? CoreValueUtil.toJsonArray(property.getValues())
+                : CoreValueUtil.toJsonValue(property.getValue());
+
+            jsop.append("^\"").append(targetPath).append("\":").append(value);
+        }
+
+        for (ChildNodeEntry child : nodeState.getChildNodeEntries(0, -1)) {
+            String targetPath = PathUtils.concat(path, child.getName());
+            buildJsop(targetPath, child.getNodeState(), jsop);
+        }
+    }
+
+}

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java?rev=1330314&r1=1330313&r2=1330314&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStore.java Wed Apr 25 14:39:07 2012
@@ -43,6 +43,28 @@ public class KernelNodeStore implements 
     }
 
     @Override
+    public NodeStateBuilder getBuilder(NodeState nodeState) {
+        if (!(nodeState instanceof KernelNodeState)) {
+            throw new IllegalArgumentException("Alien node state");
+        }
+
+        KernelNodeState kernelNodeState = (KernelNodeState) nodeState;
+        String branchRevision = kernel.branch(kernelNodeState.getRevision());
+        String path = kernelNodeState.getPath();
+        return new KernelNodeStateBuilder(kernel, valueFactory, path, branchRevision);
+    }
+
+    @Override
+    public boolean apply(NodeStateBuilder builder) {
+        if (!(builder instanceof  KernelNodeStateBuilder)) {
+            throw new IllegalArgumentException("Alien builder");
+        }
+        
+        KernelNodeStateBuilder kernelNodeStateBuilder = (KernelNodeStateBuilder) builder;
+        return kernelNodeStateBuilder.apply();
+    }
+
+    @Override
     public void compare(NodeState before, NodeState after, NodeStateDiff diff) {
         compareProperties(before, after, diff);
         compareChildNodes(before, after, diff);

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStateBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStateBuilder.java?rev=1330314&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStateBuilder.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStateBuilder.java Wed Apr 25 14:39:07 2012
@@ -0,0 +1,34 @@
+/*
+ * 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.kernel;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+
+/**
+ * FIXME document
+ */
+public interface NodeStateBuilder {
+    NodeState getNodeState();
+    NodeStateBuilder getChildBuilder(String name);
+    NodeStateBuilder addNode(String name, NodeState nodeState);
+    NodeStateBuilder addNode(String name);
+    boolean removeNode(String name);
+    void setProperty(PropertyState property);
+    void removeProperty(String name);
+    boolean moveTo(NodeStateBuilder destParent, String destName);
+    boolean copyTo(NodeStateBuilder destParent, String destName);
+}

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java?rev=1330314&r1=1330313&r2=1330314&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/NodeStore.java Wed Apr 25 14:39:07 2012
@@ -37,6 +37,20 @@ public interface NodeStore {
     NodeState getRoot();
 
     /**
+     * FIXME document
+     * @param nodeState
+     * @return
+     */
+    NodeStateBuilder getBuilder(NodeState nodeState);
+
+    /**
+     * FIXME document
+     * @param builder
+     * @return
+     */
+    boolean apply(NodeStateBuilder builder);
+
+    /**
      * Compares the given two node states. Any found differences are
      * reported by calling the relevant added, changed or deleted methods
      * of the given handler.