You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/12/30 22:03:51 UTC

[2/2] jena git commit: JENA-838 : Sort of canonical time portions.

JENA-838 : Sort of canonical time portions.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/311ee927
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/311ee927
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/311ee927

Branch: refs/heads/master
Commit: 311ee927f9c51e8e56671a4bb8728421a5534d9f
Parents: 0c7285c
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Dec 30 21:03:29 2014 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Dec 30 21:03:29 2014 +0000

----------------------------------------------------------------------
 .../java/com/hp/hpl/jena/sparql/util/Utils.java | 37 +++++++++++++---
 .../com/hp/hpl/jena/sparql/util/TestUtils.java  | 46 ++++++++++++++------
 2 files changed, 64 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/311ee927/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java
index 2cd29c3..1b97627 100644
--- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java
+++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/Utils.java
@@ -38,9 +38,24 @@ public class Utils {
     //    FastDateFormat uses "ZZ" for this.
     private static final FastDateFormat dateTimeFmt_display = FastDateFormat.getInstance("yyyy/MM/dd HH:mm:ss z") ;
     private static final FastDateFormat dateFmt_yyyymmdd    = FastDateFormat.getInstance("yyyy-MM-ddZZ") ;
-    private static final FastDateFormat dateTimeFmt_XSD     = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSZZ") ;
-    private static final FastDateFormat timeFmt_hhmmssSS    = FastDateFormat.getInstance("HH:mm:ss.SSSZZ") ;
-
+    
+    // Canonical form of datetimes: as of XML Schema Datatypes 1.1
+    // http://www.w3.org/TR/xmlschema11-2/
+    // The canonical form of seconds, including fractional part is the minimum length number,
+    // so the milliseconds never ends in zero.  
+    // Whole seconds have no fractional part.
+    // Jena uses millis as 3 digits if non-zero.
+    
+    // For milliseconds == 0
+    private static final FastDateFormat dateTimeFmt_XSD_ms0     = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ssZZ") ;
+    // For milliseconds != 0
+    private static final FastDateFormat dateTimeFmt_XSD_ms      = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss.SSSZZ") ;
+
+    // For milliseconds == 0
+    private static final FastDateFormat timeFmt_XSD_ms0         = FastDateFormat.getInstance("HH:mm:ssZZ") ;
+    // For milliseconds != 0
+    private static final FastDateFormat timeFmt_XSD_ms          = FastDateFormat.getInstance("HH:mm:ss.SSSZZ") ;
+    
     static public String className(Object obj) {
         if ( obj == null )
             return "null" ;
@@ -80,16 +95,28 @@ public class Utils {
         return dateFormat.format(new Date()) ;
     }
 
+    private static boolean hasZeroMilliSeconds(Calendar cal) {
+        return ! cal.isSet(Calendar.MILLISECOND) || cal.get(Calendar.MILLISECOND) == 0 ;
+    }
+    
+    // Canonical fom : if ms == 0, don't include in the string.
     public static String calendarToXSDDateTimeString(Calendar cal) {
-        return calendarToXSDString(cal, dateTimeFmt_XSD) ;
+        FastDateFormat fmt = hasZeroMilliSeconds(cal) 
+            ? dateTimeFmt_XSD_ms0 
+            : dateTimeFmt_XSD_ms ;
+        return calendarToXSDString(cal, fmt) ;
     }
 
     public static String calendarToXSDDateString(Calendar cal) {
         return calendarToXSDString(cal, dateFmt_yyyymmdd) ;
     }
 
+    // Canonical fom : if ms == 0, don't include in the string.
     public static String calendarToXSDTimeString(Calendar cal) {
-        return calendarToXSDString(cal, timeFmt_hhmmssSS) ;
+        FastDateFormat fmt = hasZeroMilliSeconds(cal) 
+            ? timeFmt_XSD_ms0 
+            : timeFmt_XSD_ms ;
+        return calendarToXSDString(cal, fmt) ;
     }
 
     private static String calendarToXSDString(Calendar cal, FastDateFormat fmt) {

http://git-wip-us.apache.org/repos/asf/jena/blob/311ee927/jena-arq/src/test/java/com/hp/hpl/jena/sparql/util/TestUtils.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/util/TestUtils.java b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/util/TestUtils.java
index 1bd66ae..cb9aced 100644
--- a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/util/TestUtils.java
+++ b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/util/TestUtils.java
@@ -31,36 +31,54 @@ import org.junit.Test;
 public class TestUtils {
 
 	@Test
-	public void testCalendarToXSDDateTimeString() throws Exception {
-		Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 14, 32, 1,"Z") ;
-		assertEquals("1984-03-22T14:32:01.000+00:00", calendarToXSDDateTimeString(cal));
+	public void testCalendarToXSDDateTimeString_1() throws Exception {
+		Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 14, 32, 1, 0, "Z") ;
+		assertEquals("1984-03-22T14:32:01+00:00", calendarToXSDDateTimeString(cal));
 		cal.setTimeZone(TimeZone.getTimeZone("MST"));
-		assertEquals("1984-03-22T07:32:01.000-07:00", calendarToXSDDateTimeString(cal));
+		assertEquals("1984-03-22T07:32:01-07:00", calendarToXSDDateTimeString(cal));
 	}
 
-	@Test
+    @Test
+    public void testCalendarToXSDDateTimeString_2() throws Exception {
+        Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 14, 32, 1, 50, "Z") ;
+        assertEquals("1984-03-22T14:32:01.050+00:00", calendarToXSDDateTimeString(cal));
+        cal.setTimeZone(TimeZone.getTimeZone("MST"));
+        assertEquals("1984-03-22T07:32:01.050-07:00", calendarToXSDDateTimeString(cal));
+    }
+
+
+    @Test
 	public void testCalendarToXSDDateString() throws Exception {
-		Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 23, 59, 1, "Z");
+		Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 23, 59, 1, 0, "Z");
 		cal.setTimeZone(TimeZone.getTimeZone("Z")) ;
 		assertEquals("1984-03-22+00:00", calendarToXSDDateString(cal));
 		cal.setTimeZone(TimeZone.getTimeZone("MST"));
 		assertEquals("1984-03-22-07:00", calendarToXSDDateString(cal));
 	}
-
-	@Test
-	public void testCalendarToXSDTimeString() throws Exception {
-		Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 14, 32, 1, "GMT+01:00");
-		assertEquals("14:32:01.000+01:00", calendarToXSDTimeString(cal));
+    
+    @Test
+	public void testCalendarToXSDTimeString_1() throws Exception {
+		Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 14, 32, 1, 0, "GMT+01:00");
+		assertEquals("14:32:01+01:00", calendarToXSDTimeString(cal));
 		// Different timezone - moves the cal point-in-time.
 		cal.setTimeZone(TimeZone.getTimeZone("MST"));
-		assertEquals("06:32:01.000-07:00", calendarToXSDTimeString(cal));
+		assertEquals("06:32:01-07:00", calendarToXSDTimeString(cal));
 	}
 	
+    @Test
+    public void testCalendarToXSDTimeString_2() throws Exception {
+        Calendar cal = createCalendar(1984, Calendar.MARCH, 22, 14, 32, 1, 500, "GMT+01:00");
+        assertEquals("14:32:01.500+01:00", calendarToXSDTimeString(cal));
+        // Different timezone - moves the cal point-in-time.
+        cal.setTimeZone(TimeZone.getTimeZone("MST"));
+        assertEquals("06:32:01.500-07:00", calendarToXSDTimeString(cal));
+    }
+    
 	private static Calendar createCalendar(int year, int month, int dayOfMonth, int hourOfDay,
-	                                       int minute, int second, String tz) {
+	                                       int minute, int second, int milli, String tz) {
 	    GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone(tz)) ;
 	    cal.set(year, month, dayOfMonth, hourOfDay, minute, second) ;
-	    cal.set(Calendar.MILLISECOND, 0) ;
+	    cal.set(Calendar.MILLISECOND, milli) ;
 	    return cal ;
 	}
 }
\ No newline at end of file