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) ; }
}
+