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 2012/03/11 14:54:56 UTC
svn commit: r1299359 - in
/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state:
PersistentNodeState.java PropertyStateImpl.java
Author: mduerig
Date: Sun Mar 11 13:54:55 2012
New Revision: 1299359
URL: http://svn.apache.org/viewvc?rev=1299359&view=rev
Log:
Microkernel based prototype of JCR implementation (WIP)
- improve parsing of properties
Modified:
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PersistentNodeState.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PropertyStateImpl.java
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PersistentNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PersistentNodeState.java?rev=1299359&r1=1299358&r2=1299359&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PersistentNodeState.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PersistentNodeState.java Sun Mar 11 13:54:55 2012
@@ -1,9 +1,14 @@
package org.apache.jackrabbit.state;
import org.apache.jackrabbit.Path;
-import org.apache.jackrabbit.json.FullJsonParser;
+import org.apache.jackrabbit.json.JsonHandler;
+import org.apache.jackrabbit.json.JsonParser;
+import org.apache.jackrabbit.json.JsonTokenizer;
import org.apache.jackrabbit.json.JsonValue;
+import org.apache.jackrabbit.json.JsonValue.JsonArray;
+import org.apache.jackrabbit.json.JsonValue.JsonAtom;
import org.apache.jackrabbit.json.JsonValue.JsonObject;
+import org.apache.jackrabbit.json.Token;
import org.apache.jackrabbit.json.UnescapingJsonTokenizer;
import org.apache.jackrabbit.mk.api.MicroKernel;
import org.apache.jackrabbit.oak.model.AbstractChildNodeEntry;
@@ -16,28 +21,31 @@ import org.apache.jackrabbit.spi.commons
import org.apache.jackrabbit.spi.commons.iterator.Transformer;
import org.apache.jackrabbit.utils.Function0;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import java.util.Map.Entry;
-import java.util.Set;
+
+import static org.apache.jackrabbit.json.FullJsonParser.parseObject;
public class PersistentNodeState extends AbstractNodeState {
private final MicroKernel microkernel;
private final String revision;
private final Path path;
- private final Function0<JsonObject> properties = new Function0<JsonObject>() {
- private JsonObject properties;
-
- @Override
- public JsonObject apply() {
- if (properties == null) {
- String json = microkernel.getNodes(path.toMkPath(), revision, 0, 0, -1, null);
- properties = FullJsonParser.parseObject(new UnescapingJsonTokenizer(json));
+ private final Function0<Map<String, PropertyStateImpl>> properties =
+ new Function0<Map<String, PropertyStateImpl>>() {
+ private Map<String, PropertyStateImpl> properties;
+
+ @Override
+ public Map<String, PropertyStateImpl> apply() {
+ if (properties == null) {
+ properties = readProperties();
+ }
+ return properties;
}
- return properties;
- }
};
-
+
public PersistentNodeState(MicroKernel microkernel, String revision, Path path) {
this.microkernel = microkernel;
this.revision = revision;
@@ -46,25 +54,13 @@ public class PersistentNodeState extends
@Override
public PropertyState getProperty(String name) {
- return new PropertyStateImpl(name, properties.apply().get(name));
+ return properties.apply().get(name);
}
@Override
public Iterable<PropertyState> getProperties() {
- return new Iterable<PropertyState>() {
- private final Set<Entry<String, JsonValue>> props = properties.apply().value().entrySet();
-
- @Override
- public Iterator<PropertyState> iterator() {
- return Iterators.transformIterator(props.iterator(),
- new Transformer<Entry<String, JsonValue>, PropertyState>() {
- @Override
- public PropertyState transform(Entry<String, JsonValue> entry) {
- return new PropertyStateImpl(entry.getKey(), entry.getValue());
- }
- });
- }
- };
+ // fixme: make return type of getProperties covariant
+ return (Iterable<PropertyState>) (Iterable<?>) properties.apply().values();
}
@Override
@@ -79,7 +75,7 @@ public class PersistentNodeState extends
@Override
public long getChildNodeCount() {
- JsonValue count = properties.apply().get(":childNodeCount");
+ JsonValue count = properties.apply().get(":childNodeCount").getValue();
long c = toLong(count);
if (c < 0) {
return super.getChildNodeCount();
@@ -91,8 +87,10 @@ public class PersistentNodeState extends
@Override
public Iterable<ChildNodeEntry> getChildNodeEntries(final long offset, final long length) {
+ // fixme: microkernel should also use long for length
+ final String json = microkernel.getNodes(path.toMkPath(), revision, 1, offset, (int) length, null);
return new Iterable<ChildNodeEntry>() {
- private final JsonObject jsonObject = getNodesAsJson(offset, length);
+ private final JsonObject jsonObject = parseObject(new UnescapingJsonTokenizer(json));
private final Iterator<Entry<String, JsonValue>> childObjects =
Iterators.filterIterator(jsonObject.value().entrySet().iterator(),
@@ -121,12 +119,6 @@ public class PersistentNodeState extends
//------------------------------------------< private >---
- private JsonObject getNodesAsJson(long offset, long length) {
- // fixme: microkernel should also use long for length
- String json = microkernel.getNodes(path.toMkPath(), revision, 1, offset, (int) length, null);
- return FullJsonParser.parseObject(new UnescapingJsonTokenizer(json));
- }
-
private ChildNodeEntry createChildNodeEntry(final String name) {
return new AbstractChildNodeEntry() {
@Override
@@ -155,4 +147,33 @@ public class PersistentNodeState extends
}
}
+ private Map<String, PropertyStateImpl> readProperties() {
+ String json = microkernel.getNodes(path.toMkPath(), revision, 0, 0, -1, null);
+ final Map<String, PropertyStateImpl> properties = new HashMap<String, PropertyStateImpl>();
+
+ new JsonParser(new JsonHandler(){
+ JsonArray multiValue;
+
+ @Override
+ public void atom(Token key, Token value) {
+ if (multiValue == null) {
+ properties.put(key.text(), new PropertyStateImpl(key.text(), new JsonAtom(value)));
+ }
+ else {
+ multiValue.add(new JsonAtom(value));
+ }
+ }
+
+ @Override
+ public void array(JsonParser parser, Token key, JsonTokenizer tokenizer) {
+ multiValue = new JsonArray();
+ super.array(parser, key, tokenizer);
+ properties.put(key.text(), new PropertyStateImpl(key.text(), multiValue));
+ multiValue = null;
+ }
+ }).parseObject(new UnescapingJsonTokenizer(json));
+
+ return properties;
+ }
+
}
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PropertyStateImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PropertyStateImpl.java?rev=1299359&r1=1299358&r2=1299359&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PropertyStateImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/PropertyStateImpl.java Sun Mar 11 13:54:55 2012
@@ -25,4 +25,9 @@ public class PropertyStateImpl extends A
public String getEncodedValue() {
return value.toJson();
}
+
+ @Override
+ public String toString() {
+ return name + ':' + getEncodedValue();
+ }
}