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 2012/05/04 14:15:20 UTC

svn commit: r1333898 - in /incubator/jena/Jena2/ARQ/trunk: src/main/java/com/hp/hpl/jena/sparql/expr/ src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/ src/main/java/com/hp/hpl/jena/sparql/util/ src/test/java/com/hp/hpl/jena/sparql/expr/ testing/ARQ/

Author: andy
Date: Fri May  4 12:15:19 2012
New Revision: 1333898

URL: http://svn.apache.org/viewvc?rev=1333898&view=rev
Log:
Rework date/time handling - use javax.xml.datattype.XMLGregorianCalendar

Added:
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDT.java
Removed:
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDate.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDateTime.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueGDay.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueGMonth.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueGMonthDay.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueGYear.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueGYearMonth.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueTime.java
Modified:
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueVisitor.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/util/DateTimeStruct.java
    incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestExpressions2.java
    incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValue.java
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/blank_manifest.ttl

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java?rev=1333898&r1=1333897&r2=1333898&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/NodeValue.java Fri May  4 12:15:19 2012
@@ -18,6 +18,22 @@
 
 package com.hp.hpl.jena.sparql.expr;
 
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSD ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDboolean ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDdate ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDdateTime ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDdecimal ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDdouble ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDduration ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDfloat ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgDay ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgMonth ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgMonthDay ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgYear ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgYearMonth ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDinteger ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDstring ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDtime ;
 import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_BOOLEAN ;
 import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DATE ;
 import static com.hp.hpl.jena.sparql.expr.ValueSpaceClassification.VSPACE_DATETIME ;
@@ -48,6 +64,7 @@ import java.util.Calendar ;
 import javax.xml.datatype.DatatypeConfigurationException ;
 import javax.xml.datatype.DatatypeFactory ;
 import javax.xml.datatype.Duration ;
+import javax.xml.datatype.XMLGregorianCalendar ;
 
 import org.openjena.atlas.lib.StrUtils ;
 import org.openjena.atlas.logging.Log ;
@@ -70,7 +87,6 @@ import com.hp.hpl.jena.sparql.graph.Node
 import com.hp.hpl.jena.sparql.graph.NodeTransform ;
 import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
 import com.hp.hpl.jena.sparql.util.* ;
-import com.hp.hpl.jena.vocabulary.XSD ;
 
 public abstract class NodeValue extends ExprNode
 {
@@ -135,15 +151,15 @@ public abstract class NodeValue extends 
     public static final BigInteger IntegerZERO = BigInteger.ZERO ;
     public static final BigDecimal DecimalZERO = BigDecimal.ZERO ;
 
-    public static final NodeValue TRUE   = NodeValue.makeNode("true", XSDDatatype.XSDboolean) ;
-    public static final NodeValue FALSE  = NodeValue.makeNode("false", XSDDatatype.XSDboolean) ;
+    public static final NodeValue TRUE   = NodeValue.makeNode("true", XSDboolean) ;
+    public static final NodeValue FALSE  = NodeValue.makeNode("false", XSDboolean) ;
     
     public static final NodeValue nvZERO = NodeValue.makeNode(NodeConst.nodeZero) ;
     public static final NodeValue nvONE  = NodeValue.makeNode(NodeConst.nodeOne) ;
     
-    public static final NodeValue nvNaN     = NodeValue.makeNode("NaN", XSDDatatype.XSDdouble) ;
-    public static final NodeValue nvINF     = NodeValue.makeNode("INF", XSDDatatype.XSDdouble) ;
-    public static final NodeValue nvNegINF  = NodeValue.makeNode("-INF",XSDDatatype.XSDdouble) ;
+    public static final NodeValue nvNaN     = NodeValue.makeNode("NaN", XSDdouble) ;
+    public static final NodeValue nvINF     = NodeValue.makeNode("INF", XSDdouble) ;
+    public static final NodeValue nvNegINF  = NodeValue.makeNode("-INF",XSDdouble) ;
     
     public static final NodeValue nvEmptyString  = NodeValue.makeString("") ;
     
@@ -151,6 +167,8 @@ public abstract class NodeValue extends 
     private static final String strForUnNode = "node value nothing" ;
     public static final NodeValue nvNothing = NodeValue.makeNode(Node.createAnon(new AnonId("node value nothing"))) ;
     
+    public static final String xsdNamespace = XSD+"#" ; 
+    
     private static DatatypeFactory datatypefactory = null ;
     static
     {
@@ -222,32 +240,42 @@ public abstract class NodeValue extends 
     { return new NodeValueDecimal(BigDecimal.valueOf(d)) ; } 
   
     public static NodeValue makeDecimal(String lexicalForm)
-    { return NodeValue.makeNode(lexicalForm, XSDDatatype.XSDdecimal) ; }
+    { return NodeValue.makeNode(lexicalForm, XSDdecimal) ; }
 
     public static NodeValue makeDateTime(String lexicalForm)
-    { return NodeValue.makeNode(lexicalForm, XSDDatatype.XSDdateTime) ; }
+    { return NodeValue.makeNode(lexicalForm, XSDdateTime) ; }
+
+    public static NodeValue makeDate(String lexicalForm)
+    { return NodeValue.makeNode(lexicalForm, XSDdate) ; }
 
-    // Deprecate calendar operations?
-    // makeDateTime(Calendar)
-    // makeDate(Calendar)
-    @Deprecated
     public static NodeValue makeDateTime(Calendar cal)
     {
-        XSDDateTime xdt = new XSDDateTime(cal) ;
-        return new NodeValueDateTime(xdt) ; }
+        String lex = Utils.calendarToXSDDateTimeString(cal) ;
+        return NodeValue.makeNode(lex, XSDdateTime) ;
+    }
+
+    public static NodeValue makeDateTime(XMLGregorianCalendar cal)
+    {
+        String lex = cal.toXMLFormat() ;
+        Node node = Node.createLiteral(lex, XSDdateTime) ; 
+        return new NodeValueDT(lex, node) ;
+    }
 
-    public static NodeValue makeDate(String lexicalForm)
-    { return NodeValue.makeNode(lexicalForm, XSDDatatype.XSDdate) ; }
-    
-    @Deprecated
     public static NodeValue makeDate(Calendar cal)
     { 
-        XSDDateTime xdt = new XSDDateTime(cal) ;
-        return new NodeValueDate(xdt) ;
+        String lex = Utils.calendarToXSDDateString(cal) ;
+        return NodeValue.makeNode(lex, XSDdate) ;
     }
     
+    public static NodeValue makeDate(XMLGregorianCalendar cal)
+    {
+        String lex = cal.toXMLFormat() ;
+        Node node = Node.createLiteral(lex, XSDdate) ; 
+        return new NodeValueDT(lex, node) ;
+    }
+
     public static NodeValue makeDuration(String lexicalForm)
-    { return NodeValue.makeNode(lexicalForm, XSDDatatype.XSDduration) ; }
+    { return NodeValue.makeNode(lexicalForm, XSDduration) ; }
 
     public static NodeValue makeBoolean(boolean b)
     { return b ? NodeValue.TRUE : NodeValue.FALSE ; }
@@ -307,55 +335,55 @@ public abstract class NodeValue extends 
 
     public static NodeValue makeNodeBoolean(String lexicalForm)
     {
-        NodeValue nv = makeNode(lexicalForm, null, XSD.xboolean.getURI()) ;
+        NodeValue nv = makeNode(lexicalForm, null, XSDboolean.getURI()) ;
         return nv ;
     }
     
     public static NodeValue makeNodeInteger(long v)
     {
-        NodeValue nv = makeNode(Long.toString(v), null, XSD.integer.getURI()) ;
+        NodeValue nv = makeNode(Long.toString(v), null, XSDinteger.getURI()) ;
         return nv ;
     }
     
     public static NodeValue makeNodeInteger(String lexicalForm)
     {
-        NodeValue nv = makeNode(lexicalForm, null, XSD.integer.getURI()) ;
+        NodeValue nv = makeNode(lexicalForm, null, XSDinteger.getURI()) ;
         return nv ;
     }
     
     public static NodeValue makeNodeFloat(float f)
     {
-        NodeValue nv = makeNode(Utils.stringForm(f), null, XSD.xfloat.getURI()) ;
+        NodeValue nv = makeNode(Utils.stringForm(f), null, XSDfloat.getURI()) ;
         return nv ;
     }
     
     public static NodeValue makeNodeFloat(String lexicalForm)
     {
-        NodeValue nv = makeNode(lexicalForm, null, XSD.xdouble.getURI()) ;
+        NodeValue nv = makeNode(lexicalForm, null, XSDdouble.getURI()) ;
         return nv ;
     }
     
     public static NodeValue makeNodeDouble(double v)
     {
-        NodeValue nv = makeNode(Utils.stringForm(v), null, XSD.xdouble.getURI()) ;
+        NodeValue nv = makeNode(Utils.stringForm(v), null, XSDdouble.getURI()) ;
         return nv ;
     }
     
     public static NodeValue makeNodeDouble(String lexicalForm)
     {
-        NodeValue nv = makeNode(lexicalForm, null, XSD.xdouble.getURI()) ;
+        NodeValue nv = makeNode(lexicalForm, null, XSDdouble.getURI()) ;
         return nv ;
     }
     
     public static NodeValue makeNodeDecimal(BigDecimal decimal)
     {
-        NodeValue nv = makeNode(Utils.stringForm(decimal), null, XSD.decimal.getURI()) ;
+        NodeValue nv = makeNode(Utils.stringForm(decimal), null, XSDdecimal.getURI()) ;
         return nv ;
     }
 
     public static NodeValue makeNodeDecimal(String lexicalForm)
     {
-        NodeValue nv = makeNode(lexicalForm, null, XSD.decimal.getURI()) ;
+        NodeValue nv = makeNode(lexicalForm, null, XSDdecimal.getURI()) ;
         return nv ;
     }
     
@@ -368,13 +396,13 @@ public abstract class NodeValue extends 
     public static NodeValue makeNodeDateTime(Calendar date)
     {
         String lex = Utils.calendarToXSDDateTimeString(date) ;
-        NodeValue nv = makeNode(lex, XSDDatatype.XSDdateTime) ;
+        NodeValue nv = makeNode(lex, XSDdateTime) ;
         return nv ;
     }
     
     public static NodeValue makeNodeDateTime(String lexicalForm)
     {
-        NodeValue nv = makeNode(lexicalForm, XSDDatatype.XSDdateTime) ;
+        NodeValue nv = makeNode(lexicalForm, XSDdateTime) ;
         return nv ;
     }
     
@@ -382,13 +410,13 @@ public abstract class NodeValue extends 
     {
         //XSDDateTime dt = new XSDDateTime(date) ;
         String lex = Utils.calendarToXSDDateString(date) ;
-        NodeValue nv = makeNode(lex, XSDDatatype.XSDdate) ;
+        NodeValue nv = makeNode(lex, XSDdate) ;
         return nv ;
     }
     
     public static NodeValue makeNodeDate(String lexicalForm)
     {
-        NodeValue nv = makeNode(lexicalForm, XSDDatatype.XSDdate) ;
+        NodeValue nv = makeNode(lexicalForm, XSDdate) ;
         return nv ;
     }
     
@@ -894,10 +922,8 @@ public abstract class NodeValue extends 
     public BigDecimal  getDecimal()     { raise(new ExprEvalTypeException("Not a decimal: "+this)) ; return null ; }
     public float       getFloat()       { raise(new ExprEvalTypeException("Not a float: "+this)) ; return Float.NaN ; }
     public double      getDouble()      { raise(new ExprEvalTypeException("Not a double: "+this)) ; return Double.NaN ; }
-    public XSDDateTime getDateTime()    { raise(new ExprEvalTypeException("No DateTime value: "+this)) ; return null ; }
-//    public XSDDateTime getDate()        { raise(new ExprEvalException("Not a date: "+this)) ; return null ; }
-//    public XSDDateTime getTime()        { raise(new ExprEvalException("Not a time: "+this)) ; return null ; }
-//
+    // Value representation for all date and time values.
+    public XMLGregorianCalendar getDateTime()    { raise(new ExprEvalTypeException("No DateTime value: "+this)) ; return null ; }
 //    /*
 //        gYearMonth   dddd-mm
 //        gYear        dddd
@@ -905,11 +931,6 @@ public abstract class NodeValue extends 
 //        gDay         ---DD
 //        gMonth       --MM
 //    */
-//    public XSDDateTime getGYear()       { raise(new ExprEvalException("Not a dateTime: "+this)) ; return null ; }
-//    public XSDDateTime getGYearMonth()  { raise(new ExprEvalException("Not a dateTime: "+this)) ; return null ; }
-//    public XSDDateTime getGMonth()      { raise(new ExprEvalException("Not a dateTime: "+this)) ; return null ; }
-//    public XSDDateTime getGMonthDay()   { raise(new ExprEvalException("Not a dateTime: "+this)) ; return null ; }
-//    public XSDDateTime getGDay()        { raise(new ExprEvalException("Not a dateTime: "+this)) ; return null ; }
 
     
     public Duration    getDuration() { raise(new ExprEvalTypeException("Not a duration: "+this)) ; return null ; }
@@ -971,13 +992,26 @@ public abstract class NodeValue extends 
     // Returns null for unrecognized literal.
     private static NodeValue _setByValue(Node node)
     {
+        if ( NodeUtils.hasLang(node) )
+            // Check for RDF 1.1!
+            return null ;
         LiteralLabel lit = node.getLiteral() ;
-        
-        // 50% of the time of this method is in isValidLiteral and the lexical form parsing.
-        
+        String lex = lit.getLexicalForm() ;
+        RDFDatatype datatype = lit.getDatatype() ;
+
+        // Quick check.
+        // Only XSD supported.
+        // And (for testing) roman numerals.
+        String datatypeURI = datatype.getURI() ;
+        if ( ! datatypeURI.startsWith(xsdNamespace) && ! enableRomanNumerals.getValue() )
+        {
+            // Not XSD.
+            return null ;
+        }
+
         try { // DatatypeFormatException - should not happen
             
-            if ( sameValueAsString && XSDDatatype.XSDstring.isValidLiteral(node.getLiteral()) ) 
+            if ( sameValueAsString && XSDstring.isValidLiteral(lit) ) 
                     // String - plain or xsd:string
                 return new NodeValueString(lit.getLexicalForm(), node) ;
             
@@ -991,9 +1025,10 @@ public abstract class NodeValue extends 
 
             // Order here is promotion order integer-decimal-float-double
             
-            if ( ! node.getLiteralDatatype().equals(XSDDatatype.XSDdecimal) ) 
+            if ( ! datatype.equals(XSDdecimal) ) 
             {
-                if ( XSDDatatype.XSDinteger.isValidLiteral(lit) )
+                // XSD integer and derived types 
+                if ( XSDinteger.isValidLiteral(lit) )
                 {
                     String s = node.getLiteralLexicalForm() ;
                     if ( s.startsWith("+") )
@@ -1006,13 +1041,13 @@ public abstract class NodeValue extends 
                 }
             }
             
-            if ( XSDDatatype.XSDdecimal.isValidLiteral(lit) )
+            if ( datatype.equals(XSDdecimal) && XSDdecimal.isValidLiteral(lit) )
             {
                 BigDecimal decimal = new BigDecimal(lit.getLexicalForm()) ;
                 return new NodeValueDecimal(decimal, node) ;
             }
             
-            if ( XSDDatatype.XSDfloat.isValidLiteral(lit) )
+            if ( datatype.equals(XSDfloat) && XSDfloat.isValidLiteral(lit) )
             {
                 // NB If needed, call to floatValue, then assign to double.
                 // Gets 1.3f != 1.3d right
@@ -1020,66 +1055,66 @@ public abstract class NodeValue extends 
                 return new NodeValueFloat(f, node) ;
             }
 
-            if ( XSDDatatype.XSDdouble.isValidLiteral(lit) )
+            if ( datatype.equals(XSDdouble) && XSDdouble.isValidLiteral(lit) )
             {
                 double d = ((Number)lit.getValue()).doubleValue() ;
                 return new NodeValueDouble(d, node) ;
             }
 
-            if ( XSDDatatype.XSDdateTime.isValidLiteral(lit) ) 
+            if ( datatype.equals(XSDdateTime) && XSDdateTime.isValidLiteral(lit) ) 
             {
                 XSDDateTime dateTime = (XSDDateTime)lit.getValue() ;
-                return new NodeValueDateTime(dateTime, node) ;
+                return new NodeValueDT(lex, node) ;
             }
             
-            if ( XSDDatatype.XSDdate.isValidLiteral(lit) )
+            if ( datatype.equals(XSDdate) && XSDdate.isValidLiteral(lit) )
             {
                 // Jena datatype support works on masked dataTimes. 
                 XSDDateTime dateTime = (XSDDateTime)lit.getValue() ;
-                return new NodeValueDate(dateTime, node) ;
+                return new NodeValueDT(lex, node) ;
             }
             
-            if ( XSDDatatype.XSDtime.isValidLiteral(lit) )
+            if ( datatype.equals(XSDtime) && XSDtime.isValidLiteral(lit) )
             {
                 // Jena datatype support works on masked dataTimes. 
                 XSDDateTime time = (XSDDateTime)lit.getValue() ;
-                return new NodeValueTime(time, node) ;
+                return new NodeValueDT(lex, node) ;
             }
             
-            if ( XSDDatatype.XSDgYear.isValidLiteral(lit) )
+            if ( datatype.equals(XSDgYear) && XSDgYear.isValidLiteral(lit) )
             {
                 XSDDateTime time = (XSDDateTime)lit.getValue() ;
-                return new NodeValueGYear(time, node) ;
+                return new NodeValueDT(lex, node) ;
             }
-            if ( XSDDatatype.XSDgYearMonth.isValidLiteral(lit) )
+            if ( datatype.equals(XSDgYearMonth) && XSDgYearMonth.isValidLiteral(lit) )
             {
                 XSDDateTime time = (XSDDateTime)lit.getValue() ;
-                return new NodeValueGYearMonth(time, node) ;
+                return new NodeValueDT(lex, node) ;
             }
-            if ( XSDDatatype.XSDgMonth.isValidLiteral(lit) )
+            if ( datatype.equals(XSDgMonth) && XSDgMonth.isValidLiteral(lit) )
             {
                 XSDDateTime time = (XSDDateTime)lit.getValue() ;
-                return new NodeValueGMonth(time, node) ;
+                return new NodeValueDT(lex, node) ;
             }
-            if ( XSDDatatype.XSDgMonthDay.isValidLiteral(lit) )
+            if ( datatype.equals(XSDgMonthDay) && XSDgMonthDay.isValidLiteral(lit) )
             {
                 XSDDateTime time = (XSDDateTime)lit.getValue() ;
-                return new NodeValueGMonthDay(time, node) ;
+                return new NodeValueDT(lex, node) ;
             }
-            if ( XSDDatatype.XSDgDay.isValidLiteral(lit) )
+            if ( datatype.equals(XSDgDay) && XSDgDay.isValidLiteral(lit) )
             {
                 XSDDateTime time = (XSDDateTime)lit.getValue() ;
-                return new NodeValueGDay(time, node) ;
+                return new NodeValueDT(lex, node) ;
             }
             
-            if ( XSDDatatype.XSDduration.isValidLiteral(lit) )
+            if ( datatype.equals(XSDduration) && XSDduration.isValidLiteral(lit) )
             {
                 //XSDDuration duration = (XSDDuration)lit.getValue() ;
                 Duration jduration = createDuration(lit.getLexicalForm()) ;
                 return new NodeValueDuration(jduration, node) ;
             }
             
-            if ( XSDDatatype.XSDboolean.isValidLiteral(lit) )
+            if ( datatype.equals(XSDboolean) && XSDboolean.isValidLiteral(lit) )
             {
                 boolean b = ((Boolean)lit.getValue()).booleanValue() ;
                 return new NodeValueBoolean(b, node) ;

Added: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDT.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDT.java?rev=1333898&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDT.java (added)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueDT.java Fri May  4 12:15:19 2012
@@ -0,0 +1,100 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.hp.hpl.jena.sparql.expr.nodevalue;
+
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDdate ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDdateTime ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgDay ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgMonth ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgMonthDay ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgYear ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDgYearMonth ;
+import static com.hp.hpl.jena.datatypes.xsd.XSDDatatype.XSDtime ;
+
+import javax.xml.datatype.DatatypeConfigurationException ;
+import javax.xml.datatype.DatatypeFactory ;
+import javax.xml.datatype.XMLGregorianCalendar ;
+
+import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
+import com.hp.hpl.jena.sparql.expr.NodeValue ;
+
+public class NodeValueDT extends NodeValue
+{
+    private static DatatypeFactory datatypefactory = null ;
+    static
+    {
+        try { datatypefactory = DatatypeFactory.newInstance() ; }
+        catch (DatatypeConfigurationException ex)
+        { throw new ARQInternalErrorException("Can't create a javax.xml DatatypeFactory") ; }
+    }
+    
+    final XMLGregorianCalendar datatime ;
+    
+    public NodeValueDT(String lex, Node n)
+    {
+        super(n) ;
+        // Java bug : Java6 gMonth with a timezone of Z causes IllegalArgumnentException
+        if ( isGMonth() )
+        {
+            if ( lex.endsWith("Z") )
+            {
+                lex = lex.substring(0, lex.length()-1) ;
+                datatime = datatypefactory.newXMLGregorianCalendar(lex) ;
+                datatime.setTimezone(0) ;
+                return ;
+            }
+        }
+        datatime = datatypefactory.newXMLGregorianCalendar(lex) ;
+    }
+
+    // Look at datatype.
+    // By doing this here, the check of valid lexical form must have been done to create the node.
+    @Override
+    public boolean isDateTime()     { return XSDdateTime.equals(getNode().getLiteralDatatype()) ; }
+    @Override
+    public boolean isDate()         { return XSDdate.equals(getNode().getLiteralDatatype()) ; }
+    @Override
+    public boolean isTime()         { return XSDtime.equals(getNode().getLiteralDatatype()) ; }
+    @Override
+    public boolean isGYear()        { return XSDgYear.equals(getNode().getLiteralDatatype()) ; }
+    @Override
+    public boolean isGYearMonth()   { return XSDgYearMonth.equals(getNode().getLiteralDatatype()) ; }
+    @Override
+    public boolean isGMonth()       { return XSDgMonth.equals(getNode().getLiteralDatatype()) ; }
+    @Override
+    public boolean isGMonthDay()    { return XSDgMonthDay.equals(getNode().getLiteralDatatype()) ; }
+    @Override
+    public boolean isGDay()         { return XSDgDay.equals(getNode().getLiteralDatatype()) ; }
+    
+    @Override
+    public XMLGregorianCalendar getDateTime()    { return (XMLGregorianCalendar)datatime.clone() ; }
+
+    
+    @Override
+    protected Node makeNode()
+    {
+        return null ;
+    }
+
+    @Override
+    public void visit(NodeValueVisitor visitor)
+    { visitor.visit(this) ; }
+}
+

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueVisitor.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueVisitor.java?rev=1333898&r1=1333897&r2=1333898&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueVisitor.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/NodeValueVisitor.java Fri May  4 12:15:19 2012
@@ -21,20 +21,21 @@ package com.hp.hpl.jena.sparql.expr.node
 public interface NodeValueVisitor
 {
     public void visit(NodeValueBoolean nv) ;
-    public void visit(NodeValueDate nv) ;
-    public void visit(NodeValueDateTime nv) ;
+//    public void visit(NodeValueDate nv) ;
+//    public void visit(NodeValueDateTime nv) ;
     public void visit(NodeValueDecimal nv) ;
     public void visit(NodeValueDouble nv) ;
     public void visit(NodeValueFloat nv) ;
     public void visit(NodeValueInteger nv) ;
     public void visit(NodeValueNode nv) ;
     public void visit(NodeValueString nv) ;
-    public void visit(NodeValueTime nv) ;
+    public void visit(NodeValueDT nv) ;
+//    public void visit(NodeValueTime nv) ;
 	public void visit(NodeValueDuration nodeValueDuration);
 
-	public void visit(NodeValueGYear nv) ;
-    public void visit(NodeValueGYearMonth nv) ;
-    public void visit(NodeValueGMonth nv) ;
-    public void visit(NodeValueGMonthDay nv) ;
-    public void visit(NodeValueGDay nv) ;
+//	public void visit(NodeValueGYear nv) ;
+//    public void visit(NodeValueGYearMonth nv) ;
+//    public void visit(NodeValueGMonth nv) ;
+//    public void visit(NodeValueGMonthDay nv) ;
+//    public void visit(NodeValueGDay nv) ;
 }

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java?rev=1333898&r1=1333897&r2=1333898&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java Fri May  4 12:15:19 2012
@@ -34,6 +34,7 @@ import java.util.regex.Pattern ;
 
 import javax.xml.datatype.DatatypeConstants ;
 import javax.xml.datatype.Duration ;
+import javax.xml.datatype.XMLGregorianCalendar ;
 
 import org.openjena.atlas.lib.StrUtils ;
 import org.openjena.atlas.logging.Log ;
@@ -889,8 +890,8 @@ public class XSDFuncOp
     
     private static int compareDateTimeFO(NodeValue nv1, NodeValue nv2)
     {
-        XSDDateTime dt1 = nv1.getDateTime() ;
-        XSDDateTime dt2 = nv2.getDateTime() ;
+        XMLGregorianCalendar dt1 = nv1.getDateTime() ;
+        XMLGregorianCalendar dt2 = nv2.getDateTime() ;
         
         int x = compareXSDDateTime(dt1, dt2) ;
         
@@ -899,7 +900,7 @@ public class XSDFuncOp
             NodeValue nv3 = fixupDateTime(nv1) ;
             if ( nv3 != null )
             {
-                XSDDateTime dt3 = nv3.getDateTime() ; 
+                XMLGregorianCalendar dt3 = nv3.getDateTime() ; 
                 x =  compareXSDDateTime(dt3, dt2) ;
                 if ( x == XSDDateTime.INDETERMINATE )
                     throw new ARQInternalErrorException("Still get indeterminate comparison") ;
@@ -909,7 +910,7 @@ public class XSDFuncOp
             nv3 = fixupDateTime(nv2) ;
             if ( nv3 != null )
             {
-                XSDDateTime dt3 = nv3.getDateTime() ; 
+                XMLGregorianCalendar dt3 = nv3.getDateTime() ; 
                 x =  compareXSDDateTime(dt1, dt3) ;
                 if ( x == XSDDateTime.INDETERMINATE )
                     throw new ARQInternalErrorException("Still get indeterminate comparison") ;
@@ -926,8 +927,8 @@ public class XSDFuncOp
     // This only differs by some "dateTime" => "date" 
     private static int compareDateFO(NodeValue nv1, NodeValue nv2)
     {
-        XSDDateTime dt1 = nv1.getDateTime() ;
-        XSDDateTime dt2 = nv2.getDateTime() ;
+        XMLGregorianCalendar dt1 = nv1.getDateTime() ;
+        XMLGregorianCalendar dt2 = nv2.getDateTime() ;
 
         int x = compareXSDDateTime(dt1, dt2) ;    // Yes - compareDateTIme
         if ( x == XSDDateTime.INDETERMINATE )
@@ -935,7 +936,7 @@ public class XSDFuncOp
             NodeValue nv3 = fixupDate(nv1) ;
             if ( nv3 != null )
             {
-                XSDDateTime dt3 = nv3.getDateTime() ; 
+                XMLGregorianCalendar dt3 = nv3.getDateTime() ; 
                 x =  compareXSDDateTime(dt3, dt2) ;
                 if ( x == XSDDateTime.INDETERMINATE )
                     throw new ARQInternalErrorException("Still get indeterminate comparison") ;
@@ -945,7 +946,7 @@ public class XSDFuncOp
             nv3 = fixupDate(nv2) ;
             if ( nv3 != null )
             {
-                XSDDateTime dt3 = nv3.getDateTime() ; 
+                XMLGregorianCalendar dt3 = nv3.getDateTime() ; 
                 x = compareXSDDateTime(dt1, dt3) ;
                 if ( x == XSDDateTime.INDETERMINATE )
                     throw new ARQInternalErrorException("Still get indeterminate comparison") ;
@@ -981,7 +982,7 @@ public class XSDFuncOp
         return nv ;
     }
 
-    private static int compareXSDDateTime(XSDDateTime dt1 , XSDDateTime dt2)
+    private static int compareXSDDateTime(XMLGregorianCalendar dt1 , XMLGregorianCalendar dt2)
     {
         // Returns codes are -1/0/1 but also 2 for "Indeterminate"
         // which occurs when one has a timezone and one does not
@@ -1098,7 +1099,7 @@ public class XSDFuncOp
         if ( ! nv.hasDateTime() )
             throw new ExprEvalTypeException("Not a date/time type: "+nv) ;
         
-        XSDDateTime xsdDT = nv.getDateTime() ;
+        XMLGregorianCalendar xsdDT = nv.getDateTime() ;
         
         if ( XSDDatatype.XSDdateTime.equals(xsd) )
         {
@@ -1106,7 +1107,7 @@ public class XSDFuncOp
             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.getYears(), xsdDT.getMonths(),xsdDT.getDays()) ;
+            String x = String.format("%04d-%02d-%02dT00:00:00", xsdDT.getYear(), xsdDT.getMonth(),xsdDT.getDay()) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1115,7 +1116,7 @@ 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.getYears(), xsdDT.getMonths(),xsdDT.getDays()) ;
+            String x = String.format("%04d-%02d-%02d", xsdDT.getYear(), xsdDT.getMonth(),xsdDT.getDay()) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1127,8 +1128,8 @@ public class XSDFuncOp
             // Careful foratting 
             DecimalFormat nf = new DecimalFormat("00.####") ;
             nf.setDecimalSeparatorAlwaysShown(false) ;
-            String x = nf.format(xsdDT.getSeconds()) ;
-            x = String.format("%02d:%02d:%s", xsdDT.getHours(), xsdDT.getMinutes(),x) ;
+            String x = nf.format(xsdDT.getSecond()) ;
+            x = String.format("%02d:%02d:%s", xsdDT.getHour(), xsdDT.getMinute(),x) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1137,7 +1138,7 @@ public class XSDFuncOp
             // ==> Year
             if ( nv.isGYear() ) return nv ;
             if ( ! nv.isDateTime() && ! nv.isDate() ) throw new ExprEvalTypeException("Can't cast to XSD:gYear: "+nv) ;
-            String x = String.format("%04d", xsdDT.getYears()) ;
+            String x = String.format("%04d", xsdDT.getYear()) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1146,7 +1147,7 @@ public class XSDFuncOp
             // ==> YearMonth
             if ( nv.isGYearMonth() ) return nv ;
             if ( ! nv.isDateTime() && ! nv.isDate() ) throw new ExprEvalTypeException("Can't cast to XSD:gYearMonth: "+nv) ;
-            String x = String.format("%04d-%02d", xsdDT.getYears(), xsdDT.getMonths()) ;
+            String x = String.format("%04d-%02d", xsdDT.getYear(), xsdDT.getMonth()) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1155,7 +1156,7 @@ public class XSDFuncOp
             // ==> Month
             if ( nv.isGMonth() ) return nv ;
             if ( ! nv.isDateTime() && ! nv.isDate() ) throw new ExprEvalTypeException("Can't cast to XSD:gMonth: "+nv) ;
-            String x = String.format("--%02d", xsdDT.getMonths()) ;
+            String x = String.format("--%02d", xsdDT.getMonth()) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1164,7 +1165,7 @@ public class XSDFuncOp
             // ==> MonthDay
             if ( nv.isGMonthDay() ) return nv ;
             if ( ! nv.isDateTime() && ! nv.isDate() ) throw new ExprEvalTypeException("Can't cast to XSD:gMonthDay: "+nv) ;
-            String x = String.format("--%02d-%02d", xsdDT.getMonths(), xsdDT.getDays()) ;
+            String x = String.format("--%02d-%02d", xsdDT.getMonth(), xsdDT.getDay()) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     
@@ -1173,7 +1174,7 @@ public class XSDFuncOp
             // Day
             if ( nv.isGDay() ) return nv ;
             if ( ! nv.isDateTime() && ! nv.isDate() ) throw new ExprEvalTypeException("Can't cast to XSD:gDay: "+nv) ;
-            String x = String.format("---%02d", xsdDT.getDays()) ;
+            String x = String.format("---%02d", xsdDT.getDay()) ;
             return NodeValue.makeNode(x, xsd) ;
         }
     

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/util/DateTimeStruct.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/util/DateTimeStruct.java?rev=1333898&r1=1333897&r2=1333898&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/util/DateTimeStruct.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/util/DateTimeStruct.java Fri May  4 12:15:19 2012
@@ -22,28 +22,6 @@ package com.hp.hpl.jena.sparql.util;
 
 public class DateTimeStruct
 {
-    // V2
-    // Does gregorian stuff
-    
-    // "2001Z"      gYear
-    // "2001-01Z"   gYearMonth
-    // "--01Z"      gMonth
-    // "--01-30Z"   gMonthDay
-    // "---30Z"     gDay
-
-    
-//    private static final int idxNeg = 0 ;
-//    private static final int idxYear = 1 ;
-//    private static final int idxMonth = 2 ;
-//    private static final int idxDay = 3 ;
-//
-//    private static final int idxHour = 4 ;
-//    private static final int idxMinute = 5 ;
-//    private static final int idxSecond = 6 ;
-//    private static final int idxTimezone = 7 ;
-//    
-//    private String data[] = new String[8] ;
-    
     public boolean xsdDateTime  ;
     public String neg = null ;         // Null if none. 
     public String year = null ;

Modified: incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestExpressions2.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestExpressions2.java?rev=1333898&r1=1333897&r2=1333898&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestExpressions2.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestExpressions2.java Fri May  4 12:15:19 2012
@@ -49,9 +49,9 @@ public class TestExpressions2 extends As
     @Test public void gregorian_eq_08()         { eval("'1999-01'^^xsd:gYearMonth != '2001Z'^^xsd:gYear", true) ; }
     @Test public void gregorian_eq_09()         { eval("'1999-01'^^xsd:gYearMonth != '2001Z'^^xsd:gYear", true) ; }
     
-    @Test public void gregorian_cmp_01()        { eval("'1999'^^xsd:gYear < '2000'^^xsd:gYear", true) ; }
-    @Test public void gregorian_cmp_02()        { eval("'1999'^^xsd:gYear > '2000'^^xsd:gYear", false) ; }
-    @Test public void gregorian_cmp_03()        { eval("'1999'^^xsd:gYear < '2000+01:00'^^xsd:gYear", true) ; }
+    @Test public void gregorian_cmp_01()        { eval("'1999'^^xsd:gYear < '2001'^^xsd:gYear", true) ; }
+    @Test public void gregorian_cmp_02()        { eval("'1999'^^xsd:gYear > '2001'^^xsd:gYear", false) ; }
+    @Test public void gregorian_cmp_03()        { eval("'1999'^^xsd:gYear < '2001+01:00'^^xsd:gYear", true) ; }
 
     @Test (expected=ExprEvalException.class)
     public void gregorian_cmp_04()              { eval("'1999'^^xsd:gYear < '1999+05:00'^^xsd:gYear") ; }

Modified: incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValue.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValue.java?rev=1333898&r1=1333897&r2=1333898&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValue.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/expr/TestNodeValue.java Fri May  4 12:15:19 2012
@@ -178,8 +178,8 @@ public class TestNodeValue extends TestC
         assertTrue("Not a dateTime: "+v, v.isDateTime()) ;
         assertFalse("A date: "+v, v.isDate()) ;
         assertTrue("Not a node: "+v, v.hasNode()) ;
-        Calendar cal2 = v.getDateTime().asCalendar() ;
-        assertEquals("Not equal: "+v, cal1, cal2) ;
+        Calendar cal2 = v.getDateTime().toGregorianCalendar() ;
+        assertEquals("Not equal: "+v, 0, cal1.compareTo(cal2)) ;
     }
 
     @Test public void testDateTime5()
@@ -240,8 +240,8 @@ public class TestNodeValue extends TestC
         assertTrue("Not a date: "+v, v.isDate()) ;
         assertFalse("A dateTime: "+v, v.isDateTime()) ;
         assertTrue("Not a node: "+v, v.hasNode()) ;
-        Calendar cal2 = v.getDateTime().asCalendar() ;
-        assertEquals("Not equal: "+v, cal1, cal2) ;
+        Calendar cal2 = v.getDateTime().toGregorianCalendar() ;
+        assertEquals("Not equal: "+v, 0, cal1.compareTo(cal2)) ; 
     }
 
     @Test public void testDate5()

Modified: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/blank_manifest.ttl
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/blank_manifest.ttl?rev=1333898&r1=1333897&r2=1333898&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/blank_manifest.ttl (original)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/blank_manifest.ttl Fri May  4 12:15:19 2012
@@ -1,3 +1,18 @@
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+# 
+#       http://www.apache.org/licenses/LICENSE-2.0
+# 
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
 @prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
 @prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
 @prefix mf:     <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .