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/03/23 13:18:59 UTC
svn commit: r1304307 - in /jackrabbit/oak/trunk/oak-jcr/src:
main/java/org/apache/jackrabbit/oak/jcr/
main/java/org/apache/jackrabbit/oak/jcr/state/
main/java/org/apache/jackrabbit/oak/jcr/util/
test/java/org/apache/jackrabbit/oak/jcr/
Author: mduerig
Date: Fri Mar 23 12:18:59 2012
New Revision: 1304307
URL: http://svn.apache.org/viewvc?rev=1304307&view=rev
Log:
OAK-15: Clean up oak-jcr
Use Scalar instead of JsonValue (WIP)
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/ChangeTree.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/TransientNodeState.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/util/ValueConverter.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1304307&r1=1304306&r2=1304307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java Fri Mar 23 12:18:59 2012
@@ -20,11 +20,8 @@ import org.apache.jackrabbit.JcrConstant
import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
import org.apache.jackrabbit.mk.model.PropertyState;
-import org.apache.jackrabbit.oak.jcr.json.FullJsonParser;
import org.apache.jackrabbit.oak.jcr.json.JsonValue;
import org.apache.jackrabbit.oak.jcr.json.JsonValue.JsonAtom;
-import org.apache.jackrabbit.oak.jcr.json.JsonValue.Type;
-import org.apache.jackrabbit.oak.jcr.json.UnescapingJsonTokenizer;
import org.apache.jackrabbit.oak.jcr.state.TransientNodeState;
import org.apache.jackrabbit.oak.jcr.util.Function1;
import org.apache.jackrabbit.oak.jcr.util.ItemNameMatcher;
@@ -852,27 +849,8 @@ public class NodeImpl extends ItemImpl i
private Iterator<Property> propertyIterator(Iterator<PropertyState> properties) {
return Iterators.map(properties, new Function1<PropertyState, Property>() {
@Override
- public Property apply(PropertyState state) {
- // fixme: use Scalar class
- JsonValue value;
- String v = state.getEncodedValue();
- if (v.startsWith("[")) {
- value = FullJsonParser.parseArray(new UnescapingJsonTokenizer(v));
- }
- else if (v.startsWith("\"")) {
- value = new JsonAtom(v.substring(1, v.length() - 1), Type.STRING);
- }
- else if ("true".equalsIgnoreCase(v)) {
- value = JsonAtom.TRUE;
- }
- else if ("false".equalsIgnoreCase(v)) {
- value = JsonAtom.FALSE;
- }
- else {
- value = new JsonAtom(v, Type.NUMBER);
- }
-
- return PropertyImpl.create(sessionContext, NodeImpl.this.state, state.getName(), value);
+ public Property apply(PropertyState propertyState) {
+ return PropertyImpl.create(sessionContext, state, propertyState);
}
});
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java?rev=1304307&r1=1304306&r2=1304307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/PropertyImpl.java Fri Mar 23 12:18:59 2012
@@ -16,11 +16,12 @@
*/
package org.apache.jackrabbit.oak.jcr;
-import org.apache.jackrabbit.oak.jcr.json.JsonValue;
+import org.apache.jackrabbit.mk.model.PropertyState;
import org.apache.jackrabbit.oak.jcr.state.TransientNodeState;
import org.apache.jackrabbit.oak.jcr.util.LogUtil;
import org.apache.jackrabbit.oak.jcr.util.Path;
import org.apache.jackrabbit.oak.jcr.util.ValueConverter;
+import org.apache.jackrabbit.oak.kernel.KernelPropertyState;
import org.apache.jackrabbit.value.ValueHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,8 +53,7 @@ public class PropertyImpl extends ItemIm
private static final Logger log = LoggerFactory.getLogger(PropertyImpl.class);
private final TransientNodeState parentState;
- private final String name;
- private final JsonValue value;
+ private final PropertyState state;
static Property create(SessionContext<SessionImpl> sessionContext, Path path) throws PathNotFoundException,
ItemNotFoundException {
@@ -64,12 +64,12 @@ public class PropertyImpl extends ItemIm
}
String name = path.getName();
- JsonValue value = parentState.getPropertyValue(name);
- return new PropertyImpl(sessionContext, parentState, name, value);
+ PropertyState state = parentState.getPropertyState(name);
+ return new PropertyImpl(sessionContext, parentState, state);
}
- static Property create(SessionContext<SessionImpl> sessionContext, TransientNodeState parentState, String name, JsonValue value) {
- return new PropertyImpl(sessionContext, parentState, name, value);
+ static Property create(SessionContext<SessionImpl> sessionContext, TransientNodeState parentState, PropertyState state) {
+ return new PropertyImpl(sessionContext, parentState, state);
}
public static boolean exist(SessionContext<SessionImpl> sessionContext, Path path) {
@@ -77,11 +77,10 @@ public class PropertyImpl extends ItemIm
return parentState != null && parentState.hasProperty(path.getName());
}
- private PropertyImpl(SessionContext<SessionImpl> sessionContext, TransientNodeState parentState, String name, JsonValue value) {
+ private PropertyImpl(SessionContext<SessionImpl> sessionContext, TransientNodeState parentState, PropertyState state) {
super(sessionContext);
this.parentState = parentState;
- this.name = name;
- this.value = value;
+ this.state = state;
}
//---------------------------------------------------------------< Item >---
@@ -98,7 +97,7 @@ public class PropertyImpl extends ItemIm
*/
@Override
public String getName() throws RepositoryException {
- return name;
+ return state.getName();
}
/**
@@ -106,7 +105,7 @@ public class PropertyImpl extends ItemIm
*/
@Override
public String getPath() throws RepositoryException {
- return parentState.getPath().concat(name).toJcrPath();
+ return parentState.getPath().concat(state.getName()).toJcrPath();
}
/**
@@ -142,7 +141,7 @@ public class PropertyImpl extends ItemIm
*/
@Override
public boolean isNew() {
- return parentState.isPropertyNew(name);
+ return parentState.isPropertyNew(state.getName());
}
/**
@@ -150,7 +149,7 @@ public class PropertyImpl extends ItemIm
*/
@Override
public boolean isModified() {
- return parentState.isPropertyModified(name);
+ return parentState.isPropertyModified(state.getName());
}
/**
@@ -158,7 +157,7 @@ public class PropertyImpl extends ItemIm
*/
@Override
public void remove() throws RepositoryException {
- parentState.removeProperty(name);
+ parentState.removeProperty(state.getName());
}
/**
@@ -359,7 +358,7 @@ public class PropertyImpl extends ItemIm
throw new ValueFormatException(LogUtil.safeGetJCRPath(this) + " is multi-valued.");
}
- return ValueConverter.toValue(getValueFactory(), value.asAtom());
+ return ValueConverter.toValue(getValueFactory(), ((KernelPropertyState) state).getValue()); // fixme don't cast
}
@Override
@@ -369,7 +368,7 @@ public class PropertyImpl extends ItemIm
throw new ValueFormatException(LogUtil.safeGetJCRPath(this) + " is not multi-valued.");
}
- return ValueConverter.toValue(getValueFactory(), value.asArray());
+ return ValueConverter.toValues(getValueFactory(), ((KernelPropertyState) state).getValues()); // fixme don't cast
}
/**
@@ -544,7 +543,7 @@ public class PropertyImpl extends ItemIm
*/
@Override
public boolean isMultiple() throws RepositoryException {
- return value.isArray();
+ return ((KernelPropertyState) state).isMultiValues(); // fixme don't cast
}
//------------------------------------------------------------< private >---
@@ -584,7 +583,7 @@ public class PropertyImpl extends ItemIm
remove();
}
else {
- parentState.setProperty(name, ValueConverter.toJsonValue(value));
+ parentState.setProperty(state.getName(), ValueConverter.toJsonValue(value));
}
}
@@ -600,11 +599,11 @@ public class PropertyImpl extends ItemIm
throw new IllegalArgumentException("Property type of a value cannot be undefined (" + LogUtil.safeGetJCRPath(this) + ").");
}
- if (value == null) {
+ if (values == null) {
remove();
}
else {
- parentState.setProperty(name, ValueConverter.toJsonValue(values));
+ parentState.setProperty(state.getName(), ValueConverter.toJsonValue(values));
}
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/ChangeTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/ChangeTree.java?rev=1304307&r1=1304306&r2=1304307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/ChangeTree.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/ChangeTree.java Fri Mar 23 12:18:59 2012
@@ -272,17 +272,7 @@ public class ChangeTree {
new Function1<Entry<String, JsonValue>, PropertyState>() {
@Override
public PropertyState apply(final Entry<String, JsonValue> entry) {
- return new PropertyState() {
- @Override
- public String getName() {
- return entry.getKey();
- }
-
- @Override
- public String getEncodedValue() {
- return entry.getValue().toJson();
- }
- };
+ return TransientNodeState.createPropertyState(entry.getKey(), entry.getValue());
}
});
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/TransientNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/TransientNodeState.java?rev=1304307&r1=1304306&r2=1304307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/TransientNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/state/TransientNodeState.java Fri Mar 23 12:18:59 2012
@@ -19,9 +19,11 @@
package org.apache.jackrabbit.oak.jcr.state;
+import org.apache.jackrabbit.ScalarImpl;
import org.apache.jackrabbit.mk.model.ChildNodeEntry;
import org.apache.jackrabbit.mk.model.NodeState;
import org.apache.jackrabbit.mk.model.PropertyState;
+import org.apache.jackrabbit.oak.api.Scalar;
import org.apache.jackrabbit.oak.jcr.SessionContext;
import org.apache.jackrabbit.oak.jcr.SessionImpl;
import org.apache.jackrabbit.oak.jcr.json.FullJsonParser;
@@ -36,11 +38,14 @@ import org.apache.jackrabbit.oak.jcr.uti
import org.apache.jackrabbit.oak.jcr.util.Path;
import org.apache.jackrabbit.oak.jcr.util.Predicate;
import org.apache.jackrabbit.oak.kernel.KernelNodeState;
+import org.apache.jackrabbit.oak.kernel.KernelPropertyState;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.PathNotFoundException;
+import java.util.ArrayList;
import java.util.Iterator;
+import java.util.List;
import static org.apache.jackrabbit.oak.jcr.util.Iterators.toIterable;
@@ -235,6 +240,45 @@ public class TransientNodeState {
return value;
}
+ public PropertyState getPropertyState(String name) throws ItemNotFoundException {
+ JsonValue value = getPropertyValueOrNull(name);
+ if (value == null) {
+ throw new ItemNotFoundException(name);
+ }
+
+ return createPropertyState(name, value);
+ }
+
+ public static PropertyState createPropertyState(String name, JsonValue value) {
+ switch (value.type()) {
+ case STRING:
+ case NUMBER:
+ case BOOLEAN:
+ return new KernelPropertyState(name, toScalar(value));
+ case ARRAY:
+ List<Scalar> values = new ArrayList<Scalar>();
+ for (JsonValue v : value.asArray().value()) {
+ values.add(toScalar(v));
+ }
+ return new KernelPropertyState(name, values);
+ default:
+ throw new IllegalStateException("Invalid value");
+ }
+ }
+
+ private static Scalar toScalar(JsonValue value) {
+ switch (value.type()) {
+ case STRING:
+ return ScalarImpl.createString(value.asAtom().value());
+ case NUMBER:
+ return ScalarImpl.createNumber(value.asAtom().value());
+ case BOOLEAN:
+ return ScalarImpl.createBoolean(value.asAtom().isTrue());
+ default:
+ throw new IllegalStateException("Invalid value");
+ }
+ }
+
/**
* @param name name of the property
* @return {@code true} iff this instance has a property name {@code name}.
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/util/ValueConverter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/util/ValueConverter.java?rev=1304307&r1=1304306&r2=1304307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/util/ValueConverter.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/util/ValueConverter.java Fri Mar 23 12:18:59 2012
@@ -19,6 +19,8 @@
package org.apache.jackrabbit.oak.jcr.util;
+import org.apache.jackrabbit.ScalarImpl;
+import org.apache.jackrabbit.oak.api.Scalar;
import org.apache.jackrabbit.oak.jcr.json.JsonValue;
import org.apache.jackrabbit.oak.jcr.json.JsonValue.JsonArray;
import org.apache.jackrabbit.oak.jcr.json.JsonValue.JsonAtom;
@@ -40,6 +42,34 @@ import java.util.List;
public final class ValueConverter {
private ValueConverter() {}
+ public static Scalar toScalar(Value value) throws RepositoryException {
+ switch (value.getType()) {
+ case PropertyType.STRING: {
+ return ScalarImpl.createString(value.getString());
+ }
+ case PropertyType.DOUBLE: {
+ return ScalarImpl.createDouble(value.getDouble());
+ }
+ case PropertyType.LONG: {
+ return ScalarImpl.createLong(value.getLong());
+ }
+ case PropertyType.BOOLEAN: {
+ return ScalarImpl.createBoolean(value.getBoolean());
+ }
+ case PropertyType.DECIMAL:
+ case PropertyType.BINARY:
+ case PropertyType.DATE:
+ case PropertyType.NAME:
+ case PropertyType.PATH:
+ case PropertyType.REFERENCE:
+ case PropertyType.WEAKREFERENCE:
+ case PropertyType.URI:
+ default: {
+ throw new UnsupportedRepositoryOperationException("toScalar"); // todo implement toScalar
+ }
+ }
+ }
+
public static JsonValue toJsonValue(Value value) throws RepositoryException {
switch (value.getType()) {
case PropertyType.STRING: {
@@ -80,6 +110,34 @@ public final class ValueConverter {
return new JsonArray(jsonValues);
}
+ public static Value toValue(ValueFactory valueFactory, Scalar scalar)
+ throws UnsupportedRepositoryOperationException {
+
+ switch (scalar.getType()) {
+ case Scalar.BOOLEAN:
+ return valueFactory.createValue(scalar.getBoolean());
+ case Scalar.LONG:
+ return valueFactory.createValue(scalar.getLong());
+ case Scalar.DOUBLE:
+ return valueFactory.createValue(scalar.getDouble());
+ case Scalar.STRING:
+ return valueFactory.createValue(scalar.getString());
+ default:
+ throw new UnsupportedRepositoryOperationException("toValue"); // todo implement toValue
+ }
+ }
+
+ public static Value[] toValues(ValueFactory valueFactory, List<Scalar> scalars)
+ throws UnsupportedRepositoryOperationException {
+
+ Value[] values = new Value[scalars.size()];
+ int k = 0;
+ for (Scalar scalar : scalars) {
+ values[k++] = toValue(valueFactory, scalar);
+ }
+ return values;
+ }
+
public static Value toValue(ValueFactory valueFactory, JsonAtom jsonAtom) {
switch (jsonAtom.type()) {
case STRING: {
@@ -116,4 +174,5 @@ public final class ValueConverter {
}
return values;
}
+
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1304307&r1=1304306&r2=1304307&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Fri Mar 23 12:18:59 2012
@@ -877,7 +877,7 @@ public class RepositoryTest extends Abst
@Test
public void setStringProperty() throws RepositoryException, IOException {
Node parentNode = getNode(TEST_PATH);
- addProperty(parentNode, "string", getSession().getValueFactory().createValue("string value"));
+ addProperty(parentNode, "string", getSession().getValueFactory().createValue("string \" value"));
Property property = parentNode.getProperty("string");
property.setValue("new value");