Author: mduerig
Date: Fri Oct 19 14:37:06 2012
New Revision: 1400119
URL: http://svn.apache.org/viewvc?rev=1400119&view=rev
Log:
OAK-380: Define conversion of property values
conversion for date values
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/Conversions.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/Conversions.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/Conversions.java?rev=1400119&r1=1400118&r2=1400119&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/Conversions.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/value/Conversions.java
Fri Oct 19 14:37:06 2012
@@ -21,14 +21,18 @@ package org.apache.jackrabbit.oak.plugin
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.TimeZone;
import com.google.common.io.ByteStreams;
import org.apache.jackrabbit.oak.api.Blob;
import org.apache.jackrabbit.oak.plugins.memory.StringBasedBlob;
+import org.apache.jackrabbit.util.ISO8601;
/**
* Utility class defining the conversion that take place between {@link
org.apache.jackrabbit.oak.api.PropertyState}s
- * of different types.
+ * of different types. All conversions defined in this class are compatible
with the conversions specified
+ * in JSR-283 $3.6.4. However, some conversion in this class might not be
defined in JSR-283.
* <p>
* Example:
* <pre>
@@ -80,6 +84,19 @@ public final class Conversions {
}
/**
+ * Convert to date. This default implementation is based on {@code
ISO8601.parse(String)}.
+ * @return date representation of the converted value
+ * @throws IllegalStateException if the string cannot be parsed into
a date
+ */
+ public Calendar toDate() {
+ Calendar date = ISO8601.parse(toString());
+ if (date == null) {
+ throw new IllegalStateException("Not a date string: " +
toString());
+ }
+ return date;
+ }
+
+ /**
* Convert to boolean. This default implementation is based on {@code
Boolean.parseBoolean(String)}.
* @return boolean representation of the converted value
*/
@@ -147,7 +164,8 @@ public final class Conversions {
/**
* Create a converter for a long. {@code String.valueOf(long)} is used for
the conversion to {@code String}.
* The conversions to {@code double} and {@code long} return the {@code
value} itself.
- * The conversion to decimal uses {@code new BigDecimal(long)}.
+ * The conversion to decimal uses {@code new BigDecimal.valueOf(long)}.
+ * The conversion to date interprets the value as number of milliseconds
since {@code 1970-01-01T00:00:00.000Z}.
* @param value The long to convert
* @return A converter for {@code value}
*/
@@ -169,8 +187,15 @@ public final class Conversions {
}
@Override
+ public Calendar toDate() {
+ Calendar date =
Calendar.getInstance(TimeZone.getTimeZone("GMT+00:00"));
+ date.setTimeInMillis(toLong());
+ return date;
+ }
+
+ @Override
public BigDecimal toDecimal() {
- return new BigDecimal(value);
+ return BigDecimal.valueOf(value);
}
};
}
@@ -179,7 +204,9 @@ public final class Conversions {
* Create a converter for a double. {@code String.valueOf(double)} is used
for the conversion to {@code String}.
* The conversions to {@code double} and {@code long} return the {@code
value} itself where in the former case
* the value is casted to {@code long}.
- * The conversion to decimal uses {@code new BigDecimal(double)}.
+ * The conversion to decimal uses {@code BigDecimal.valueOf(double)}.
+ * The conversion to date interprets {@code toLong()} as number of
milliseconds since
+ * {@code 1970-01-01T00:00:00.000Z}.
* @param value The double to convert
* @return A converter for {@code value}
*/
@@ -201,8 +228,51 @@ public final class Conversions {
}
@Override
+ public Calendar toDate() {
+ Calendar date =
Calendar.getInstance(TimeZone.getTimeZone("GMT+00:00"));
+ date.setTimeInMillis(toLong());
+ return date;
+ }
+
+ @Override
+ public BigDecimal toDecimal() {
+ return BigDecimal.valueOf(value);
+ }
+ };
+ }
+
+ /**
+ * Create a converter for a date. {@code ISO8601.format(Calendar)} is used
for the conversion to {@code String}.
+ * The conversions to {@code double}, {@code long} and {@code BigDecimal}
return the number of milliseconds
+ * since {@code 1970-01-01T00:00:00.000Z}.
+ * @param value The date to convert
+ * @return A converter for {@code value}
+ */
+ public static Converter converter(final Calendar value) {
+ return new Converter() {
+ @Override
+ public String toString() {
+ return ISO8601.format(value);
+ }
+
+ @Override
+ public long toLong() {
+ return value.getTimeInMillis();
+ }
+
+ @Override
+ public double toDouble() {
+ return value.getTimeInMillis();
+ }
+
+ @Override
+ public Calendar toDate() {
+ return value;
+ }
+
+ @Override
public BigDecimal toDecimal() {
- return new BigDecimal(value);
+ return new BigDecimal(value.getTimeInMillis());
}
};
}
@@ -230,6 +300,8 @@ public final class Conversions {
* Create a converter for a decimal. {@code BigDecimal.toString()} is used
for the conversion to {@code String}.
* {@code BigDecimal.longValue()} and {@code BigDecimal.doubleValue()} is
used for the conversions to
* {@code long} and {@code double}, respectively.
+ * The conversion to date interprets {@code toLong()} as number of
milliseconds since
+ * {@code 1970-01-01T00:00:00.000Z}.
* @param value The decimal to convert
* @return A converter for {@code value}
*/
@@ -251,6 +323,13 @@ public final class Conversions {
}
@Override
+ public Calendar toDate() {
+ Calendar date =
Calendar.getInstance(TimeZone.getTimeZone("GMT+00:00"));
+ date.setTimeInMillis(toLong());
+ return date;
+ }
+
+ @Override
public BigDecimal toDecimal() {
return value;
}