Author: andy
Date: Wed Sep 11 16:55:46 2013
New Revision: 1521937

URL: http://svn.apache.org/r1521937
Log:
Handle timezones when casting.

Modified:
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
    
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java?rev=1521937&r1=1521936&r2=1521937&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
 Wed Sep 11 16:55:46 2013
@@ -33,7 +33,6 @@ import static javax.xml.datatype.Datatyp
 
 import java.math.BigDecimal ;
 import java.math.BigInteger ;
-import java.text.DecimalFormat ;
 import java.util.HashSet ;
 import java.util.List ;
 import java.util.Set ;
@@ -1110,6 +1109,19 @@ public class XSDFuncOp
        return dateTimeCast(nv, xsd) ;
     }
 
+    /** Get the timezone in XSD tiezone format (e.g. "Z" or "+01:00").
+     * Assumes the NodeValue is of suitable datatype.
+     */
+    private static String tzStrFromNV(NodeValue nv) {
+        DateTimeStruct dts = parseAnyDT(nv) ;
+        if ( dts == null )
+            return "" ;
+        String tzStr = dts.timezone ;
+        if ( tzStr == null )
+            tzStr = "" ;
+        return tzStr ;
+    }
+    
     /** Cast a NodeValue to a date/time type (xsd dateTime, date, time, g*) 
according to F&O
      *  <a 
href="http://www.w3.org/TR/xpath-functions/#casting-to-datetimes";>17.1.5 
Casting to date and time types</a>
      *  Throws an exception on incorrect case.
@@ -1130,8 +1142,9 @@ public class XSDFuncOp
             // ==> DateTime
             if ( nv.isDateTime() ) return nv ;
             if ( ! nv.isDate() ) throw new ExprEvalTypeException("Can't cast 
to XSD:dateTime: "+nv) ;
-            // DateTime with time 00:00:00
-            String x = String.format("%04d-%02d-%02dT00:00:00", 
xsdDT.getYear(), xsdDT.getMonth(),xsdDT.getDay()) ;
+            // DateTime with time 00:00:00 ... and timezone, if any
+            String tzStr = tzStrFromNV(nv) ;
+            String x = String.format("%04d-%02d-%02dT00:00:00%s", 
xsdDT.getYear(), xsdDT.getMonth(),xsdDT.getDay(), tzStr) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1140,7 +1153,9 @@ public class XSDFuncOp
             // ==> Date
             if ( nv.isDate() ) return nv ;
             if ( ! nv.isDateTime() ) throw new ExprEvalTypeException("Can't 
cast to XSD:date: "+nv) ;
-            String x = String.format("%04d-%02d-%02d", xsdDT.getYear(), 
xsdDT.getMonth(),xsdDT.getDay()) ;
+            // Timezone
+            String tzStr = tzStrFromNV(nv) ;
+            String x = String.format("%04d-%02d-%02d%s", xsdDT.getYear(), 
xsdDT.getMonth(),xsdDT.getDay(),tzStr) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1149,11 +1164,11 @@ public class XSDFuncOp
             // ==> time
             if ( nv.isTime() ) return nv ;
             if ( ! nv.isDateTime() ) throw new ExprEvalTypeException("Can't 
cast to XSD:time: "+nv) ;
-            // Careful foratting 
-            DecimalFormat nf = new DecimalFormat("00.####") ;
-            nf.setDecimalSeparatorAlwaysShown(false) ;
-            String x = nf.format(xsdDT.getSecond()) ;
-            x = String.format("%02d:%02d:%s", xsdDT.getHour(), 
xsdDT.getMinute(),x) ;
+            // Careful formatting 
+            
+            DateTimeStruct dts = parseAnyDT(nv) ;
+            if ( dts.timezone == null ) dts.timezone = "" ;
+            String x = String.format("%s:%s:%s%s", dts.hour, dts.minute, 
dts.second, dts.timezone) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     

Modified: 
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java?rev=1521937&r1=1521936&r2=1521937&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java
 (original)
+++ 
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestXSDFuncOp.java
 Wed Sep 11 16:55:46 2013
@@ -18,29 +18,21 @@
 
 package com.hp.hpl.jena.sparql.expr;
 
-import junit.framework.JUnit4TestAdapter ;
-import junit.framework.TestCase ;
+import org.apache.jena.atlas.junit.BaseTest ;
 import org.junit.Assert ;
 import org.junit.Test ;
 
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
 import com.hp.hpl.jena.graph.NodeFactory ;
 import com.hp.hpl.jena.query.ARQ ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueDecimal ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueDouble ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueFloat ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueInteger ;
-import com.hp.hpl.jena.sparql.expr.nodevalue.XSDFuncOp ;
+import com.hp.hpl.jena.sparql.expr.nodevalue.* ;
 
-
-/** com.hp.hpl.jena.query.test.TestNodeValue */
-
-public class TestXSDFuncOp extends TestCase
+public class TestXSDFuncOp extends BaseTest
 {
-    public static junit.framework.Test suite()
-    {
-        return new JUnit4TestAdapter(TestXSDFuncOp.class) ;
-    }
+//    public static junit.framework.Test suite()
+//    {
+//        return new JUnit4TestAdapter(TestXSDFuncOp.class) ;
+//    }
     
     private static final double accuracyExact_D = 0.0d ;
     private static final double accuracyExact_F = 0.0d ;
@@ -878,4 +870,25 @@ public class TestXSDFuncOp extends TestC
     // Junk to date/time thing.
     @Test (expected=ExprEvalTypeException.class)
     public void cast_err_gregorian_01() { 
testDateTimeCast(NodeValue.makeBoolean(false), XSDDatatype.XSDgDay, nv_gd) ; }
+    
+    private static NodeValue nv_dt_tz1 = 
NodeValue.makeNode("2010-03-22T20:31:54.5+01:00", XSDDatatype.XSDdateTime) ;
+    private static NodeValue nv_dt_tz2 = 
NodeValue.makeNode("2010-03-22T20:31:54.5-05:00", XSDDatatype.XSDdateTime) ;
+    private static NodeValue nv_dt_tz3 = 
NodeValue.makeNode("2010-03-22T20:31:54.5Z", XSDDatatype.XSDdateTime) ;
+    
+    private static NodeValue nv_d_tz1 = NodeValue.makeNode("2010-03-22+01:00", 
XSDDatatype.XSDdate) ;
+    private static NodeValue nv_d_tz2 = NodeValue.makeNode("2010-03-22-05:00", 
XSDDatatype.XSDdate) ;
+    private static NodeValue nv_d_tz3 = NodeValue.makeNode("2010-03-22Z", 
XSDDatatype.XSDdate) ;
+    
+    private static NodeValue nv_t_tz1 = NodeValue.makeNode("20:31:54.5+01:00", 
XSDDatatype.XSDtime) ;
+    private static NodeValue nv_t_tz2 = NodeValue.makeNode("20:31:54.5-05:00", 
XSDDatatype.XSDtime) ;
+    private static NodeValue nv_t_tz3 = NodeValue.makeNode("20:31:54.5Z", 
XSDDatatype.XSDtime) ;
+    
+    @Test public void cast_date_tz_01() { testDateTimeCast(nv_dt_tz1, 
XSDDatatype.XSDdate, nv_d_tz1) ; }
+    @Test public void cast_date_tz_02() { testDateTimeCast(nv_dt_tz2, 
XSDDatatype.XSDdate, nv_d_tz2) ; }
+    @Test public void cast_date_tz_03() { testDateTimeCast(nv_dt_tz3, 
XSDDatatype.XSDdate, nv_d_tz3) ; }
+    
+    @Test public void cast_time_tz_01() { testDateTimeCast(nv_dt_tz1, 
XSDDatatype.XSDtime, nv_t_tz1) ; }
+    @Test public void cast_time_tz_02() { testDateTimeCast(nv_dt_tz2, 
XSDDatatype.XSDtime, nv_t_tz2) ; }
+    @Test public void cast_time_tz_03() { testDateTimeCast(nv_dt_tz3, 
XSDDatatype.XSDtime, nv_t_tz3) ; }
 }
+


Reply via email to