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/06/15 12:26:44 UTC
svn commit: r1135988 -
/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java
Author: mduerig
Date: Wed Jun 15 10:26:43 2011
New Revision: 1135988
URL: http://svn.apache.org/viewvc?rev=1135988&view=rev
Log:
spi2microkernel prototype (WIP)
value types: string, double, boolean, long
Modified:
jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java
Modified: jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java?rev=1135988&r1=1135987&r2=1135988&view=diff
==============================================================================
--- jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java (original)
+++ jackrabbit/sandbox/spi2microkernel/src/main/java/org/apache/jackrabbit/spi2microkernel/util/Values.java Wed Jun 15 10:26:43 2011
@@ -26,7 +26,6 @@ import org.apache.jackrabbit.spi.commons
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
-import javax.jcr.UnsupportedRepositoryOperationException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@@ -34,45 +33,89 @@ import java.util.Map;
public final class Values {
private static final QValueFactory FACTORY = QValueFactoryImpl.getInstance();
+ private static final Character[] TYPES = {
+ toHex(PropertyType.UNDEFINED),
+ toHex(PropertyType.STRING),
+ toHex(PropertyType.BINARY),
+ toHex(PropertyType.LONG),
+ toHex(PropertyType.DOUBLE),
+ toHex(PropertyType.DATE),
+ toHex(PropertyType.BOOLEAN),
+ toHex(PropertyType.NAME),
+ toHex(PropertyType.PATH),
+ toHex(PropertyType.REFERENCE),
+ toHex(PropertyType.WEAKREFERENCE),
+ toHex(PropertyType.URI),
+ toHex(PropertyType.DECIMAL),
+ };
+
public static final QValue FALSE = create(false);
public static final QValue TRUE = create(true);
- private static final Map<Class<?>, ValueFactory> VALUE_FACTORIES = new HashMap<Class<?>, ValueFactory>() {{
- put(String.class, new ValueFactory() {
+ private static final Map<Object, ValueFactory> VALUE_FACTORIES = new HashMap<Object, ValueFactory>() {{
+ ValueFactory valueFactory = new ValueFactory() {
public QValue create(Object value) throws RepositoryException {
- // todo refactor, clean up, implement value types
- if ("F:NAN".equals(value)) {
- return FACTORY.create(Double.NaN);
- }
- else {
- return FACTORY.create((String) value, PropertyType.STRING);
- }
+ return create((String) value);
}
- });
- put(Boolean.class, new ValueFactory() {
+
+ public QValue create(String value) throws RepositoryException {
+ return FACTORY.create(value, PropertyType.STRING);
+ }
+ };
+ put(String.class, valueFactory);
+ put(TYPES[PropertyType.STRING], valueFactory);
+
+ valueFactory = new ValueFactory() {
public QValue create(Object value) throws RepositoryException {
- return FACTORY.create((Boolean) value);
+ return FACTORY.create((Long) value);
}
- });
- put(Double.class, new ValueFactory() {
+
+ public QValue create(String value) throws RepositoryException {
+ return FACTORY.create(value, PropertyType.LONG);
+ }
+ };
+ put(Long.class, valueFactory);
+ put(TYPES[PropertyType.LONG], valueFactory);
+
+ valueFactory = new ValueFactory() {
public QValue create(Object value) throws RepositoryException {
return FACTORY.create((Double) value);
}
- });
- put(Long.class, new ValueFactory() {
+
+ public QValue create(String value) throws RepositoryException {
+ return FACTORY.create(value, PropertyType.DOUBLE);
+ }
+ };
+ put(Double.class, valueFactory);
+ put(TYPES[PropertyType.DOUBLE], valueFactory);
+
+ put(Boolean.class, new ValueFactory() {
public QValue create(Object value) throws RepositoryException {
- return FACTORY.create((Long) value);
+ return FACTORY.create((Boolean) value);
+ }
+
+ public QValue create(String value) throws RepositoryException {
+ return FACTORY.create(value, PropertyType.BOOLEAN);
}
});
+
put(Integer.class, new ValueFactory() {
public QValue create(Object value) throws RepositoryException {
return FACTORY.create((Integer) value);
}
+
+ public QValue create(String value) throws RepositoryException {
+ return null; // todo implement create
+ }
});
put(BigDecimal.class, new ValueFactory() {
public QValue create(Object value) throws RepositoryException {
return FACTORY.create((BigDecimal) value);
}
+
+ public QValue create(String value) throws RepositoryException {
+ return null; // todo implement create
+ }
});
// todo handle other value types
}};
@@ -80,9 +123,24 @@ public final class Values {
private Values() {}
public static QValue create(Object value) throws RepositoryException {
+ // Type encoded value
+ if (value instanceof String) {
+ String val = (String) value;
+ if (val.length() >= 2 && val.charAt(1) == ':') {
+ ValueFactory valueFactory = VALUE_FACTORIES.get(val.charAt(0));
+ if (valueFactory == null) {
+ throw new RepositoryException("Not supported value " + value);
+ }
+ else {
+ return valueFactory.create(val.substring(2));
+ }
+ }
+ }
+
+ // Non type encoded value
ValueFactory valueFactory = VALUE_FACTORIES.get(value.getClass());
if (valueFactory == null) {
- throw new UnsupportedRepositoryOperationException("Not supported value " + value);
+ throw new RepositoryException("Not supported value " + value);
}
else {
return valueFactory.create(value);
@@ -90,29 +148,35 @@ public final class Values {
}
public static String create(QValue value) throws RepositoryException {
- // todo implement value types
- switch(value.getType()) {
- case PropertyType.STRING: // S: (String)
- return JsonBuilder.quote(JsonBuilder.escape(value.getString()));
-
- case PropertyType.DOUBLE: // F: (Float)
- if (Double.isNaN(value.getDouble())) {
- return "\"F:NAN\"";
- }
- case PropertyType.LONG: // I: (Integer)
- case PropertyType.BOOLEAN: // L: (Logical)
- case PropertyType.DECIMAL: // D: (Decimal)
- return value.getString();
+ int type = value.getType();
+
+ switch(type) {
+ case PropertyType.STRING:
+ String s = value.getString();
+ return s.length() >= 2 && s.charAt(1) == ':'
+ ? typeEncode(type, JsonBuilder.escape(s))
+ : JsonBuilder.quote(JsonBuilder.escape(s));
+
+ case PropertyType.DOUBLE:
+ return Double.isNaN(value.getDouble())
+ ? typeEncode(type, "NaN")
+ : value.getString();
- case PropertyType.DATE: // C: (Calendar)
- case PropertyType.BINARY: // Y: (binarY)
- case PropertyType.NAME: // N: (Name)
- case PropertyType.PATH: // P: (Path)
- case PropertyType.REFERENCE: // R: (Reference)
- case PropertyType.WEAKREFERENCE: // W: (Weakreference)
- case PropertyType.URI: // U: (Uri)
- default: // todo implement support for the other value types
- throw new UnsupportedRepositoryOperationException("Cannot handle value of type " +
+ case PropertyType.LONG:
+ case PropertyType.BOOLEAN:
+ return value.getString();
+
+ // todo implement support for the other value types
+ case PropertyType.DECIMAL:
+ case PropertyType.DATE:
+ case PropertyType.BINARY:
+ case PropertyType.NAME:
+ case PropertyType.PATH:
+ case PropertyType.REFERENCE:
+ case PropertyType.WEAKREFERENCE:
+ case PropertyType.URI:
+ default:
+ throw new RepositoryException("Cannot handle value of type " +
PropertyType.nameFromValue(value.getType()));
}
}
@@ -135,6 +199,16 @@ public final class Values {
//------------------------------------------< private >---
+ private static Character toHex(int i) {
+ return i >= 0 && i <= 15
+ ? Integer.toHexString(i).charAt(0)
+ : 'X';
+ }
+
+ private static String typeEncode(int type, String value) {
+ return "\"" + TYPES[type] + ':' + value + '\"';
+ }
+
private static QValue create(boolean value) {
try {
return FACTORY.create(value);
@@ -147,5 +221,6 @@ public final class Values {
private interface ValueFactory {
QValue create(Object value) throws RepositoryException;
+ QValue create(String value) throws RepositoryException;
}
}