You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2009/07/21 15:57:50 UTC
svn commit: r796304 - in /incubator/chemistry/trunk/chemistry:
chemistry-atompub/
chemistry-atompub/src/main/java/org/apache/chemistry/atompub/
chemistry-commons/src/main/java/org/apache/chemistry/util/
chemistry-commons/src/test/java/org/apache/chemis...
Author: fguillaume
Date: Tue Jul 21 13:57:49 2009
New Revision: 796304
URL: http://svn.apache.org/viewvc?rev=796304&view=rev
Log:
CMIS-43: Fixed AtomPub date I/O
Modified:
incubator/chemistry/trunk/chemistry/chemistry-atompub/pom.xml
incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/ValueAdapter.java
incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/util/GregorianCalendar.java
incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/util/TestGregorianCalendar.java
incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub/pom.xml?rev=796304&r1=796303&r2=796304&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub/pom.xml (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub/pom.xml Tue Jul 21 13:57:49 2009
@@ -29,11 +29,14 @@
<name>Chemistry AtomPub</name>
<dependencies>
-
<dependency>
<groupId>org.apache.chemistry</groupId>
<artifactId>chemistry-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.chemistry</groupId>
+ <artifactId>chemistry-commons</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.abdera</groupId>
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/ValueAdapter.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/ValueAdapter.java?rev=796304&r1=796303&r2=796304&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/ValueAdapter.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub/src/main/java/org/apache/chemistry/atompub/ValueAdapter.java Tue Jul 21 13:57:49 2009
@@ -28,8 +28,8 @@
import javax.xml.namespace.QName;
-import org.apache.abdera.model.AtomDate;
import org.apache.chemistry.PropertyType;
+import org.apache.chemistry.util.GregorianCalendar;
/**
* Adapter between a Java value and a XML String representation.
@@ -157,14 +157,14 @@
protected static final class DateTimeValueAdapter extends ValueAdapter {
@Override
public Serializable readValue(String xml) {
- return AtomDate.valueOf(xml).getCalendar();
+ return GregorianCalendar.fromAtomPub(xml);
}
// accepts both Calendar and Date
@Override
public String writeValue(Serializable val) {
- return val.getClass() == Calendar.class ? AtomDate.format(((Calendar) val).getTime())
- : AtomDate.format((Date) val);
+ return val instanceof Calendar ? GregorianCalendar.toAtomPub((Calendar) val)
+ : GregorianCalendar.toAtomPub((Date) val);
}
@Override
Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/util/GregorianCalendar.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/util/GregorianCalendar.java?rev=796304&r1=796303&r2=796304&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/util/GregorianCalendar.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/util/GregorianCalendar.java Tue Jul 21 13:57:49 2009
@@ -17,27 +17,153 @@
package org.apache.chemistry.util;
import java.util.Calendar;
+import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* A GregorianCalendar with a better toString method.
* <p>
- * This way you don't have to pull you hair when debugging dates, or maps
- * containing dates.
+ * It also provides a static {@link #fromAtomPub} method for construction.
*/
public class GregorianCalendar extends java.util.GregorianCalendar {
private static final long serialVersionUID = 1L;
- public static Calendar getInstance() {
+ public static GregorianCalendar getInstance() {
return new GregorianCalendar();
}
- public static Calendar getInstance(TimeZone zone) {
+ public static GregorianCalendar getInstance(TimeZone zone) {
return new GregorianCalendar(zone);
}
+ private static final Pattern ATOMPUB_PATTERN = Pattern.compile( //
+ "(\\d{4})-(\\d{2})-(\\d{2})[Tt]"
+ + "(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d{3}))?"
+ + "(?:[Zz]|([+-]\\d{2}:\\d{2}))");
+
+ /**
+ * Factory from an AtomPub date string representation.
+ * <p>
+ * Basically parses {@code YYYY-HH-MMThh:mm:ss.sss+hh:mm}, or a {@code Z}
+ * for the timezone, and with {@code .sss} being optional.
+ *
+ * @param date the string representation in AtomPub format
+ * @return the created instance
+ */
+ public static GregorianCalendar fromAtomPub(String date) {
+ Matcher m = ATOMPUB_PATTERN.matcher(date);
+ if (!m.matches()) {
+ throw new IllegalArgumentException("Invalid date format: " + date);
+ }
+ String tz = m.group(8);
+ GregorianCalendar cal = getInstance(TimeZone.getTimeZone("GMT"
+ + (tz == null ? "" : tz)));
+ cal.set(YEAR, Integer.parseInt(m.group(1)));
+ cal.set(MONTH, Integer.parseInt(m.group(2)) - 1);
+ cal.set(DATE, Integer.parseInt(m.group(3)));
+ cal.set(HOUR_OF_DAY, Integer.parseInt(m.group(4)));
+ cal.set(MINUTE, Integer.parseInt(m.group(5)));
+ cal.set(SECOND, Integer.parseInt(m.group(6)));
+ String ms = m.group(7);
+ cal.set(MILLISECOND, ms == null ? 0 : Integer.parseInt(ms));
+ return cal;
+ }
+
+ /**
+ * Serializer of a Calendar to the AtomPub representation.
+ *
+ * @param cal a {@link Calendar}
+ * @return the AtomPub string representation
+ */
+ public static String toAtomPub(Calendar cal) {
+ StringBuilder buf = new StringBuilder(28);
+ toAtomPub(cal, buf);
+ return buf.toString();
+ }
+
+ /**
+ * Serializer of a Date to the AtomPub representation.
+ *
+ * @param date a {@link Date}
+ * @return the AtomPub string representation
+ */
+ public static String toAtomPub(Date date) {
+ Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
+ cal.setTime(date);
+ return toAtomPub(cal);
+ }
+
+ protected static void toAtomPub(Calendar cal, StringBuilder buf) {
+ buf.append(cal.get(YEAR));
+ buf.append('-');
+ int f = cal.get(MONTH);
+ if (f < 9) {
+ buf.append('0');
+ }
+ buf.append(f + 1);
+ buf.append('-');
+ f = cal.get(DATE);
+ if (f < 10) {
+ buf.append('0');
+ }
+ buf.append(f);
+ buf.append('T');
+ f = cal.get(HOUR_OF_DAY);
+ if (f < 10) {
+ buf.append('0');
+ }
+ buf.append(f);
+ buf.append(':');
+ f = cal.get(MINUTE);
+ if (f < 10) {
+ buf.append('0');
+ }
+ buf.append(f);
+ buf.append(':');
+ f = cal.get(SECOND);
+ if (f < 10) {
+ buf.append('0');
+ }
+ buf.append(f);
+ buf.append('.');
+ f = cal.get(MILLISECOND);
+ if (f < 100) {
+ buf.append('0');
+ }
+ if (f < 10) {
+ buf.append('0');
+ }
+ buf.append(f);
+ int offset = cal.getTimeZone().getOffset(cal.getTimeInMillis()) / 60000;
+ if (offset == 0) {
+ buf.append('Z');
+ } else {
+ char sign;
+ if (offset < 0) {
+ offset = -offset;
+ sign = '-';
+ } else {
+ sign = '+';
+ }
+ buf.append(sign);
+ f = offset / 60;
+ if (f < 10) {
+ buf.append('0');
+ }
+ buf.append(f);
+ buf.append(':');
+ f = offset % 60;
+ if (f < 10) {
+ buf.append('0');
+ }
+ buf.append(f);
+ }
+ }
+
/**
* @see java.util.GregorianCalendar#GregorianCalendar()
*/
@@ -95,65 +221,7 @@
public String toString() {
StringBuilder buf = new StringBuilder(47);
buf.append("GregorianCalendar(");
- buf.append(get(YEAR));
- buf.append('-');
- int f = get(MONTH);
- if (f < 9) {
- buf.append('0');
- }
- buf.append(f + 1);
- buf.append('-');
- f = get(DATE);
- if (f < 10) {
- buf.append('0');
- }
- buf.append(f);
- buf.append('T');
- f = get(HOUR_OF_DAY);
- if (f < 10) {
- buf.append('0');
- }
- buf.append(f);
- buf.append(':');
- f = get(MINUTE);
- if (f < 10) {
- buf.append('0');
- }
- buf.append(f);
- buf.append(':');
- f = get(SECOND);
- if (f < 10) {
- buf.append('0');
- }
- buf.append(f);
- buf.append('.');
- f = get(MILLISECOND);
- if (f < 100) {
- buf.append('0');
- }
- if (f < 10) {
- buf.append('0');
- }
- buf.append(f);
- char sign;
- int offset = getTimeZone().getOffset(getTimeInMillis()) / 60000;
- if (offset < 0) {
- offset = -offset;
- sign = '-';
- } else {
- sign = '+';
- }
- buf.append(sign);
- f = offset / 60;
- if (f < 10) {
- buf.append('0');
- }
- buf.append(f);
- f = offset % 60;
- if (f < 10) {
- buf.append('0');
- }
- buf.append(f);
+ toAtomPub(this, buf);
buf.append(')');
return buf.toString();
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/util/TestGregorianCalendar.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/util/TestGregorianCalendar.java?rev=796304&r1=796303&r2=796304&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/util/TestGregorianCalendar.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/util/TestGregorianCalendar.java Tue Jul 21 13:57:49 2009
@@ -32,7 +32,7 @@
cal.set(Calendar.MINUTE, 4);
cal.set(Calendar.SECOND, 5);
cal.set(Calendar.MILLISECOND, 6);
- assertEquals("GregorianCalendar(2009-01-02T03:04:05.006+0730)",
+ assertEquals("GregorianCalendar(2009-01-02T03:04:05.006+07:30)",
cal.toString());
}
@@ -45,7 +45,32 @@
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
- assertEquals("GregorianCalendar(2008-12-31T23:59:59.999-0600)",
+ assertEquals("GregorianCalendar(2008-12-31T23:59:59.999-06:00)",
+ cal.toString());
+ }
+
+ public void testToString3() {
+ Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));
+ cal.set(Calendar.YEAR, 2008);
+ cal.set(Calendar.MONTH, 0);
+ cal.set(Calendar.DATE, 1);
+ cal.set(Calendar.HOUR_OF_DAY, 1);
+ cal.set(Calendar.MINUTE, 1);
+ cal.set(Calendar.SECOND, 1);
+ cal.set(Calendar.MILLISECOND, 1);
+ assertEquals("GregorianCalendar(2008-01-01T01:01:01.001Z)",
+ cal.toString());
+ }
+
+ public void testFromAtomPub1() {
+ Calendar cal = GregorianCalendar.fromAtomPub("2009-07-14T12:00:00.123-06:30");
+ assertEquals("GregorianCalendar(2009-07-14T12:00:00.123-06:30)",
+ cal.toString());
+ }
+
+ public void testFromAtomPub2() {
+ Calendar cal = GregorianCalendar.fromAtomPub("2009-07-14T12:00:00Z");
+ assertEquals("GregorianCalendar(2009-07-14T12:00:00.000Z)",
cal.toString());
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java?rev=796304&r1=796303&r2=796304&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java Tue Jul 21 13:57:49 2009
@@ -22,6 +22,7 @@
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.TimeZone;
import junit.framework.TestCase;
@@ -37,6 +38,7 @@
import org.apache.chemistry.Repository;
import org.apache.chemistry.SPI;
import org.apache.chemistry.Type;
+import org.apache.chemistry.util.GregorianCalendar;
import org.apache.commons.io.IOUtils;
/**
@@ -226,6 +228,14 @@
Document doc = root.newDocument("doc");
doc.setName("mydoc");
doc.setValue("title", "mytitle");
+ GregorianCalendar cal = new GregorianCalendar(
+ TimeZone.getTimeZone("GMT+05:00"));
+ cal.clear();
+ cal.set(2009, 7 - 1, 14, 12, 00, 00);
+ cal.set(Calendar.MILLISECOND, 0);
+ assertEquals("GregorianCalendar(2009-07-14T12:00:00.000+05:00)",
+ cal.toString());
+ doc.setValue("date", cal);
doc.save();
// new connection
closeConn();
@@ -236,6 +246,8 @@
doc = (Document) children.get(0);
assertEquals("mydoc", doc.getName());
assertEquals("mytitle", doc.getString("title"));
+ Calendar cal2 = doc.getDateTime("date");
+ assertEquals(cal.toString(), cal2.toString());
}
}