You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2011/06/09 17:08:19 UTC
svn commit: r1133912 - in
/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem:
Constants.java JsopBuilder.java MemoryKernelImpl.java NodeImpl.java Val.java
Author: thomasm
Date: Thu Jun 9 15:08:19 2011
New Revision: 1133912
URL: http://svn.apache.org/viewvc?rev=1133912&view=rev
Log:
Improve compatibility with persistent implementation.
Modified:
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Constants.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/JsopBuilder.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeImpl.java
jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Val.java
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Constants.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Constants.java?rev=1133912&r1=1133911&r2=1133912&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Constants.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Constants.java Thu Jun 9 15:08:19 2011
@@ -20,6 +20,11 @@ package org.apache.jackrabbit.mk.mem;
* Constants used in this project.
*/
public class Constants {
+ public static final boolean TYPE_AS_COMMENT = false;
+ public static final boolean NODE_NAME_AS_PROPERTY = true;
+ public static final boolean CHILD_NODE_COUNT_0 = true;
+ public static final boolean JSON_NEWLINES = false;
+
public static final int VERSION_MAJOR = 3;
public static final int VERSION_MINOR = 0;
public static final int BUILD = 1000;
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/JsopBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/JsopBuilder.java?rev=1133912&r1=1133911&r2=1133912&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/JsopBuilder.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/JsopBuilder.java Thu Jun 9 15:08:19 2011
@@ -30,7 +30,11 @@ public class JsopBuilder {
}
public void endObject() {
- buff.append("\n}");
+ if (Constants.JSON_NEWLINES) {
+ buff.append("\n}");
+ } else {
+ buff.append("}");
+ }
commas.clear(level--);
}
@@ -59,7 +63,9 @@ public class JsopBuilder {
} else {
commas.set(level);
}
- buff.append('\n');
+ if (Constants.JSON_NEWLINES) {
+ buff.append('\n');
+ }
buff.append(JsopTokenizer.encode(propertyName)).append(':').append(encodedValue);
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java?rev=1133912&r1=1133911&r2=1133912&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/MemoryKernelImpl.java Thu Jun 9 15:08:19 2011
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.mk.mem;
import java.io.InputStream;
+import java.util.HashMap;
import java.util.TreeMap;
import org.apache.jackrabbit.mk.api.MicroKernel;
@@ -26,12 +27,30 @@ import org.apache.jackrabbit.mk.api.Micr
*/
public class MemoryKernelImpl implements MicroKernel {
- private final MemoryDataStore ds = new MemoryDataStore();
+ private static final HashMap<String, MemoryKernelImpl> INSTANCES = new HashMap<String, MemoryKernelImpl>();
+
+ private MemoryDataStore ds;
private long headRevId;
- private TreeMap<Long, NodeImpl> roots = new TreeMap<Long, NodeImpl>();
+ private TreeMap<Long, NodeImpl> roots;
private NodeImpl headRoot;
- public MemoryKernelImpl() {
+ public synchronized static MemoryKernelImpl get(String name) {
+ MemoryKernelImpl instance = INSTANCES.get(name);
+ if (instance == null) {
+ instance = new MemoryKernelImpl();
+ INSTANCES.put(name, instance);
+ }
+ return instance;
+ }
+
+ private MemoryKernelImpl() {
+ clear();
+ }
+
+ public void clear() {
+ headRevId = 0;
+ ds = new MemoryDataStore();
+ roots = new TreeMap<Long, NodeImpl>();
headRoot = new NodeImpl(headRevId);
commit();
}
@@ -46,14 +65,22 @@ public class MemoryKernelImpl implements
// using an old revision, if yes when is it allowed, or how is it different from using head?
// TODO increment headRevId less often? commit in the background?
// would be possible if we don't (always) return the head revision
+ // TODO the hidden property ":name" prevents shareable nodes
+ // TODO property type as comment versus as special property
headRevId++;
- apply(jsonDiff);
+ apply(path, jsonDiff);
commit();
return getHeadRevision();
}
- private void apply(String jsonDiff) {
+ private void apply(String rootPath, String jsonDiff) {
JsopTokenizer t = new JsopTokenizer(jsonDiff);
+ if (rootPath.startsWith("/")) {
+ rootPath = rootPath.substring(1);
+ }
+ if (rootPath.length() > 0 && !rootPath.endsWith("/")) {
+ rootPath += "/";
+ }
while (true) {
int r = t.read();
if (r == JsopTokenizer.END) {
@@ -66,11 +93,22 @@ public class MemoryKernelImpl implements
t.read(':');
t.read('{');
NodeImpl n = NodeImpl.parse(t, headRevId);
- headRoot = headRoot.cloneAndAddChildNode(path, n, headRevId);
+ headRoot = headRoot.cloneAndAddChildNode(rootPath + path, n, headRevId);
break;
case '-':
path = t.readString();
- headRoot = headRoot.cloneAndRemoveChildNode(path, headRevId);
+ headRoot = headRoot.cloneAndRemoveChildNode(rootPath + path, headRevId);
+ break;
+ case '^':
+ path = t.readString();
+ t.read(':');
+ Val val;
+ if (t.matches(JsopTokenizer.NULL)) {
+ val = null;
+ } else {
+ val = NodeImpl.parseValue(t);
+ }
+ headRoot = headRoot.cloneAndSetProperty(rootPath + path, val, headRevId);
break;
default:
throw new AssertionError("token type: " + t.getTokenType());
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeImpl.java?rev=1133912&r1=1133911&r2=1133912&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeImpl.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/NodeImpl.java Thu Jun 9 15:08:19 2011
@@ -120,6 +120,24 @@ public class NodeImpl {
return c;
}
+ public NodeImpl cloneAndSetProperty(String path, Val value, long revId) {
+ int index = path.indexOf('/');
+ if (index < 0) {
+ NodeImpl clone = clone(revId);
+ clone.setProperty(path, value);
+ return clone;
+ }
+ String child = path.substring(0, index);
+ NodeImpl n = childNodes.get(child);
+ if (n == null) {
+ throw new RuntimeException("Node not found: " + path);
+ }
+ NodeImpl n2 = n.cloneAndSetProperty(path.substring(index + 1), value, revId);
+ NodeImpl c = clone(revId);
+ c.childNodes.put(child, n2);
+ return c;
+ }
+
public String toString() {
return toString(true, 1, -1, -1);
}
@@ -135,12 +153,16 @@ public class NodeImpl {
}
}
if (childNodes != null) {
+ json.addProperty(":childNodeCount", "" + childNodes.size());
if (depth > 0) {
for (Entry<String, NodeImpl> e : childNodes.entrySet()) {
json.addProperty(e.getKey(), e.getValue().toString(true, depth - 1, -1, -1));
}
}
- json.addProperty(":childNodeCount", "" + childNodes.size());
+ } else {
+ if (Constants.CHILD_NODE_COUNT_0) {
+ json.addProperty(":childNodeCount", "0");
+ }
}
if (includeProperties) {
json.endObject();
@@ -154,6 +176,9 @@ public class NodeImpl {
} else if (childNodes.containsKey(name)) {
throw new RuntimeException("Node already exiss: " + name);
}
+ if (Constants.NODE_NAME_AS_PROPERTY) {
+ node.setProperty(":name", Val.get(name));
+ }
childNodes.put(name, node);
}
@@ -175,6 +200,9 @@ public class NodeImpl {
}
if (value == null) {
properties.remove(name);
+ if (properties.size() == 0) {
+ properties = null;
+ }
} else {
properties.put(name, value);
}
Modified: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Val.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Val.java?rev=1133912&r1=1133911&r2=1133912&view=diff
==============================================================================
--- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Val.java (original)
+++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/mem/Val.java Thu Jun 9 15:08:19 2011
@@ -286,6 +286,43 @@ public class Val implements Comparable<V
}
public String toString() {
+ if (Constants.TYPE_AS_COMMENT) {
+ return toStringTypeAsComment();
+ }
+ switch (type) {
+ case TYPE_MULTI_VALUE: {
+ StringBuilder buff = new StringBuilder("[ ");
+ int i = 0;
+ for (Val v : (Val[]) value) {
+ if (i++ > 0) {
+ buff.append(", ");
+ }
+ // should in theory never be null (unless there is a bug)
+ if (v != null) {
+ buff.append(v.toString());
+ }
+ }
+ return buff.append(" ]").toString();
+ }
+ case TYPE_BINARY_REFERENCE: {
+ return "\"" + value + "\"";
+ }
+ case PropertyType.BOOLEAN:
+ case PropertyType.LONG:
+ case PropertyType.DECIMAL:
+ return value.toString();
+ case PropertyType.DOUBLE:
+ String s = value.toString();
+ if (s.equals("NaN") || s.endsWith("Infinity")) {
+ s = "\"" + s + "\"";
+ }
+ return s;
+ default:
+ return JsopTokenizer.encode(value.toString());
+ }
+ }
+
+ private String toStringTypeAsComment() {
switch (type) {
case TYPE_MULTI_VALUE: {
StringBuilder buff = new StringBuilder("[ ");