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/10/29 02:20:23 UTC
svn commit: r1190709 - in
/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel: ./
src/main/java/org/apache/jackrabbit/spi2microkernel/
src/main/java/org/apache/jackrabbit/spi2microkernel/util/
src/test/java/org/apache/jackrabbit/spi2microkernel/
Author: mduerig
Date: Sat Oct 29 00:20:23 2011
New Revision: 1190709
URL: http://svn.apache.org/viewvc?rev=1190709&view=rev
Log:
Microkernel based Jackrabbit prototype (WIP)
Replace SimpleJson
Added:
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/WrappedRepositoryException.java
Removed:
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/JsonHandlerBase.java
Modified:
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/pom.xml
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/CommitInfo.java
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/ItemInfos.java
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SubscriptionImpl.java
jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/MicrokernelTest.java
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/pom.xml?rev=1190709&r1=1190708&r2=1190709&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/pom.xml (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/pom.xml Sat Oct 29 00:20:23 2011
@@ -62,11 +62,6 @@
<version>0.1-SNAPSHOT</version>
</dependency>
<dependency>
- <groupId>com.googlecode.json-simple</groupId>
- <artifactId>json-simple</artifactId>
- <version>1.1</version>
- </dependency>
- <dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/CommitInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/CommitInfo.java?rev=1190709&r1=1190708&r2=1190709&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/CommitInfo.java (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/CommitInfo.java Sat Oct 29 00:20:23 2011
@@ -1,19 +1,21 @@
package org.apache.jackrabbit.spi2microkernel;
-
-import org.apache.jackrabbit.spi.commons.util.Unchecked;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
+import org.apache.jackrabbit.spi2microkernel.json.FullJsonParser;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.JsonAtom;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.JsonObject;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.Type;
+import org.apache.jackrabbit.spi2microkernel.json.ParseException;
+import org.apache.jackrabbit.spi2microkernel.json.UnescapingJsonTokenizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Map;
+import java.util.HashMap;
public class CommitInfo {
private static final Logger log = LoggerFactory.getLogger(CommitInfo.class);
- private final JSONObject jsonObject;
+ private final JsonObject object;
public static CommitInfo parse(String json) {
if (json == null) {
@@ -23,28 +25,20 @@ public class CommitInfo {
}
try {
- Object o = new JSONParser().parse(json);
- if (o instanceof JSONObject) {
- return new CommitInfo((JSONObject) o);
- }
- else {
- IllegalArgumentException e = new IllegalArgumentException("Not a JSON object: " + json);
- log.error(e.getMessage(), e);
- throw e;
- }
+ return new CommitInfo(FullJsonParser.parseObject(new UnescapingJsonTokenizer(json)));
}
- catch (ParseException pe) {
- log.error(pe.getMessage(), pe);
- throw new IllegalArgumentException("Syntax error in JSON: " + json, pe);
+ catch (ParseException e) {
+ log.error(e.getMessage(), e);
+ throw new IllegalArgumentException("Syntax error in JSON: " + json, e);
}
}
- private CommitInfo(JSONObject jsonObject) {
- this.jsonObject = jsonObject;
+ private CommitInfo(JsonObject object) {
+ this.object = object;
}
public CommitInfo() {
- jsonObject = new JSONObject();
+ object = new JsonObject(new HashMap<String, JsonValue>());
}
public String getMessage() {
@@ -80,17 +74,17 @@ public class CommitInfo {
}
public String getValue(String key) {
- Object value = jsonObject.get(key);
- return value == null ? null : value.toString();
+ JsonValue value = object.get(key);
+ return value == null ? null : value.value().toString();
}
public CommitInfo setValue(String key, String value) {
- Unchecked.<Map<String, String>>cast(jsonObject).put(key, value);
+ object.put(key, new JsonAtom(value, Type.STRING));
return this;
}
public String toJson() {
- return jsonObject.toJSONString();
+ return JsonValue.toJson(object);
}
@Override
@@ -100,12 +94,12 @@ public class CommitInfo {
@Override
public boolean equals(Object that) {
- return that instanceof CommitInfo && ((CommitInfo) that).jsonObject.equals(jsonObject);
+ return that instanceof CommitInfo && ((CommitInfo) that).object.equals(object);
}
@Override
public int hashCode() {
- return jsonObject.hashCode();
+ return object.hashCode();
}
}
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/ItemInfos.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/ItemInfos.java?rev=1190709&r1=1190708&r2=1190709&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/ItemInfos.java (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/ItemInfos.java Sat Oct 29 00:20:23 2011
@@ -21,7 +21,6 @@ package org.apache.jackrabbit.spi2microk
import org.apache.jackrabbit.spi.ChildInfo;
import org.apache.jackrabbit.spi.ItemInfo;
-import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.NodeId;
import org.apache.jackrabbit.spi.NodeInfo;
import org.apache.jackrabbit.spi.Path;
@@ -32,15 +31,19 @@ import org.apache.jackrabbit.spi.commons
import org.apache.jackrabbit.spi.commons.ItemInfoBuilder.NodeInfoBuilder;
import org.apache.jackrabbit.spi.commons.ItemInfoBuilder.PropertyInfoBuilder;
import org.apache.jackrabbit.spi.commons.util.Function1;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
+import org.apache.jackrabbit.spi2microkernel.json.JsonHandler;
+import org.apache.jackrabbit.spi2microkernel.json.JsonParser;
+import org.apache.jackrabbit.spi2microkernel.json.JsonTokenizer;
+import org.apache.jackrabbit.spi2microkernel.json.ParseException;
+import org.apache.jackrabbit.spi2microkernel.json.Token;
+import org.apache.jackrabbit.spi2microkernel.json.UnescapingJsonTokenizer;
+import org.apache.jackrabbit.spi2microkernel.util.WrappedRepositoryException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.PathNotFoundException;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -48,10 +51,8 @@ import java.util.List;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_MIXINTYPES;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_PRIMARYTYPE;
import static org.apache.jackrabbit.spi.commons.name.NameConstants.JCR_UUID;
-import static org.apache.jackrabbit.spi.commons.util.Exceptions.setCause;
import static org.apache.jackrabbit.spi.commons.util.Iterators.iteratorChain;
import static org.apache.jackrabbit.spi.commons.util.Iterators.singleton;
-import static org.json.simple.parser.ParseException.ERROR_UNEXPECTED_EXCEPTION;
public final class ItemInfos {
private static final Logger log = LoggerFactory.getLogger(ItemInfos.class);
@@ -59,12 +60,13 @@ public final class ItemInfos {
private ItemInfos() {}
public static Iterator<? extends ItemInfo> buildItemInfos(Path rootPath, final Path targetPath,
- String json, final boolean stopOnTarget, Function1<String, QValue> binaryHandler) throws RepositoryException {
+ String json, Function1<String, QValue> binaryHandler)
+ throws RepositoryException {
final List<ItemInfo> itemInfos = new ArrayList<ItemInfo>();
final ItemInfo[] targetInfo = new ItemInfo[1];
- InfoListener infoListener = new InfoListener() {
+ Listener listener = new Listener() {
@Override
public void createNodeInfo(NodeInfo nodeInfo) {
if (nodeInfo.getChildInfos() != null) { // null indicates an empty node. Do not include!
@@ -89,17 +91,17 @@ public final class ItemInfos {
@Override
public void createChildInfos(NodeId id, Iterator<ChildInfo> childInfos) {}
-
- @Override
- public boolean done() {
- return stopOnTarget && targetInfo[0] != null;
- }
};
try {
- JSONParser parser = new JSONParser();
- JsonHandler handler = new JsonHandler(parent(rootPath), rootPath.getName(), infoListener, binaryHandler);
- parser.parse(json, handler);
+ NodeInfoBuilder nodeInfoBuilder = ItemInfoBuilder.nodeInfoBuilder(listener)
+ .setParentPath(parent(rootPath))
+ .setName(rootPath.getName());
+
+ JsonHandler objectHandler = new ObjectHandler(nodeInfoBuilder, binaryHandler);
+ new JsonParser(objectHandler).parseObject(new UnescapingJsonTokenizer(json));
+ nodeInfoBuilder.build();
+
if (targetInfo[0] == null) {
throw new PathNotFoundException(targetPath.toString());
}
@@ -107,157 +109,157 @@ public final class ItemInfos {
return iteratorChain(singleton(targetInfo[0]), itemInfos.iterator());
}
catch (ParseException e) {
- if (e.getCause() instanceof RepositoryException) {
- throw (RepositoryException) e.getCause();
- }
- else {
- RepositoryException e0 = new RepositoryException(json + ' ' + e.getMessage(), e);
- log.error(e0.getMessage(), e0);
- throw e0;
- }
+ RepositoryException e0 = new RepositoryException(json + ' ' + e.getMessage(), e);
+ log.error(e0.getMessage(), e0);
+ throw e0;
+ }
+ catch (WrappedRepositoryException e) {
+ throw e.wrapped();
}
}
//------------------------------------------< private >---
- private interface InfoListener extends Listener {
- boolean done();
- }
-
private static Path parent(Path path) throws RepositoryException {
return path.denotesRoot() ? null : path.getAncestor(1);
}
- private static class JsonHandler extends JsonHandlerBase {
- private final Path parent;
- private final InfoListener infoListener;
+ private static class ObjectHandler extends JsonHandler {
private final Function1<String, QValue> binaryHandler;
- private Name name;
- private String currentKey;
- private boolean isObjectEmpty;
- private boolean isArrayEmpty;
private NodeInfoBuilder nodeInfoBuilder;
private PropertyInfoBuilder propertyInfoBuilder;
+ private boolean isEmpty;
- public JsonHandler(Path parent, Name name, InfoListener infoListener, Function1<String, QValue> binaryHandler) {
- this.infoListener = infoListener;
- this.parent = parent;
- this.name = name;
+ public ObjectHandler(NodeInfoBuilder nodeInfoBuilder, Function1<String, QValue> binaryHandler) {
+ this.nodeInfoBuilder = nodeInfoBuilder;
this.binaryHandler = binaryHandler;
}
@Override
- public boolean startObject() throws ParseException, IOException {
- if (nodeInfoBuilder == null) {
- nodeInfoBuilder = ItemInfoBuilder.nodeInfoBuilder(infoListener);
- nodeInfoBuilder.setParentPath(parent);
- }
- else {
- nodeInfoBuilder = nodeInfoBuilder.createNodeInfo();
- }
- if (currentKey != null) {
- name = Paths.stringToName(currentKey);
- }
- nodeInfoBuilder.setName(name);
-
- isObjectEmpty = true;
- return !infoListener.done();
- }
-
- @Override
- public boolean endObject() throws ParseException, IOException {
+ public void atom(Token key, Token value) {
+ isEmpty = false;
+ Object val = val(value);
try {
- nodeInfoBuilder.includeChildInfos(!isObjectEmpty);
- nodeInfoBuilder = nodeInfoBuilder.build();
- isObjectEmpty = false;
- return !infoListener.done();
+ if (Paths.nameToString(JCR_PRIMARYTYPE).equals(key.text())) {
+ nodeInfoBuilder.setPrimaryType(Values.objectToValue(val).getName());
+ }
+ else if (Paths.nameToString(JCR_UUID).equals(key.text())) {
+ nodeInfoBuilder.setUUID(Values.objectToValue(val).getString());
+ }
+ else if (key.text().startsWith(":")) { // ignore other internal values
+ return;
+ }
+
+ // Single valued property
+ nodeInfoBuilder.createPropertyInfo()
+ .setName(Paths.stringToName(key.text()))
+ .addValue(Values.objectToValue(val, binaryHandler))
+ .build();
}
catch (RepositoryException e) {
- log.error(e.getMessage(), e);
- throw setCause(new ParseException(ERROR_UNEXPECTED_EXCEPTION), e);
+ throw new WrappedRepositoryException(e);
}
}
-
+
@Override
- public boolean startObjectEntry(String key) throws ParseException, IOException {
- isObjectEmpty = false;
- currentKey = key;
- return !infoListener.done();
- }
+ public void object(JsonParser parser, Token key, JsonTokenizer tokenizer) {
+ nodeInfoBuilder = nodeInfoBuilder.createNodeInfo();
+ nodeInfoBuilder.setName(Paths.stringToName(key.text()));
- @Override
- public boolean endObjectEntry() throws ParseException, IOException {
- currentKey = null;
- return !infoListener.done();
- }
+ isEmpty = true;
- @Override
- public boolean primitive(Object value) throws ParseException, IOException {
- try {
- if (Paths.nameToString(JCR_PRIMARYTYPE).equals(currentKey)) {
- nodeInfoBuilder.setPrimaryType(Values.objectToValue(value).getName());
- }
- else if (Paths.nameToString(JCR_MIXINTYPES).equals(currentKey)) {
- nodeInfoBuilder.addMixin(Values.objectToValue(value).getName());
- }
- else if (Paths.nameToString(JCR_UUID).equals(currentKey)) {
- nodeInfoBuilder.setUUID(Values.objectToValue(value).getString());
- }
- else if (currentKey.startsWith(":")) { // ignore other internal values
- return !infoListener.done();
- }
-
- if (propertyInfoBuilder == null) {
- // Single valued property
- nodeInfoBuilder.createPropertyInfo()
- .setName(Paths.stringToName(currentKey))
- .addValue(Values.objectToValue(value, binaryHandler))
- .build();
+ super.object(parser, key, tokenizer);
- return !infoListener.done();
- }
- else {
- // Multi valued property
- isArrayEmpty = false;
- propertyInfoBuilder.addValue(Values.objectToValue(value, binaryHandler));
- return true;
- }
+ try {
+ nodeInfoBuilder.includeChildInfos(!isEmpty);
+ nodeInfoBuilder = nodeInfoBuilder.build();
+ isEmpty = false;
}
catch (RepositoryException e) {
- log.error(e.getMessage(), e);
- throw setCause(new ParseException(ERROR_UNEXPECTED_EXCEPTION), e);
+ throw new WrappedRepositoryException(e);
}
}
@Override
- public boolean startArray() throws ParseException, IOException {
- isArrayEmpty = true;
+ public void array(JsonParser parser, Token key, JsonTokenizer tokenizer) {
propertyInfoBuilder = nodeInfoBuilder.createPropertyInfo()
- .setName(Paths.stringToName(currentKey))
+ .setName(Paths.stringToName(key.text()))
.setMultivalued(true);
-
- return true;
- }
- @Override
- public boolean endArray() throws ParseException, IOException {
+ ArrayHandler arrayHandler = new ArrayHandler(key.text());
+ new JsonParser(arrayHandler).parseArray(tokenizer);
+
try {
- if (isArrayEmpty) {
- // xxx workaround for JCR-2992: set to string. This seems to be accepted by clients.
+ if (arrayHandler.isEmpty()) {
+ // xxx workaround for JCR-2992: set to string. This seems to be accepted by clients.
propertyInfoBuilder.setType(PropertyType.STRING);
}
propertyInfoBuilder.setMultivalued(true);
propertyInfoBuilder.build();
propertyInfoBuilder = null;
- return !infoListener.done();
}
catch (RepositoryException e) {
- log.error(e.getMessage(), e);
- throw setCause(new ParseException(ERROR_UNEXPECTED_EXCEPTION), e);
+ throw new WrappedRepositoryException(e);
}
}
- }
+ private class ArrayHandler extends JsonHandler {
+ private final String arrayKey;
+
+ private boolean hasElements;
+
+ public ArrayHandler(String arrayKey) {
+ this.arrayKey = arrayKey;
+ }
+ @Override
+ public void atom(Token key, Token value) {
+ try {
+ hasElements = true;
+ Object val = val(value);
+ if (Paths.nameToString(JCR_MIXINTYPES).equals(arrayKey)) {
+ nodeInfoBuilder.addMixin(Values.objectToValue(val).getName());
+ }
+ propertyInfoBuilder.addValue(Values.objectToValue(val, binaryHandler));
+ }
+ catch (RepositoryException e) {
+ throw new WrappedRepositoryException(e);
+ }
+ }
+
+ public boolean isEmpty() {
+ return !hasElements;
+ }
+ }
+
+ private static Object val(Token value) { // fixme cleanup: refactor Values.objectToValue to match
+ Object val;
+ switch (value.type()) {
+ case TRUE:
+ val = Boolean.TRUE;
+ break;
+ case FALSE:
+ val = Boolean.FALSE;
+ break;
+ case NULL:
+ val = null;
+ break;
+ case STRING:
+ val = value.text();
+ break;
+ case NUMBER:
+ try {
+ val = Long.parseLong(value.text());
+ }
+ catch (NumberFormatException e) {
+ val = Double.parseDouble(value.text());
+ }
+ break;
+ default:
+ val = null;
+ }
+ return val;
+ }
+ }
}
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java?rev=1190709&r1=1190708&r2=1190709&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/NodeTypeStore.java Sat Oct 29 00:20:23 2011
@@ -29,8 +29,9 @@ import org.apache.jackrabbit.spi.commons
import org.apache.jackrabbit.spi.commons.nodetype.NodeTypeStorage;
import org.apache.jackrabbit.spi.commons.nodetype.QDefinitionBuilderFactory;
import org.apache.jackrabbit.spi.commons.nodetype.compact.CompactNodeTypeDefWriter;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
+import org.apache.jackrabbit.spi2microkernel.json.FullJsonParser;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.JsonObject;
+import org.apache.jackrabbit.spi2microkernel.json.UnescapingJsonTokenizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -147,24 +148,14 @@ public class NodeTypeStore {
String ntDefinitionPath = '/' + systemWorkspace + '/' + NT_DEFINITION_NAME;
if (microKernel.nodeExists(ntDefinitionPath, rev)) {
String ntDefinitions = microKernel.getNodes(ntDefinitionPath, rev);
- JSONParser jsonParser = new JSONParser();
- try {
- Object parseResult = jsonParser.parse(ntDefinitions);
- if (parseResult instanceof JSONObject) {
- Object value = ((JSONObject) parseResult).get("cnd");
- if (value instanceof String) {
- String cnd = (String) value;
- return new StringReader(cnd);
- }
- }
- }
- catch (org.json.simple.parser.ParseException e) {
- log.error(e.getMessage(), e);
- }
+ JsonObject jsonObject = FullJsonParser.parseObject(new UnescapingJsonTokenizer(ntDefinitions));
+ Object cnd = jsonObject.get("cnd").value();
+ return cnd == null ? null : new StringReader(cnd.toString());
+ }
+ else {
+ return null;
}
-
- return null;
}
private static InputStream getDefaultNodeTypes() throws RepositoryException {
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java?rev=1190709&r1=1190708&r2=1190709&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/RepositoryServiceImpl.java Sat Oct 29 00:20:23 2011
@@ -55,8 +55,11 @@ import org.apache.jackrabbit.spi.commons
import org.apache.jackrabbit.spi.commons.util.Function1;
import org.apache.jackrabbit.spi.commons.util.Iterators;
import org.apache.jackrabbit.spi.commons.util.Predicate1;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
+import org.apache.jackrabbit.spi2microkernel.json.JsonHandler;
+import org.apache.jackrabbit.spi2microkernel.json.JsonParser;
+import org.apache.jackrabbit.spi2microkernel.json.JsonTokenizer;
+import org.apache.jackrabbit.spi2microkernel.json.Token;
+import org.apache.jackrabbit.spi2microkernel.json.UnescapingJsonTokenizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -279,40 +282,19 @@ public class RepositoryServiceImpl exten
try {
String json = microKernel.getNodes("/", getRevision(sessionInfo), 0, 0, -1);
- new JSONParser().parse(json, new JsonHandlerBase() {
-
- private String key;
+ new JsonParser(new JsonHandler(){
@Override
- public boolean startObjectEntry(String key) {
- this.key = key;
- return true;
+ public void object(JsonParser parser, Token key, JsonTokenizer tokenizer) {
+ workspaces.add(key.text());
+ new JsonParser(JsonHandler.INSTANCE).parseObject(tokenizer);
}
-
- @Override
- public boolean startObject() {
- if (key != null) {
- workspaces.add(key);
- }
- return true;
- }
-
- @Override
- public boolean endObjectEntry() {
- key = null;
- return true;
- }
-
- });
+ }).parseObject(new UnescapingJsonTokenizer(json));
}
catch (MicroKernelException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e );
}
- catch (ParseException e) {
- log.error(e.getMessage(), e);
- throw new RepositoryException(e.getMessage(), e );
- }
return workspaces.toArray(new String[workspaces.size()]);
}
@@ -358,7 +340,7 @@ public class RepositoryServiceImpl exten
}
String json = microKernel.getNodes(mkPath, rev);
- return buildItemInfos(nodePath, itemPath, json, false, readFromDataStore);
+ return buildItemInfos(nodePath, itemPath, json, readFromDataStore);
}
catch (MicroKernelException e) {
log.error(e.getMessage(), e);
@@ -379,7 +361,7 @@ public class RepositoryServiceImpl exten
}
String json = microKernel.getNodes(mkPath, rev);
- Iterator<? extends ItemInfo> infos = buildItemInfos(path, path, json, true, readFromDataStore);
+ Iterator<? extends ItemInfo> infos = buildItemInfos(path, path, json, readFromDataStore);
NodeInfo info = (NodeInfo) infos.next();
return info.getChildInfos();
}
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SubscriptionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SubscriptionImpl.java?rev=1190709&r1=1190708&r2=1190709&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SubscriptionImpl.java (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/SubscriptionImpl.java Sat Oct 29 00:20:23 2011
@@ -36,10 +36,14 @@ import org.apache.jackrabbit.spi.commons
import org.apache.jackrabbit.spi.commons.EventImpl;
import org.apache.jackrabbit.spi.commons.identifier.IdFactoryImpl;
import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
+import org.apache.jackrabbit.spi2microkernel.json.FullJsonParser;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.JsonArray;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.JsonObject;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.Type;
+import org.apache.jackrabbit.spi2microkernel.json.ParseException;
+import org.apache.jackrabbit.spi2microkernel.json.UnescapingJsonTokenizer;
+import org.apache.jackrabbit.spi2microkernel.util.WrappedRepositoryException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -113,28 +117,6 @@ public class SubscriptionImpl implements
//------------------------------------------< private >---
- private static JSONArray jsonArray(Object jsonArray) {
- if (jsonArray instanceof JSONArray) {
- return (JSONArray) jsonArray;
- }
- else {
- IllegalArgumentException e = new IllegalArgumentException("Not a JSONArray: " + jsonArray);
- log.error(e.getMessage(), e);
- throw e;
- }
- }
-
- private static JSONObject jsonObject(Object jsonObject) {
- if (jsonObject instanceof JSONObject) {
- return (JSONObject) jsonObject;
- }
- else {
- IllegalArgumentException e = new IllegalArgumentException("Not a JSONObject: " + jsonObject);
- log.error(e.getMessage(), e);
- throw e;
- }
- }
-
private static PropertyId createPropertyId(NodeId parentId, Name name) {
return IdFactoryImpl.getInstance().createPropertyId(parentId, name);
}
@@ -267,29 +249,37 @@ public class SubscriptionImpl implements
String journal = microKernel.getJournal(startRevision, endRevision);
log.debug("getJournal(" + startRevision + ", " + endRevision + ") returned " + journal.length() + " chars");
- List<EventBundle> eventBundles = new ArrayList<EventBundle>();
+ final List<EventBundle> eventBundles = new ArrayList<EventBundle>();
try {
- List<?> jsonArray = jsonArray(new JSONParser().parse(journal));
- log.debug("getJournal() returned array of length " + jsonArray.size());
+ JsonArray jsonArray = FullJsonParser.parseArray(new UnescapingJsonTokenizer(journal));
+ log.debug("getJournal() returned array of length " + jsonArray.value().size());
- Iterator<?> it = jsonArray.iterator();
+ Iterator<JsonValue> it = jsonArray.value().iterator();
if (it.hasNext()) {
it.next(); // skip base revision
}
while (it.hasNext()) {
- JSONObject jsonObject = jsonObject(it.next());
- EventBundle eventBundle = createEventBundle(jsonObject);
- if (eventBundle != null) {
- eventBundles.add(eventBundle);
- }
+ it.next().accept(new JsonValue.Visitor() {
+ @Override
+ public void visit(JsonObject object) {
+ EventBundle eventBundle = createEventBundle(object);
+ if (eventBundle != null) {
+ eventBundles.add(eventBundle);
+ }
+ }
+ });
}
return eventBundles;
+
}
catch (ParseException e) {
log.error(e.getMessage(), e);
throw new RepositoryException(e.getMessage(), e);
}
+ catch (WrappedRepositoryException e) {
+ throw e.wrapped();
+ }
}
@@ -299,7 +289,7 @@ public class SubscriptionImpl implements
//------------------------------------------< private >---
- private EventBundle createEventBundle(JSONObject jsonObject) throws RepositoryException {
+ private EventBundle createEventBundle(JsonObject jsonObject) {
String revisionId = getString(jsonObject, "id", false);
String msg = getString(jsonObject, "msg", true);
if (msg == null) {
@@ -345,7 +335,7 @@ public class SubscriptionImpl implements
return new EventBundleImpl(events, isLocal);
}
- private Collection<Event> getEvents(String changes, EventTemplate eventTemplate) throws RepositoryException {
+ private Collection<Event> getEvents(String changes, EventTemplate eventTemplate) {
Collection<Event> events = new LinkedList<Event>();
JsopTokenizer jsopTokenizer = new JsopTokenizer(changes);
@@ -466,30 +456,36 @@ public class SubscriptionImpl implements
}
}
- private void moveNode(JsopTokenizer jsopTokenizer, EventTemplate eventTemplate, Collection<Event> events)
- throws RepositoryException {
-
- Path fromPath = readPath(jsopTokenizer);
- jsopTokenizer.read(':');
- Path toPath = readPath(jsopTokenizer);
+ private void moveNode(JsopTokenizer jsopTokenizer, EventTemplate eventTemplate, Collection<Event> events) {
+ try {
+ Path fromPath = readPath(jsopTokenizer);
+ jsopTokenizer.read(':');
+ Path toPath = readPath(jsopTokenizer);
- EventTemplate moveNodeEvent = eventTemplate.copy();
- moveNodeEvent.setType(Event.NODE_MOVED);
- moveNodeEvent.setPath(toPath);
- moveNodeEvent.setItemId(createNodeId(toPath));
+ EventTemplate moveNodeEvent = eventTemplate.copy();
+ moveNodeEvent.setType(Event.NODE_MOVED);
+ moveNodeEvent.setPath(toPath);
+ moveNodeEvent.setItemId(createNodeId(toPath));
- Map<Name, QValue> info = new HashMap<Name, QValue>();
- info.put(Paths.stringToName("srcAbsPath"), Values.pathToValue(fromPath));
- info.put(Paths.stringToName("destAbsPath"), Values.pathToValue(toPath));
- moveNodeEvent.setInfo(info);
+ Map<Name, QValue> info = new HashMap<Name, QValue>();
+ info.put(Paths.stringToName("srcAbsPath"), Values.pathToValue(fromPath));
+ info.put(Paths.stringToName("destAbsPath"), Values.pathToValue(toPath));
+ moveNodeEvent.setInfo(info);
- events.add(moveNodeEvent.buildEvent());
+ events.add(moveNodeEvent.buildEvent());
+ }
+ catch (RepositoryException e) {
+ throw new WrappedRepositoryException(e);
+ }
}
- private String getString(JSONObject jsonObject, String key, boolean allowNull) {
- Object o = jsonObject.get(key);
- if (o instanceof String || allowNull && o == null) {
- return (String) o;
+ private String getString(JsonObject jsonObject, String key, boolean allowNull) {
+ JsonValue o = jsonObject.get(key);
+ if (allowNull && o == null) {
+ return null;
+ }
+ else if (!o.type().compound()) {
+ return o.value().toString();
}
else {
IllegalArgumentException e = new IllegalArgumentException("Not a string: " + jsonObject);
@@ -498,10 +494,10 @@ public class SubscriptionImpl implements
}
}
- private long getLong(JSONObject jsonObject, String key) {
- Object o = jsonObject.get(key);
- if (o instanceof Long) {
- return (Long) o;
+ private long getLong(JsonObject jsonObject, String key) {
+ JsonValue o = jsonObject.get(key);
+ if (o.type() == Type.NUMBER) {
+ return Long.parseLong(o.value().toString());
}
else {
IllegalArgumentException e = new IllegalArgumentException("Not a long: " + jsonObject);
Added: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/WrappedRepositoryException.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/WrappedRepositoryException.java?rev=1190709&view=auto
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/WrappedRepositoryException.java (added)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/WrappedRepositoryException.java Sat Oct 29 00:20:23 2011
@@ -0,0 +1,15 @@
+package org.apache.jackrabbit.spi2microkernel.util;
+
+import javax.jcr.RepositoryException;
+
+public class WrappedRepositoryException extends RuntimeException {
+ private final RepositoryException wrapped;
+
+ public WrappedRepositoryException(RepositoryException e) {
+ wrapped = e;
+ }
+
+ public RepositoryException wrapped() {
+ return wrapped;
+ }
+}
Modified: jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/MicrokernelTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/MicrokernelTest.java?rev=1190709&r1=1190708&r2=1190709&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/MicrokernelTest.java (original)
+++ jackrabbit/sandbox/jackrabbit-mk/jackrabbit-spi2microkernel/src/test/java/org/apache/jackrabbit/spi2microkernel/MicrokernelTest.java Sat Oct 29 00:20:23 2011
@@ -24,11 +24,13 @@ import org.apache.jackrabbit.mk.MicroKer
import org.apache.jackrabbit.mk.api.MicroKernel;
import org.apache.jackrabbit.mk.api.MicroKernelException;
import org.apache.jackrabbit.mk.json.JsopTokenizer;
+import org.apache.jackrabbit.spi2microkernel.json.FullJsonParser;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.JsonArray;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.JsonObject;
+import org.apache.jackrabbit.spi2microkernel.json.JsonValue.Type;
+import org.apache.jackrabbit.spi2microkernel.json.UnescapingJsonTokenizer;
import org.apache.jackrabbit.spi2microkernel.util.NumberStream;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
@@ -36,7 +38,9 @@ import org.junit.Test;
import java.io.IOException;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
public class MicrokernelTest {
@@ -193,50 +197,50 @@ public class MicrokernelTest {
}
@Test
- public void getStringProperty() throws ParseException {
+ public void getStringProperty() {
MicroKernel mk = getMicroKernel();
String head = mk.getHeadRevision();
String json = mk.getNodes("/test", head);
- JSONObject result = (JSONObject) new JSONParser().parse(json);
- Object stringProp = result.get("stringProp");
- assertTrue(stringProp instanceof String);
- assertEquals("stringVal", stringProp);
+ JsonObject result = FullJsonParser.parseObject(new UnescapingJsonTokenizer(json));
+ JsonValue stringProp = result.get("stringProp");
+ assertEquals(Type.STRING, stringProp.type());
+ assertEquals("stringVal", stringProp.value());
}
@Test
- public void getIntProperty() throws ParseException {
+ public void getIntProperty() {
MicroKernel mk = getMicroKernel();
String head = mk.getHeadRevision();
String json = mk.getNodes("/test", head);
- JSONObject result = (JSONObject) new JSONParser().parse(json);
- Object intProp = result.get("intProp");
- assertTrue(intProp instanceof Long);
- assertEquals(42L, intProp);
+ JsonObject result = FullJsonParser.parseObject(new UnescapingJsonTokenizer(json));
+ JsonValue intProp = result.get("intProp");
+ assertEquals(Type.NUMBER, intProp.type());
+ assertEquals(42L, Long.parseLong(intProp.value().toString()));
}
@Test
- public void getFloatProperty() throws ParseException {
+ public void getFloatProperty() {
MicroKernel mk = getMicroKernel();
String head = mk.getHeadRevision();
String json = mk.getNodes("/test", head);
- JSONObject result = (JSONObject) new JSONParser().parse(json);
- Object floatProp = result.get("floatProp");
- assertTrue(floatProp instanceof Double);
- assertEquals(42.2, floatProp);
+ JsonObject result = FullJsonParser.parseObject(new UnescapingJsonTokenizer(json));
+ JsonValue floatProp = result.get("floatProp");
+ assertEquals(Type.NUMBER, floatProp.type());
+ assertEquals(42.2d, Double.parseDouble(floatProp.value().toString()), 0.01);
}
@Test
- public void getMultiIntProperty() throws ParseException {
+ public void getMultiIntProperty() {
MicroKernel mk = getMicroKernel();
String head = mk.getHeadRevision();
String json = mk.getNodes("/test", head);
- JSONObject result = (JSONObject) new JSONParser().parse(json);
- Object multiIntProp = result.get("multiIntProp");
- assertTrue(multiIntProp instanceof JSONArray);
+ JsonObject result = FullJsonParser.parseObject(new UnescapingJsonTokenizer(json));
+ JsonValue multiIntProp = result.get("multiIntProp");
+ assertEquals(Type.ARRAY, multiIntProp.type());
}
@Test
@@ -256,7 +260,7 @@ public class MicrokernelTest {
}
@Test
- public void journalAddNode() throws ParseException {
+ public void journalAddNode() {
MicroKernel mk = getMicroKernel();
String init = mk.getHeadRevision();
@@ -266,9 +270,10 @@ public class MicrokernelTest {
String journal = mk.getJournal(head, head);
- JSONArray jsonArray = (JSONArray) new JSONParser().parse(journal);
- JSONObject jsonObject = (JSONObject) jsonArray.get(0);
- String changes = (String) jsonObject.get("changes");
+ JsonArray jsonArray = FullJsonParser.parseArray(new UnescapingJsonTokenizer(journal));
+ JsonValue jsonObject = jsonArray.get(0);
+ assertEquals(Type.OBJECT, jsonObject.type());
+ String changes = ((JsonObject) jsonObject).get("changes").value().toString();
JsopTokenizer tokenizer = new JsopTokenizer(changes);
tokenizer.read('+');
@@ -284,7 +289,7 @@ public class MicrokernelTest {
}
@Test
- public void journalSetProperty() throws ParseException {
+ public void journalSetProperty() {
MicroKernel mk = getMicroKernel();
String init = mk.getHeadRevision();
@@ -298,9 +303,10 @@ public class MicrokernelTest {
String journal = mk.getJournal(head, head);
- JSONArray jsonArray = (JSONArray) new JSONParser().parse(journal);
- JSONObject jsonObject = (JSONObject) jsonArray.get(0);
- String changes = (String) jsonObject.get("changes");
+ JsonArray jsonArray = FullJsonParser.parseArray(new UnescapingJsonTokenizer(journal));
+ JsonValue jsonObject = jsonArray.get(0);
+ assertEquals(Type.OBJECT, jsonObject.type());
+ String changes = ((JsonObject) jsonObject).get("changes").value().toString();
JsopTokenizer tokenizer = new JsopTokenizer(changes);
tokenizer.read('^');
@@ -312,7 +318,7 @@ public class MicrokernelTest {
}
@Test
- public void journalSetProperty2() throws ParseException {
+ public void journalSetProperty2() {
MicroKernel mk = getMicroKernel();
String init = mk.getHeadRevision();
@@ -326,9 +332,10 @@ public class MicrokernelTest {
String journal = mk.getJournal(head, head);
- JSONArray jsonArray = (JSONArray) new JSONParser().parse(journal);
- JSONObject jsonObject = (JSONObject) jsonArray.get(0);
- String changes = (String) jsonObject.get("changes");
+ JsonArray jsonArray = FullJsonParser.parseArray(new UnescapingJsonTokenizer(journal));
+ JsonValue jsonObject = jsonArray.get(0);
+ assertEquals(Type.OBJECT, jsonObject.type());
+ String changes = ((JsonObject) jsonObject).get("changes").value().toString();
JsopTokenizer tokenizer = new JsopTokenizer(changes);
tokenizer.read('^');