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 2015/12/17 21:58:18 UTC

[1/6] jena git commit: Remove stray blank line.

Repository: jena
Updated Branches:
  refs/heads/master 7248f19b5 -> 590c06a89


Remove stray blank line.

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

Branch: refs/heads/master
Commit: 751e49ce8b1b3c98d6978b91fe395da0fc5333ec
Parents: 7248f19
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Dec 17 16:57:20 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Dec 17 16:57:20 2015 +0000

----------------------------------------------------------------------
 jena-core/src/main/java/org/apache/jena/rdf/model/impl/Util.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/751e49ce/jena-core/src/main/java/org/apache/jena/rdf/model/impl/Util.java
----------------------------------------------------------------------
diff --git a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/Util.java b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/Util.java
index d88b755..3dfae8c 100644
--- a/jena-core/src/main/java/org/apache/jena/rdf/model/impl/Util.java
+++ b/jena-core/src/main/java/org/apache/jena/rdf/model/impl/Util.java
@@ -220,7 +220,6 @@ public class Util extends Object {
             return false ;
         return !lang.equals("") ;
     }
-
     
     /** Return true if the literal is a simple string.
      *  <p>RDF 1.0 => it is a plain literal, with no language tag


[6/6] jena git commit: JENA-1102; Use new lang string support.

Posted by an...@apache.org.
JENA-1102; Use new lang string support.

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

Branch: refs/heads/master
Commit: 590c06a8937a071c7f9b01254d44c7bc2811adfa
Parents: f8f5b62
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Dec 17 18:10:49 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Dec 17 18:10:49 2015 +0000

----------------------------------------------------------------------
 .../jena/sparql/expr/nodevalue/NodeFunctions.java     | 14 +++++++++-----
 .../jena/sparql/expr/nodevalue/NodeValueLang.java     |  2 +-
 2 files changed, 10 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/590c06a8/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
index 4df9aad..b0a2c4d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeFunctions.java
@@ -228,7 +228,12 @@ public class NodeFunctions {
     // -------- lang
 
     public static NodeValue lang(NodeValue nv) {
-        return NodeValue.makeString(lang(nv.asNode())) ;
+        if ( nv.isLangString() )
+            return NodeValue.makeString(nv.getLang()) ;
+        if ( nv.isLiteral() )
+            return NodeValue.nvEmptyString ;
+        NodeValue.raise(new ExprTypeException("lang: Not a literal: " + nv.asQuotedString())) ;
+        return null ;
     }
 
     public static String lang(Node node) {
@@ -469,10 +474,9 @@ public class NodeFunctions {
 
         String lex = v1.asString() ;
         String lang = v2.asString() ;
-        // Check?
-
-        Node n = NodeFactory.createLiteral(lex, lang) ;
-        return NodeValue.makeNode(n) ;
+        if ( lang.isEmpty() )
+            throw new ExprEvalException("Empty lang tag") ;
+        return NodeValue.makeLangString(lex, lang) ;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/590c06a8/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java
index 157fd63..88c329d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java
@@ -65,7 +65,7 @@ public class NodeValueLang extends NodeValue {
     
     @Override
     protected Node makeNode()
-    { return NodeFactory.createLiteral(super.getString(), lang) ; }
+    { return NodeFactory.createLiteral(string, lang) ; }
     
     @Override
     public String toString() { 


[3/6] jena git commit: Clarify comment.

Posted by an...@apache.org.
Clarify comment.

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

Branch: refs/heads/master
Commit: c0bb5f24ad4c977a50a057e42183e25b09c58331
Parents: 2a50b82
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Dec 17 17:41:55 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Dec 17 17:41:55 2015 +0000

----------------------------------------------------------------------
 .../org/apache/jena/sparql/expr/nodevalue/NodeValueString.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/c0bb5f24/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueString.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueString.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueString.java
index 0beb283..a921c43 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueString.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueString.java
@@ -26,7 +26,7 @@ import org.apache.jena.sparql.util.FmtUtils ;
 
 public class NodeValueString extends NodeValue
 {
-    // A plain string, no language tag or xsd:string.
+    // A plain string, with no language tag, or an xsd:string.
     
     private String string ; 
     


[2/6] jena git commit: JENA-1102: EBV of "a"@en now handled.

Posted by an...@apache.org.
JENA-1102: EBV of "a"@en now handled.

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

Branch: refs/heads/master
Commit: 2a50b822d15d9505ae5c60fa02d2fd74ff34599c
Parents: 751e49c
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Dec 17 16:58:56 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Dec 17 16:58:56 2015 +0000

----------------------------------------------------------------------
 .../jena/sparql/expr/nodevalue/XSDFuncOp.java   |  7 ++++--
 .../apache/jena/sparql/expr/TestNodeValue.java  | 26 +++++++++++++++++---
 2 files changed, 27 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/2a50b822/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
index 6b2ea50..d0cadee 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
@@ -218,14 +218,17 @@ public class XSDFuncOp
     public static boolean booleanEffectiveValue(NodeValue nv) {
         // Apply the "boolean effective value" rules
         // boolean: value of the boolean (strictly, if derived from xsd:boolean)
-        // string: length(string) > 0
+        // plain literal: lexical form length(string) > 0
         // numeric: number != Nan && number != 0
         // http://www.w3.org/TR/xquery/#dt-ebv
 
         if ( nv.isBoolean() )
             return nv.getBoolean() ;
         if ( nv.isString() )
-            return nv.getString().length() > 0 ;
+            return ! nv.getString().isEmpty() ;
+        if ( nv.isLiteral() && Util.isLangString(nv.asNode()) ) 
+            // Plain literals : no lang tag done by the test above.
+            return ! nv.getNode().getLiteralLexicalForm().isEmpty() ;
         if ( nv.isInteger() )
             return !nv.getInteger().equals(NodeValue.IntegerZERO) ;
         if ( nv.isDecimal() )

http://git-wip-us.apache.org/repos/asf/jena/blob/2a50b822/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
index bb94098..465f896 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
@@ -27,6 +27,7 @@ import org.apache.jena.JenaRuntime ;
 import org.apache.jena.atlas.junit.BaseTest ;
 import org.apache.jena.datatypes.xsd.XSDDatatype ;
 import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.NodeFactory ;
 import org.apache.jena.sparql.expr.ExprEvalException ;
 import org.apache.jena.sparql.expr.NodeValue ;
 import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp ;
@@ -554,8 +555,6 @@ public class TestNodeValue extends BaseTest
     {
         NodeValue v = NodeValue.makeInteger(1) ;
         assertFalse("It's a boolean: "+v, v.isBoolean()) ;
-        //assertTrue("Not a node: "+v, v.hasNode()) ;
-        try { v.getBoolean() ; fail("getBoolean should fail") ; } catch (ExprEvalException e) {}
         assertTrue("Not EBV true: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
     }
     
@@ -563,7 +562,6 @@ public class TestNodeValue extends BaseTest
     {
         NodeValue v = NodeValue.makeInteger(0) ;
         assertFalse("It's a boolean: "+v, v.isBoolean()) ;
-        //assertTrue("Not a node: "+v, v.hasNode()) ;
         try { v.getBoolean() ; fail("getBoolean should fail") ; } catch (ExprEvalException e) {}
         assertFalse("Not EBV false: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
     }
@@ -581,11 +579,31 @@ public class TestNodeValue extends BaseTest
     {
         NodeValue v = NodeValue.makeString("") ;
         assertFalse("It's a boolean: "+v, v.isBoolean()) ;
-        //assertTrue("Not a node: "+v, v.hasNode()) ;
         try { v.getBoolean() ; fail("getBoolean should fail") ; } catch (ExprEvalException e) {}
         assertFalse("Not EBV false: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
     }
     
+    // EBV includes plain literals which includes language tagged literals.
+    @Test public void testEBV7()
+    {
+        Node x = NodeFactory.createLiteral("", "en") ;
+        NodeValue v = NodeValue.makeNode(x) ;
+        assertFalse("Not EBV false: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+    }
+
+    @Test public void testEBV8()
+    {
+        Node x = NodeFactory.createLiteral("not empty", "en") ;
+        NodeValue v = NodeValue.makeNode(x) ;
+        assertTrue("Not EBV true: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+    }
+
+    private static boolean filterEBV(NodeValue nv) {
+        try { return XSDFuncOp.booleanEffectiveValue(nv) ; }
+        catch (ExprEvalException ex) { return false ; }
+    }
+    
+    
     @Test public void testFloatDouble1()
     {
         NodeValue v1 = NodeValue.makeNodeDouble("1.5") ;


[5/6] jena git commit: Need to force to a node.

Posted by an...@apache.org.
Need to force to a node.

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

Branch: refs/heads/master
Commit: f8f5b62a703bdf8be220ad6fd82f9bf8e48e43ba
Parents: 4c371b8
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Dec 17 18:10:23 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Dec 17 18:10:23 2015 +0000

----------------------------------------------------------------------
 .../src/main/java/org/apache/jena/sparql/expr/NodeValue.java     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/f8f5b62a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
index bd07620..4267345 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
@@ -550,8 +550,8 @@ public abstract class NodeValue extends ExprNode
             case VSPACE_UNKNOWN:
             {
                 // One or two unknown value spaces, or one has a lang tag (but not both).
-                Node node1 = nv1.getNode() ;
-                Node node2 = nv2.getNode() ;
+                Node node1 = nv1.asNode() ;
+                Node node2 = nv2.asNode() ;
                 
                 if ( ! SystemARQ.ValueExtensions )
                     // No value extensions => raw rdfTermEquals


[4/6] jena git commit: JENA-1102: Add NodeValue support for rdf:langString.

Posted by an...@apache.org.
JENA-1102: Add NodeValue support for rdf:langString. 

New NodeValueLang, not using NodeValueNode.

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

Branch: refs/heads/master
Commit: 4c371b80c59d05433689a03e228b66b0e40bece1
Parents: c0bb5f2
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Dec 17 17:43:18 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Dec 17 17:43:18 2015 +0000

----------------------------------------------------------------------
 .../org/apache/jena/sparql/expr/NodeValue.java  |   19 +-
 .../sparql/expr/nodevalue/NodeValueLang.java    |   79 ++
 .../sparql/expr/nodevalue/NodeValueVisitor.java |    1 +
 .../jena/sparql/expr/nodevalue/XSDFuncOp.java   |    6 +-
 .../apache/jena/sparql/expr/TestNodeValue.java  | 1304 +++++++++---------
 5 files changed, 766 insertions(+), 643 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/4c371b80/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
index ebb6621..bd07620 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
@@ -240,6 +240,9 @@ public abstract class NodeValue extends ExprNode
     public static NodeValue makeString(String s) 
     { return new NodeValueString(s) ; }
 
+    public static NodeValue makeLangString(String s, String lang) 
+    { return new NodeValueLang(s, lang) ; }
+
     public static NodeValue makeDecimal(BigDecimal d)
     { return new NodeValueDecimal(d) ; }
   
@@ -900,6 +903,7 @@ public abstract class NodeValue extends ExprNode
     
     public boolean isBoolean()      { return false ; } 
     public boolean isString()       { return false ; } 
+    public boolean isLangString()   { return false ; }
 
     public boolean isNumber()       { return false ; }
     public boolean isInteger()      { return false ; }
@@ -943,6 +947,8 @@ public abstract class NodeValue extends ExprNode
     
     public boolean     getBoolean()     { raise(new ExprEvalTypeException("Not a boolean: "+this)) ; return false ; }
     public String      getString()      { raise(new ExprEvalTypeException("Not a string: "+this)) ; return null ; }
+    public String      getLang()        { raise(new ExprEvalTypeException("Not a string: "+this)) ; return null ; }
+    
     public BigInteger  getInteger()     { raise(new ExprEvalTypeException("Not an integer: "+this)) ; return null ; }
     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 ; }
@@ -969,15 +975,13 @@ public abstract class NodeValue extends ExprNode
         if ( isPlainLiteral )
             return new NodeValueString(node.getLiteralLexicalForm(), node) ;
 
-        if ( hasLangTag )
-        {
+        if ( hasLangTag ) {
             // Works for RDF 1.0 and RDF 1.1
-            if ( node.getLiteralDatatype() != null && ! RDF.dtLangString.equals(node.getLiteralDatatype()) )
-            {
+            if ( node.getLiteralDatatype() != null && ! RDF.dtLangString.equals(node.getLiteralDatatype()) ) {
                 if ( NodeValue.VerboseWarnings )
                     Log.warn(NodeValue.class, "Lang tag and datatype (datatype ignored)") ;
             }
-            return new NodeValueNode(node) ;
+            return new NodeValueLang(node) ;
         }
 
         // Typed literal
@@ -1011,8 +1015,10 @@ public abstract class NodeValue extends ExprNode
     
     // Returns null for unrecognized literal.
     private static NodeValue _setByValue(Node node) {
+        // This should not happen. 
+        // nodeToNodeValue should have dealt with it.
         if ( NodeUtils.hasLang(node) )
-            return null ;
+            return new NodeValueLang(node) ;
         LiteralLabel lit = node.getLiteral() ;
         String lex = lit.getLexicalForm() ;
         RDFDatatype datatype = lit.getDatatype() ;
@@ -1027,7 +1033,6 @@ public abstract class NodeValue extends ExprNode
         }
 
         try { // DatatypeFormatException - should not happen
-            
             if ( XSDstring.isValidLiteral(lit) ) 
                 // String - plain or xsd:string, or derived datatype.
                 return new NodeValueString(lit.getLexicalForm(), node) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/4c371b80/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java
new file mode 100644
index 0000000..157fd63
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueLang.java
@@ -0,0 +1,79 @@
+/**
+ * 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 org.apache.jena.sparql.expr.nodevalue;
+
+import java.util.Objects ;
+
+import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.NodeFactory ;
+import org.apache.jena.sparql.expr.NodeValue ;
+import org.apache.jena.sparql.util.FmtUtils ;
+
+/** A NodeValue that is a lang tagged literal (rdf:langString).
+ * A string + language tag which is not ""
+ */
+public class NodeValueLang extends NodeValue {
+    // We could extends NodeValueString for the machinary
+    // but it get confusing as then it is a NodeValueString 
+    // but isString is false.
+    
+    private final String string ; 
+    private final String lang;
+
+    public NodeValueLang(String lex, String lang) {
+        this.string = Objects.requireNonNull(lex) ;
+        this.lang = Objects.requireNonNull(lang) ;
+        if ( lang.isEmpty() )
+            throw new IllegalArgumentException("lang is the empty string") ;
+    }
+    
+    public NodeValueLang(Node n) {
+        super(Objects.requireNonNull(n)) ;
+        this.string = n.getLiteralLexicalForm() ;
+        this.lang = n.getLiteralLanguage() ;
+    }
+
+    @Override
+    public boolean isLangString() {
+        return true;
+    }
+    
+    @Override
+    public String getString()   { return string ; }
+
+    @Override
+    public String getLang()     { return lang ; }
+    
+    @Override
+    public String asString()    { return string ; }
+    
+    @Override
+    protected Node makeNode()
+    { return NodeFactory.createLiteral(super.getString(), lang) ; }
+    
+    @Override
+    public String toString() { 
+        if ( getNode() != null )
+            return FmtUtils.stringForNode(getNode()) ;
+        return "'"+getString()+"'@"+lang  ;
+    }
+    
+    @Override
+    public void visit(NodeValueVisitor visitor) { visitor.visit(this) ; }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/4c371b80/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueVisitor.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueVisitor.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueVisitor.java
index cd14754..992a5c3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueVisitor.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/NodeValueVisitor.java
@@ -28,6 +28,7 @@ public interface NodeValueVisitor
     public void visit(NodeValueFloat nv) ;
     public void visit(NodeValueInteger nv) ;
     public void visit(NodeValueNode nv) ;
+    public void visit(NodeValueLang nv) ;
     public void visit(NodeValueString nv) ;
     public void visit(NodeValueDT nv) ;
 //    public void visit(NodeValueTime nv) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/4c371b80/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
index d0cadee..ce55719 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
@@ -224,11 +224,9 @@ public class XSDFuncOp
 
         if ( nv.isBoolean() )
             return nv.getBoolean() ;
-        if ( nv.isString() )
+        if ( nv.isString() || nv.isLangString() )
+            // Plain literals.
             return ! nv.getString().isEmpty() ;
-        if ( nv.isLiteral() && Util.isLangString(nv.asNode()) ) 
-            // Plain literals : no lang tag done by the test above.
-            return ! nv.getNode().getLiteralLexicalForm().isEmpty() ;
         if ( nv.isInteger() )
             return !nv.getInteger().equals(NodeValue.IntegerZERO) ;
         if ( nv.isDecimal() )

http://git-wip-us.apache.org/repos/asf/jena/blob/4c371b80/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
index 465f896..05d6b8f 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestNodeValue.java
@@ -43,397 +43,388 @@ public class TestNodeValue extends BaseTest
 {
     static final double doubleAccuracy = 0.00000001d ;
 
-    @Test public void testInt1()
-    {
-        NodeValue v = NodeValue.makeInteger(5) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not an integer: "+v, v.isInteger()) ;
-        assertFalse("Is a node: "+v, v.hasNode()) ;
-    }
-    
-    @Test public void testInt2()
-    {
-        NodeValue v = NodeValue.makeNodeInteger(5) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not an integer: "+v, v.isInteger()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-    }
-    
-    @Test public void testInt3()
-    {
-        NodeValue v1 = NodeValue.makeNodeInteger(5) ;
-        NodeValue v2 = NodeValue.makeInteger(5) ;
-        assertTrue("Not same integer: "+v1+" & "+v2, v1.getInteger().equals(v2.getInteger())) ; 
-    }
-    
-    @Test public void testFloat1()
-    {
-        NodeValue v = NodeValue.makeFloat(5) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a float: "+v, v.isFloat()) ;
-        assertTrue("Float not a double: "+v, v.isDouble()) ;
-        assertFalse("No node: "+v, v.hasNode()) ;
-    }
-    
-    @Test public void testFloat2()
-    {
-        NodeValue v = NodeValue.makeNodeFloat(5) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a float: "+v, v.isDouble()) ;
-        assertTrue("Float not a double: "+v, v.isDouble()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-    }
-
-    @Test public void testFloat3()
-    {
-        NodeValue v1 = NodeValue.makeNodeFloat(5.7f) ;
-        NodeValue v2 = NodeValue.makeFloat(5.7f) ;
-        assertTrue("Not same float: "+v1+" & "+v2, v1.getFloat() == v2.getFloat()) ; 
-        assertTrue("Not same float as double: "+v1+" & "+v2, v1.getDouble() == v2.getDouble()) ; 
-    }
-    
-    @Test public void testDouble1()
-    {
-        NodeValue v = NodeValue.makeDouble(5) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDouble()) ;
-        assertFalse("No node: "+v, v.hasNode()) ;
-    }
+    @Test
+    public void testInt1() {
+        NodeValue v = NodeValue.makeInteger(5);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not an integer: " + v, v.isInteger());
+        assertFalse("Is a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testInt2() {
+        NodeValue v = NodeValue.makeNodeInteger(5);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not an integer: " + v, v.isInteger());
+        assertTrue("Not a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testInt3() {
+        NodeValue v1 = NodeValue.makeNodeInteger(5);
+        NodeValue v2 = NodeValue.makeInteger(5);
+        assertTrue("Not same integer: " + v1 + " & " + v2, v1.getInteger().equals(v2.getInteger()));
+    }
+
+    @Test
+    public void testFloat1() {
+        NodeValue v = NodeValue.makeFloat(5);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a float: " + v, v.isFloat());
+        assertTrue("Float not a double: " + v, v.isDouble());
+        assertFalse("No node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testFloat2() {
+        NodeValue v = NodeValue.makeNodeFloat(5);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a float: " + v, v.isDouble());
+        assertTrue("Float not a double: " + v, v.isDouble());
+        assertTrue("Not a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testFloat3() {
+        NodeValue v1 = NodeValue.makeNodeFloat(5.7f);
+        NodeValue v2 = NodeValue.makeFloat(5.7f);
+        assertTrue("Not same float: " + v1 + " & " + v2, v1.getFloat() == v2.getFloat());
+        assertTrue("Not same float as double: " + v1 + " & " + v2, v1.getDouble() == v2.getDouble());
+    }
+
+    @Test
+    public void testDouble1() {
+        NodeValue v = NodeValue.makeDouble(5);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDouble());
+        assertFalse("No node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testDouble2() {
+        NodeValue v = NodeValue.makeNodeDouble(5);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDouble());
+        assertTrue("Not a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testDouble3() {
+        NodeValue v1 = NodeValue.makeNodeDouble(5.7);
+        NodeValue v2 = NodeValue.makeDouble(5.7);
+        assertTrue("Not same double: " + v1 + " & " + v2, v1.getDouble() == v2.getDouble());
+    }
+
+    @Test
+    public void testDecimal1() {
+        NodeValue v = NodeValue.makeDecimal(new BigDecimal("1.3"));
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDecimal());
+        assertFalse("Is a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testDecimal2() {
+        NodeValue v = NodeValue.makeNodeDecimal("1.3");
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDecimal());
+        assertTrue("Not a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testDecimal3() {
+        NodeValue v1 = NodeValue.makeDecimal(new BigDecimal("1.3"));
+        NodeValue v2 = NodeValue.makeNodeDecimal("1.3");
+        assertTrue("Not same decimal: " + v1 + " & " + v2, v1.getDecimal().compareTo(v2.getDecimal()) == 0);
+        assertEquals("Not same decimal by equals: " + v1 + " & " + v2, v1, v2);
+    }
+
+    @Test
+    public void testDateTime1() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTimeZone(TimeZone.getTimeZone("GMT"));
+        // Clear/ set all fields (milliseconds included).
+        cal.setTimeInMillis(0);
+        cal.set(2005, 01, 18, 20, 39, 10); // NB Months from 0, not 1
 
-    @Test public void testDouble2()
-    {
-        NodeValue v = NodeValue.makeNodeDouble(5) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDouble()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
+        NodeValue v = NodeValue.makeDateTime(cal);
+        assertTrue("Not a dateTime: " + v, v.isDateTime());
+        assertFalse("A date: " + v, v.isDate());
+        // DateTimes always have nodes because we used that to parse the thing.
     }
 
-    @Test public void testDouble3()
-    {
-        NodeValue v1 = NodeValue.makeNodeDouble(5.7) ;
-        NodeValue v2 = NodeValue.makeDouble(5.7) ;
-        assertTrue("Not same double: "+v1+" & "+v2, v1.getDouble() == v2.getDouble()) ; 
+    @Test
+    public void testDateTime2() {
+        NodeValue v = NodeValue.makeNodeDateTime("2005-02-18T20:39:10Z");
+        assertTrue("Not a dateTime: " + v, v.isDateTime());
+        assertFalse("A date: " + v, v.isDate());
+        assertTrue("Not a node: " + v, v.hasNode());
     }
     
-    @Test public void testDecimal1()
-    {
-        NodeValue v = NodeValue.makeDecimal(new BigDecimal("1.3"))  ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDecimal()) ;
-        assertFalse("Is a node: "+v, v.hasNode()) ;
+    @Test
+    public void testDateTime3() {
+        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T20:39:10Z");
+        NodeValue v2 = NodeValue.makeNodeDateTime("2005-02-18T20:39:10Z");
+        assertEquals("Not Calendar.equals: ", v1.getDateTime(), v2.getDateTime());
     }
 
-    @Test public void testDecimal2()
-    {
-        NodeValue v = NodeValue.makeNodeDecimal("1.3") ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDecimal()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-    }
-    
-    @Test public void testDecimal3()
-    {
-        NodeValue v1 = NodeValue.makeDecimal(new BigDecimal("1.3")) ;
-        NodeValue v2 = NodeValue.makeNodeDecimal("1.3") ;
-        assertTrue("Not same decimal: "+v1+" & "+v2, v1.getDecimal().compareTo(v2.getDecimal()) == 0 ) ; 
-        assertEquals("Not same decimal by equals: "+v1+" & "+v2, v1, v2) ; 
-    }
-    
-    @Test public void testDateTime1()
-    {
-        Calendar cal = new GregorianCalendar() ;
-        cal.setTimeZone(TimeZone.getTimeZone("GMT")) ;
+    @Test
+    public void testDateTime4() {
+        Calendar cal1 = new GregorianCalendar();
+        cal1.setTimeZone(TimeZone.getTimeZone("GMT"));
         // Clear/ set all fields (milliseconds included).
-        cal.setTimeInMillis(0) ;
-        cal.set(2005,01,18,20,39,10) ;          // NB Months from 0, not 1
-
-        NodeValue v = NodeValue.makeDateTime(cal) ;
-        assertTrue("Not a dateTime: "+v, v.isDateTime()) ;
-        assertFalse("A date: "+v, v.isDate()) ;
-        // DateTimes always have nodes because we used that to parse the thing.
-    }
+        cal1.setTimeInMillis(0);
+        cal1.set(2005, 01, 18, 20, 39, 10); // NB Months from 0, not 1
 
-    @Test public void testDateTime2()
-    {
-        NodeValue v = NodeValue.makeNodeDateTime("2005-02-18T20:39:10Z") ;
-        assertTrue("Not a dateTime: "+v, v.isDateTime()) ;
-        assertFalse("A date: "+v, v.isDate()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
+        NodeValue v = NodeValue.makeNode("2005-02-18T20:39:10Z", XSDDatatype.XSDdateTime);
+        assertTrue("Not a dateTime: " + v, v.isDateTime());
+        assertFalse("A date: " + v, v.isDate());
+        assertTrue("Not a node: " + v, v.hasNode());
+        Calendar cal2 = v.getDateTime().toGregorianCalendar();
+        assertEquals("Not equal: " + v, 0, cal1.compareTo(cal2));
     }
-    
-    
-//    NodeValue v = NodeValue.makeNode("2005-02-18T20:39:10Z", XSDDatatype.XSDdateTime) ;
-//    assertTrue("Not a dateTime: "+v, v.isDate()) ;
-//    assertNotNull("No node: "+v, v.getNode()) ;
 
-    
-    @Test public void testDateTime3()
-    {
-        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T20:39:10Z") ;
-        NodeValue v2 = NodeValue.makeNodeDateTime("2005-02-18T20:39:10Z") ;
-        assertEquals("Not Calendar.equals: ", v1.getDateTime(), v2.getDateTime()) ; 
-    }
-
-    @Test public void testDateTime4()
-    {
-        Calendar cal1 = new GregorianCalendar() ;
-        cal1.setTimeZone(TimeZone.getTimeZone("GMT")) ;
-        // Clear/ set all fields (milliseconds included).
-        cal1.setTimeInMillis(0) ;
-        cal1.set(2005,01,18,20,39,10) ;          // NB Months from 0, not 1
-        
-        NodeValue v = NodeValue.makeNode("2005-02-18T20:39:10Z", XSDDatatype.XSDdateTime) ;
-        assertTrue("Not a dateTime: "+v, v.isDateTime()) ;
-        assertFalse("A date: "+v, v.isDate()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        Calendar cal2 = v.getDateTime().toGregorianCalendar() ;
-        assertEquals("Not equal: "+v, 0, cal1.compareTo(cal2)) ;
-    }
-
-    @Test public void testDateTime5()
-    {
-        boolean b = NodeValue.VerboseWarnings ;
+    @Test
+    public void testDateTime5() {
+        boolean b = NodeValue.VerboseWarnings;
         try {
-            NodeValue.VerboseWarnings = false ;
+            NodeValue.VerboseWarnings = false;
             // Illegal lexical for a dateTime.
-            NodeValue v = NodeValue.makeNode("2005-02-18", XSDDatatype.XSDdateTime) ;
-            assertFalse("Date!: "+v, v.isDate()) ;
-            assertFalse("Datetime!: "+v, v.isDateTime()) ;
-        } finally {
+            NodeValue v = NodeValue.makeNode("2005-02-18", XSDDatatype.XSDdateTime);
+            assertFalse("Date!: " + v, v.isDate());
+            assertFalse("Datetime!: " + v, v.isDateTime());
+        }
+        finally {
             NodeValue.VerboseWarnings = b;
         }
     }
-    
-    @Test public void testDateTime6()
-    {
-        NodeValue v0 = NodeValue.makeDateTime("2005-02-18T20:39:10Z") ;
-        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T20:39:10.0Z") ;
-        NodeValue v2 = NodeValue.makeDateTime("2005-02-18T20:39:10.00Z") ;
-        NodeValue v3 = NodeValue.makeDateTime("2005-02-18T20:39:10.000Z") ;
-        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v1.getDateTime()) ;
-        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v2.getDateTime()) ;
-        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v3.getDateTime()) ;
+
+    @Test
+    public void testDateTime6() {
+        NodeValue v0 = NodeValue.makeDateTime("2005-02-18T20:39:10Z");
+        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T20:39:10.0Z");
+        NodeValue v2 = NodeValue.makeDateTime("2005-02-18T20:39:10.00Z");
+        NodeValue v3 = NodeValue.makeDateTime("2005-02-18T20:39:10.000Z");
+        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v1.getDateTime());
+        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v2.getDateTime());
+        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v3.getDateTime());
     }
-    
-    @Test public void testDateTime7()
-    {
-        NodeValue v0 = NodeValue.makeDateTime("2005-02-18T20:39:10Z") ;
-        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T20:39:10.001Z") ;
-        assertNotSame("Calendar.equals: ", v0.getDateTime(), v1.getDateTime()) ;
+
+    @Test
+    public void testDateTime7() {
+        NodeValue v0 = NodeValue.makeDateTime("2005-02-18T20:39:10Z");
+        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T20:39:10.001Z");
+        assertNotSame("Calendar.equals: ", v0.getDateTime(), v1.getDateTime());
     }
-    
-    @Test public void testDateTime8()
-    {
-        NodeValue v0 = NodeValue.makeDateTime("2005-02-18T20:39:10-05:00") ;
-        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T17:39:10.000-08:00") ;
-        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v1.getDateTime()) ;
+
+    @Test
+    public void testDateTime8() {
+        NodeValue v0 = NodeValue.makeDateTime("2005-02-18T20:39:10-05:00");
+        NodeValue v1 = NodeValue.makeDateTime("2005-02-18T17:39:10.000-08:00");
+        assertEquals("Not Calendar.equals: ", v0.getDateTime(), v1.getDateTime());
     }
-    
-    @Test public void testDate1()
-    {
-        Calendar cal = new GregorianCalendar() ;
-        cal.setTimeZone(TimeZone.getTimeZone("GMT")) ;
+
+    @Test
+    public void testDate1() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTimeZone(TimeZone.getTimeZone("GMT"));
         // Clear/ set all fields (milliseconds included).
-        cal.setTimeInMillis(0) ;
+        cal.setTimeInMillis(0);
         // NB Months from 0, not 1
         // For a date, must be time = 00:00:00
-        cal.set(2005,01,18,0,0,0) ;          
+        cal.set(2005, 01, 18, 0, 0, 0);
 
-        NodeValue v = NodeValue.makeDate(cal) ;
-        assertTrue("Not a date: "+v, v.isDate()) ;
-        assertFalse("A dateTime: "+v, v.isDateTime()) ;
+        NodeValue v = NodeValue.makeDate(cal);
+        assertTrue("Not a date: " + v, v.isDate());
+        assertFalse("A dateTime: " + v, v.isDateTime());
         // DateTimes always have nodes because we used that to parse the thing.
     }
-    
-    @Test public void testDate2()
-    {
-        NodeValue v = NodeValue.makeNodeDate("2005-02-18") ;
-        assertTrue("Not a date: "+v, v.isDate()) ;
-        assertFalse("A dateTime: "+v, v.isDateTime()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
+
+    @Test
+    public void testDate2() {
+        NodeValue v = NodeValue.makeNodeDate("2005-02-18");
+        assertTrue("Not a date: " + v, v.isDate());
+        assertFalse("A dateTime: " + v, v.isDateTime());
+        assertTrue("Not a node: " + v, v.hasNode());
     }
-    
-    @Test public void testDate3()
-    {
-        NodeValue v1 = NodeValue.makeDate("2005-02-18+01:00") ;
-        NodeValue v2 = NodeValue.makeNodeDate("2005-02-18+01:00") ;
-        assertEquals("Not Calendar.equals: ", v1.getDateTime(), v2.getDateTime()) ; 
+
+    @Test
+    public void testDate3() {
+        NodeValue v1 = NodeValue.makeDate("2005-02-18+01:00");
+        NodeValue v2 = NodeValue.makeNodeDate("2005-02-18+01:00");
+        assertEquals("Not Calendar.equals: ", v1.getDateTime(), v2.getDateTime());
     }
 
-    @Test public void testDate4()
-    {
-        Calendar cal1 = new GregorianCalendar() ;
-        cal1.setTimeZone(TimeZone.getTimeZone("GMT")) ;
+    @Test
+    public void testDate4() {
+        Calendar cal1 = new GregorianCalendar();
+        cal1.setTimeZone(TimeZone.getTimeZone("GMT"));
         // Clear/ set all fields (milliseconds included).
-        cal1.setTimeInMillis(0) ;
+        cal1.setTimeInMillis(0);
         // Must be ",0,0,0"
-        cal1.set(2005,01,18,0,0,0) ;          // NB Months from 0, not 1
-        
-        NodeValue v = NodeValue.makeNode("2005-02-18Z", XSDDatatype.XSDdate) ;
-        assertTrue("Not a date: "+v, v.isDate()) ;
-        assertFalse("A dateTime: "+v, v.isDateTime()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        Calendar cal2 = v.getDateTime().toGregorianCalendar() ;
-        assertEquals("Not equal: "+v, 0, cal1.compareTo(cal2)) ; 
-    }
-
-    @Test public void testDate5()
-    {
-        boolean b = NodeValue.VerboseWarnings ;
+        cal1.set(2005, 01, 18, 0, 0, 0); // NB Months from 0, not 1
+
+        NodeValue v = NodeValue.makeNode("2005-02-18Z", XSDDatatype.XSDdate);
+        assertTrue("Not a date: " + v, v.isDate());
+        assertFalse("A dateTime: " + v, v.isDateTime());
+        assertTrue("Not a node: " + v, v.hasNode());
+        Calendar cal2 = v.getDateTime().toGregorianCalendar();
+        assertEquals("Not equal: " + v, 0, cal1.compareTo(cal2));
+    }
+
+    @Test
+    public void testDate5() {
+        boolean b = NodeValue.VerboseWarnings;
         try {
-            NodeValue.VerboseWarnings = false ;
+            NodeValue.VerboseWarnings = false;
             // Illegal lexical for a date.
-            NodeValue v = NodeValue.makeNode("2005-02-18T20:39:10Z", XSDDatatype.XSDdate) ;
-            assertFalse("Datetime!: "+v, v.isDateTime()) ;
-            assertFalse("Date!: "+v, v.isDate()) ;
-        } finally {
+            NodeValue v = NodeValue.makeNode("2005-02-18T20:39:10Z", XSDDatatype.XSDdate);
+            assertFalse("Datetime!: " + v, v.isDateTime());
+            assertFalse("Date!: " + v, v.isDate());
+        }
+        finally {
             NodeValue.VerboseWarnings = b;
         }
     }
-        
-    @Test public void testNodeInt1()
-    {
-        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDinteger) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not an integer: "+v, v.isInteger()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-    }
-
-    @Test public void testNodeInt2()
-    {
-        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDdouble) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDouble()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-    }
-
-    @Test public void testNodeInt3()
-    {
-        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDinteger) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not an integer: "+v, v.isInteger()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        assertEquals("Print form mismatch", "57", actualStr) ;
-    }
-
-    @Test public void testNodeInt4()
-    {
-        NodeValue v = NodeValue.makeNodeInteger(18) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not an integer: "+v, v.isInteger()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        assertEquals("Print form mismatch", "18", actualStr) ;
-    }
-    
-    @Test public void testNodeInt5()
-    {
-        // Legal as a bare integer but not canonical form 
-        NodeValue v = NodeValue.makeNodeInteger("018") ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not an integer: "+v, v.isInteger()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        assertEquals("Print form mismatch", "018", actualStr) ;
-    }
-    
-    @Test public void testNodeFloat1()
-    {
-        // Theer is no SPARQL representation in short form of a float. 
-        NodeValue v = NodeValue.makeNode("57.0", XSDDatatype.XSDfloat) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a float: "+v, v.isFloat()) ;
-        assertTrue("Not a double(float): "+v, v.isDouble()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        
-        assertEquals("Print form mismatch", 
-                     "\"57.0\"^^<"+XSDDatatype.XSDfloat.getURI()+">", 
-                     actualStr);
-    }
-
-    @Test public void testNodeDouble1()
-    {
-        // Note input form is legal and canomical as a lexical form double 
-        NodeValue v = NodeValue.makeNode("57.0e0", XSDDatatype.XSDdouble) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDouble()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        
+
+    @Test
+    public void testNodeInt1() {
+        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDinteger);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not an integer: " + v, v.isInteger());
+        assertTrue("Not a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testNodeInt2() {
+        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDdouble);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDouble());
+        assertTrue("Not a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testNodeInt3() {
+        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDinteger);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not an integer: " + v, v.isInteger());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+        assertEquals("Print form mismatch", "57", actualStr);
+    }
+
+    @Test
+    public void testNodeInt4() {
+        NodeValue v = NodeValue.makeNodeInteger(18);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not an integer: " + v, v.isInteger());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+        assertEquals("Print form mismatch", "18", actualStr);
+    }
+
+    @Test
+    public void testNodeInt5() {
+        // Legal as a bare integer but not canonical form
+        NodeValue v = NodeValue.makeNodeInteger("018");
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not an integer: " + v, v.isInteger());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+        assertEquals("Print form mismatch", "018", actualStr);
+    }
+
+    @Test
+    public void testNodeFloat1() {
+        // Theer is no SPARQL representation in short form of a float.
+        NodeValue v = NodeValue.makeNode("57.0", XSDDatatype.XSDfloat);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a float: " + v, v.isFloat());
+        assertTrue("Not a double(float): " + v, v.isDouble());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+
+        assertEquals("Print form mismatch", "\"57.0\"^^<" + XSDDatatype.XSDfloat.getURI() + ">", actualStr);
+    }
+
+    @Test
+    public void testNodeDouble1() {
+        // Note input form is legal and canomical as a lexical form double
+        NodeValue v = NodeValue.makeNode("57.0e0", XSDDatatype.XSDdouble);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDouble());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+
         assertEquals("Print form mismatch", "57.0e0", actualStr) ;
 //                     "\"57\"^^<"+XSDDatatype.XSDdouble.getURI()+">", 
 //                     actualStr);
     }
 
-    @Test public void testNodeDouble2()
-    {
-        // Note input form is not legal as a lexical form double 
-        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDdouble) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDouble()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        
-        assertEquals("Print form mismatch",
-                     "\"57\"^^<"+XSDDatatype.XSDdouble.getURI()+">", 
-                     actualStr);
-    }
-
-    @Test public void testNodeDouble3()
-    {
-        // Note input form is legal but not canonical as a bare FP 
-        NodeValue v = NodeValue.makeNode("057.0e0", XSDDatatype.XSDdouble) ;
-        assertTrue("Not a number: "+v, v.isNumber()) ;
-        assertTrue("Not a double: "+v, v.isDouble()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        
+    @Test
+    public void testNodeDouble2() {
+        // Note input form is not legal as a lexical form double
+        NodeValue v = NodeValue.makeNode("57", XSDDatatype.XSDdouble);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDouble());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+
+        assertEquals("Print form mismatch", "\"57\"^^<" + XSDDatatype.XSDdouble.getURI() + ">", actualStr);
+    }
+
+    @Test
+    public void testNodeDouble3() {
+        // Note input form is legal but not canonical as a bare FP
+        NodeValue v = NodeValue.makeNode("057.0e0", XSDDatatype.XSDdouble);
+        assertTrue("Not a number: " + v, v.isNumber());
+        assertTrue("Not a double: " + v, v.isDouble());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+
         assertEquals("Print form mismatch", "057.0e0", actualStr);
     }
 
-    @Test public void testNodeBool1()
-    {
-        NodeValue v = NodeValue.makeNode("true", XSDDatatype.XSDboolean) ;
-        assertTrue("Not a boolean: "+v, v.isBoolean()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        assertTrue("Not satisfied: "+v, v.getBoolean());
+    @Test
+    public void testNodeBool1() {
+        NodeValue v = NodeValue.makeNode("true", XSDDatatype.XSDboolean);
+        assertTrue("Not a boolean: " + v, v.isBoolean());
+        assertTrue("Not a node: " + v, v.hasNode());
+        assertTrue("Not satisfied: " + v, v.getBoolean());
     }
 
-    @Test public void testNodeBool2()
-    {
-        NodeValue v = NodeValue.makeNode("false", XSDDatatype.XSDboolean) ;
-        assertTrue("Not a boolean: "+v, v.isBoolean()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        assertFalse("Satisfied: "+v, v.getBoolean()) ;
+    @Test
+    public void testNodeBool2() {
+        NodeValue v = NodeValue.makeNode("false", XSDDatatype.XSDboolean);
+        assertTrue("Not a boolean: " + v, v.isBoolean());
+        assertTrue("Not a node: " + v, v.hasNode());
+        assertFalse("Satisfied: " + v, v.getBoolean());
     }
 
-    @Test public void testNodeBool3()
-    {
-        NodeValue v = NodeValue.makeBoolean(true) ;
-        assertTrue("Not a boolean: "+v, v.isBoolean()) ;
-        //assertTrue("Not a node: "+v, v.hasNode()) ;
-        assertTrue("Not true: "+v, v.getBoolean()) ;
-        assertTrue("Not true: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+    @Test
+    public void testNodeBool3() {
+        NodeValue v = NodeValue.makeBoolean(true);
+        assertTrue("Not a boolean: " + v, v.isBoolean());
+        // assertTrue("Not a node: "+v, v.hasNode()) ;
+        assertTrue("Not true: " + v, v.getBoolean());
+        assertTrue("Not true: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
 
-    @Test public void testNodeBool4()
-    {
-        NodeValue v = NodeValue.makeBoolean(false) ;
-        assertTrue("Not a boolean: "+v, v.isBoolean()) ;
-        //assertTrue("Not a node: "+v, v.hasNode()) ;
-        assertFalse("Not false: "+v, v.getBoolean()) ;
-        assertFalse("Not false: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+    @Test
+    public void testNodeBool4() {
+        NodeValue v = NodeValue.makeBoolean(false);
+        assertTrue("Not a boolean: " + v, v.isBoolean());
+        // assertTrue("Not a node: "+v, v.hasNode()) ;
+        assertFalse("Not false: " + v, v.getBoolean());
+        assertFalse("Not false: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
-    
-    static NodeValue make(String str)
-    {
-        Node n = NodeFactoryExtra.parseNode(str) ;
-        NodeValue nv = NodeValue.makeNode(n) ;
-        return nv ;
+
+    static NodeValue make(String str) {
+        Node n = NodeFactoryExtra.parseNode(str);
+        NodeValue nv = NodeValue.makeNode(n);
+        return nv;
     }
-    
+
     @Test public void gregorian_01() { 
         NodeValue nv = make("'1999'^^xsd:gYear") ;
 
@@ -483,353 +474,402 @@ public class TestNodeValue extends BaseTest
         assertFalse(nv.isGMonthDay()) ; 
         assertTrue(nv.isGDay()) ; 
     }
+    
+    @Test public void langString_01() {
+ 
+        NodeValue nv = make("''@en") ;
+        assertFalse(nv.isString()) ;
+        assertTrue(nv.isLangString()) ;
+        assertEquals("en", nv.getLang()) ;
+        assertEquals("", nv.getString()) ;
+        assertEquals("", nv.asString()) ;
+    }
 
-    @Test public void testBadLexcial1()
-    {
-        boolean b = NodeValue.VerboseWarnings ;
+    @Test public void langString_02() {
+        NodeValue nv = make("'not empty'@cy") ;
+        assertFalse(nv.isString()) ;
+        assertTrue(nv.isLangString()) ;
+        assertEquals("cy", nv.getLang()) ;
+        assertEquals("not empty", nv.getString()) ;
+        assertEquals("not empty", nv.asString()) ;
+    }
+
+    @Test
+    public void testBadLexcial1() {
+        boolean b = NodeValue.VerboseWarnings;
         try {
-            NodeValue.VerboseWarnings = false ;
-            NodeValue v = NodeValue.makeNodeInteger("abc") ;
-            assertFalse("Good integer: "+v, v.isInteger()) ;
-            assertFalse("Good number: "+v, v.isNumber()) ;
-        } finally { NodeValue.VerboseWarnings = b ; }
+            NodeValue.VerboseWarnings = false;
+            NodeValue v = NodeValue.makeNodeInteger("abc");
+            assertFalse("Good integer: " + v, v.isInteger());
+            assertFalse("Good number: " + v, v.isNumber());
+        }
+        finally {
+            NodeValue.VerboseWarnings = b;
+        }
     }
-    
-    @Test public void testBadLexcial2()
-    {
-        boolean b = NodeValue.VerboseWarnings ;
+
+    @Test
+    public void testBadLexcial2() {
+        boolean b = NodeValue.VerboseWarnings;
         try {
-            NodeValue.VerboseWarnings = false ;
-            NodeValue v = NodeValue.makeNodeInteger("1.8") ;
-            assertFalse("Good integer: "+v, v.isInteger()) ;
-            assertFalse("Good number: "+v, v.isNumber()) ;
-        } finally { NodeValue.VerboseWarnings = b ; }
+            NodeValue.VerboseWarnings = false;
+            NodeValue v = NodeValue.makeNodeInteger("1.8");
+            assertFalse("Good integer: " + v, v.isInteger());
+            assertFalse("Good number: " + v, v.isNumber());
+        }
+        finally {
+            NodeValue.VerboseWarnings = b;
+        }
     }
-    
-    @Test public void testBadLexcial3()
-    {
-        boolean b = NodeValue.VerboseWarnings ;
+
+    @Test
+    public void testBadLexcial3() {
+        boolean b = NodeValue.VerboseWarnings;
         try {
-            NodeValue.VerboseWarnings = false ;
-            NodeValue v = NodeValue.makeDateTime("2005-10-34T00:00:01Z") ;
-            assertFalse("Good date: "+v, v.isDateTime()) ;
-        } finally { NodeValue.VerboseWarnings = b ; }
+            NodeValue.VerboseWarnings = false;
+            NodeValue v = NodeValue.makeDateTime("2005-10-34T00:00:01Z");
+            assertFalse("Good date: " + v, v.isDateTime());
+        }
+        finally {
+            NodeValue.VerboseWarnings = b;
+        }
     }
 
-    @Test public void testBadLexcial4()
-    {
-        boolean b = NodeValue.VerboseWarnings ;
+    @Test
+    public void testBadLexcial4() {
+        boolean b = NodeValue.VerboseWarnings;
         try {
             // Has a space
-            String s = "2005-10-14T 09:30:23+01:00" ;
-            NodeValue.VerboseWarnings = false ;
-            NodeValue v1 = NodeValue.makeDateTime(s) ;
-            assertFalse("Good date: "+v1, v1.isDateTime()) ;
-            s = s.replaceAll(" ", "") ;
-            NodeValue v2 = NodeValue.makeDateTime(s) ;
-            assertTrue("Bad date: "+v2, v2.isDateTime()) ;
-        } finally { NodeValue.VerboseWarnings = b ; }
+            String s = "2005-10-14T 09:30:23+01:00";
+            NodeValue.VerboseWarnings = false;
+            NodeValue v1 = NodeValue.makeDateTime(s);
+            assertFalse("Good date: " + v1, v1.isDateTime());
+            s = s.replaceAll(" ", "");
+            NodeValue v2 = NodeValue.makeDateTime(s);
+            assertTrue("Bad date: " + v2, v2.isDateTime());
+        }
+        finally {
+            NodeValue.VerboseWarnings = b;
+        }
     }
-    
+
     // Effective boolean value rules.
-    //   boolean: value of the boolean 
-    //   string: length(string) > 0 is true
-    //   numeric: number != Nan && number != 0 is true
+    // boolean: value of the boolean
+    // string: length(string) > 0 is true
+    // numeric: number != Nan && number != 0 is true
     // http://www.w3.org/TR/xquery/#dt-ebv
 
-    @Test public void testEBV1()
-    {
-        assertTrue("Not a boolean", NodeValue.TRUE.isBoolean()) ;
-        assertTrue("Not true", NodeValue.TRUE.getBoolean()) ;
-        assertTrue("Not true", XSDFuncOp.booleanEffectiveValue(NodeValue.TRUE)) ;
+    @Test
+    public void testEBV1() {
+        assertTrue("Not a boolean", NodeValue.TRUE.isBoolean());
+        assertTrue("Not true", NodeValue.TRUE.getBoolean());
+        assertTrue("Not true", XSDFuncOp.booleanEffectiveValue(NodeValue.TRUE));
     }
 
-    @Test public void testEBV2()
-    {
-        assertTrue("Not a boolean", NodeValue.FALSE.isBoolean()) ;
-        assertFalse("Not false", NodeValue.FALSE.getBoolean()) ;
-        assertFalse("Not false", XSDFuncOp.booleanEffectiveValue(NodeValue.FALSE)) ;
+    @Test
+    public void testEBV2() {
+        assertTrue("Not a boolean", NodeValue.FALSE.isBoolean());
+        assertFalse("Not false", NodeValue.FALSE.getBoolean());
+        assertFalse("Not false", XSDFuncOp.booleanEffectiveValue(NodeValue.FALSE));
     }
-    
-    @Test public void testEBV3()
-    {
-        NodeValue v = NodeValue.makeInteger(1) ;
-        assertFalse("It's a boolean: "+v, v.isBoolean()) ;
-        assertTrue("Not EBV true: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+
+    @Test
+    public void testEBV3() {
+        NodeValue v = NodeValue.makeInteger(1);
+        assertFalse("It's a boolean: " + v, v.isBoolean());
+        assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
-    
-    @Test public void testEBV4()
-    {
-        NodeValue v = NodeValue.makeInteger(0) ;
-        assertFalse("It's a boolean: "+v, v.isBoolean()) ;
-        try { v.getBoolean() ; fail("getBoolean should fail") ; } catch (ExprEvalException e) {}
-        assertFalse("Not EBV false: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+
+    @Test
+    public void testEBV4() {
+        NodeValue v = NodeValue.makeInteger(0);
+        assertFalse("It's a boolean: " + v, v.isBoolean());
+        try {
+            v.getBoolean();
+            fail("getBoolean should fail");
+        }
+        catch (ExprEvalException e) {}
+        assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
-    
-    @Test public void testEBV5()
-    {
-        NodeValue v = NodeValue.makeString("xyz") ;
-        assertFalse("It's a boolean: "+v, v.isBoolean()) ;
-        //assertTrue("Not a node: "+v, v.hasNode()) ;
-        try { v.getBoolean() ; fail("getBoolean should fail") ; } catch (ExprEvalException e) {}
-        assertTrue("Not EBV true: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+
+    @Test
+    public void testEBV5() {
+        NodeValue v = NodeValue.makeString("xyz");
+        assertFalse("It's a boolean: " + v, v.isBoolean());
+        // assertTrue("Not a node: "+v, v.hasNode()) ;
+        try {
+            v.getBoolean();
+            fail("getBoolean should fail");
+        }
+        catch (ExprEvalException e) {}
+        assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
-    
-    @Test public void testEBV6()
-    {
-        NodeValue v = NodeValue.makeString("") ;
-        assertFalse("It's a boolean: "+v, v.isBoolean()) ;
-        try { v.getBoolean() ; fail("getBoolean should fail") ; } catch (ExprEvalException e) {}
-        assertFalse("Not EBV false: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+
+    @Test
+    public void testEBV6() {
+        NodeValue v = NodeValue.makeString("");
+        assertFalse("It's a boolean: " + v, v.isBoolean());
+        try {
+            v.getBoolean();
+            fail("getBoolean should fail");
+        }
+        catch (ExprEvalException e) {}
+        assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
-    
+
     // EBV includes plain literals which includes language tagged literals.
-    @Test public void testEBV7()
-    {
-        Node x = NodeFactory.createLiteral("", "en") ;
-        NodeValue v = NodeValue.makeNode(x) ;
-        assertFalse("Not EBV false: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+    @Test
+    public void testEBV7() {
+        Node x = NodeFactory.createLiteral("", "en");
+        NodeValue v = NodeValue.makeNode(x);
+        assertFalse("Not EBV false: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
 
-    @Test public void testEBV8()
-    {
-        Node x = NodeFactory.createLiteral("not empty", "en") ;
-        NodeValue v = NodeValue.makeNode(x) ;
-        assertTrue("Not EBV true: "+v, XSDFuncOp.booleanEffectiveValue(v)) ;
+    @Test
+    public void testEBV8() {
+        Node x = NodeFactory.createLiteral("not empty", "en");
+        NodeValue v = NodeValue.makeNode(x);
+        assertTrue("Not EBV true: " + v, XSDFuncOp.booleanEffectiveValue(v));
     }
 
     private static boolean filterEBV(NodeValue nv) {
-        try { return XSDFuncOp.booleanEffectiveValue(nv) ; }
-        catch (ExprEvalException ex) { return false ; }
+        try {
+            return XSDFuncOp.booleanEffectiveValue(nv);
+        }
+        catch (ExprEvalException ex) {
+            return false;
+        }
     }
-    
-    
-    @Test public void testFloatDouble1()
-    {
-        NodeValue v1 = NodeValue.makeNodeDouble("1.5") ;
-        NodeValue v2 = NodeValue.makeNode("1.5", XSDDatatype.XSDfloat) ;
-        assertTrue("Should be equal: 1.5 float and 1.5 double", NodeValue.sameAs(v1, v2)) ;
+
+    @Test
+    public void testFloatDouble1() {
+        NodeValue v1 = NodeValue.makeNodeDouble("1.5");
+        NodeValue v2 = NodeValue.makeNode("1.5", XSDDatatype.XSDfloat);
+        assertTrue("Should be equal: 1.5 float and 1.5 double", NodeValue.sameAs(v1, v2));
     }
-    
-    @Test public void testFloatDouble5()
-    {
-        NodeValue v1 = NodeValue.makeNodeDouble("1.3") ;
-        NodeValue v2 = NodeValue.makeNode("1.3", XSDDatatype.XSDfloat) ;
-        assertFalse("Should not be equal: 1.3 float and 1.3 double", NodeValue.sameAs(v1, v2)) ;
+
+    @Test
+    public void testFloatDouble5() {
+        NodeValue v1 = NodeValue.makeNodeDouble("1.3");
+        NodeValue v2 = NodeValue.makeNode("1.3", XSDDatatype.XSDfloat);
+        assertFalse("Should not be equal: 1.3 float and 1.3 double", NodeValue.sameAs(v1, v2));
     }
-    
+
     // More effective boolean values - see TestExpressionARQ
-    
-    @Test public void testString1()
-    {
-        NodeValue v = NodeValue.makeString("string") ;
-        assertTrue("Not a string: "+v, v.isString()) ;
-        assertFalse("Is a node: "+v, v.hasNode()) ;
-        
-    }
-
-    @Test public void testNodeString1()
-    {
-        NodeValue v = NodeValue.makeNode("string", null, (String)null) ; // Plain literal
-        assertTrue("Not a string: "+v, v.isString()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-    }
-
-    @Test public void testNodeString2()
-    {
-        NodeValue v = NodeValue.makeNode("string", null, (String)null) ; // Plain literal
-        assertTrue("Not a string: "+v, v.isString()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
-        assertEquals("Print form mismatch", "\"string\"", actualStr) ;
-    }
-
-    @Test public void testNodeString3()
-    {
-        NodeValue v = NodeValue.makeNode("string", XSDDatatype.XSDstring) ; // XSD String literal
-        assertTrue("Not a string: "+v, v.isString()) ;
-        assertTrue("Not a node: "+v, v.hasNode()) ;
-        String actualStr = v.asQuotedString() ;
+
+    @Test
+    public void testString1() {
+        NodeValue v = NodeValue.makeString("string");
+        assertTrue("Not a string: " + v, v.isString());
+        assertFalse("Is a node: " + v, v.hasNode());
+
+    }
+
+    @Test
+    public void testNodeString1() {
+        NodeValue v = NodeValue.makeNode("string", null, (String)null); // Plain
+                                                                        // literal
+        assertTrue("Not a string: " + v, v.isString());
+        assertTrue("Not a node: " + v, v.hasNode());
+    }
+
+    @Test
+    public void testNodeString2() {
+        NodeValue v = NodeValue.makeNode("string", null, (String)null); // Plain
+                                                                        // literal
+        assertTrue("Not a string: " + v, v.isString());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
+        assertEquals("Print form mismatch", "\"string\"", actualStr);
+    }
+
+    @Test
+    public void testNodeString3() {
+        NodeValue v = NodeValue.makeNode("string", XSDDatatype.XSDstring); // XSD
+                                                                           // String
+                                                                           // literal
+        assertTrue("Not a string: " + v, v.isString());
+        assertTrue("Not a node: " + v, v.hasNode());
+        String actualStr = v.asQuotedString();
         String rightAnswer = JenaRuntime.isRDF11
             // RDF 1.1 -- appearance is a without ^^
-            ? "\"string\""
-            : "\"string\"^^<"+XSDDatatype.XSDstring.getURI()+">" ;
-        
-        assertEquals("Print form mismatch", rightAnswer, actualStr) ;
+            ? "\"string\"" : "\"string\"^^<" + XSDDatatype.XSDstring.getURI() + ">";
+
+        assertEquals("Print form mismatch", rightAnswer, actualStr);
     }
 
     // TODO testSameValueDecimal tests
     // TODO sameValueAs mixed tests
-    
-    @Test public void testSameValue1()
-    {
-        NodeValue nv1 = NodeValue.makeInteger(5) ;
-        NodeValue nv2 = NodeValue.makeInteger(7) ;
-        assertTrue("Same values ("+nv1+","+nv2+")", NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse("Same values ("+nv1+","+nv2+")", NodeValue.sameAs(nv1, nv2)) ;
 
-        NodeValue nv3 = NodeValue.makeInteger(5) ;
-        assertTrue("Different values ("+nv1+","+nv3+")", NodeValue.sameAs(nv1, nv3)) ;
-        assertFalse("Different values - notNotSame ("+nv1+","+nv3+")", NodeValue.notSameAs(nv1, nv3)) ;
+    @Test
+    public void testSameValue1() {
+        NodeValue nv1 = NodeValue.makeInteger(5);
+        NodeValue nv2 = NodeValue.makeInteger(7);
+        assertTrue("Same values (" + nv1 + "," + nv2 + ")", NodeValue.notSameAs(nv1, nv2));
+        assertFalse("Same values (" + nv1 + "," + nv2 + ")", NodeValue.sameAs(nv1, nv2));
+
+        NodeValue nv3 = NodeValue.makeInteger(5);
+        assertTrue("Different values (" + nv1 + "," + nv3 + ")", NodeValue.sameAs(nv1, nv3));
+        assertFalse("Different values - notNotSame (" + nv1 + "," + nv3 + ")", NodeValue.notSameAs(nv1, nv3));
+    }
+
+    @Test
+    public void testSameValue2() {
+        NodeValue nv1 = NodeValue.makeInteger(5);
+        NodeValue nv2 = NodeValue.makeNodeInteger(7);
+        assertTrue("Same values (" + nv1 + "," + nv2 + ")", NodeValue.notSameAs(nv1, nv2));
+        assertFalse("Same values (" + nv1 + "," + nv2 + ")", NodeValue.sameAs(nv1, nv2));
+
+        NodeValue nv3 = NodeValue.makeNodeInteger(5);
+        assertTrue("Different values (" + nv1 + "," + nv3 + ")", NodeValue.sameAs(nv1, nv3));
+        assertFalse("Different values - notNotSame (" + nv1 + "," + nv3 + ")", NodeValue.notSameAs(nv1, nv3));
+    }
+
+    @Test
+    public void testSameValue3() {
+        NodeValue nv1 = NodeValue.makeDecimal("1.5");
+        NodeValue nv2 = NodeValue.makeDecimal("1.6");
+        assertTrue("Same values (" + nv1 + "," + nv2 + ")", NodeValue.notSameAs(nv1, nv2));
+        assertFalse("Same values (" + nv1 + "," + nv2 + ")", NodeValue.sameAs(nv1, nv2));
+
+        NodeValue nv3 = NodeValue.makeDecimal("1.50");
+        assertTrue("Different values (" + nv1 + "," + nv3 + ")", NodeValue.sameAs(nv1, nv3));
+        assertFalse("Different values - notNotSame (" + nv1 + "," + nv3 + ")", NodeValue.notSameAs(nv1, nv3));
+    }
+
+    @Test
+    public void testSameValue4() {
+        NodeValue nv1 = NodeValue.makeDecimal("3");
+        NodeValue nv2 = NodeValue.makeInteger(4);
+        assertTrue("Same values (" + nv1 + "," + nv2 + ")", NodeValue.notSameAs(nv1, nv2));
+        assertFalse("Same values (" + nv1 + "," + nv2 + ")", NodeValue.sameAs(nv1, nv2));
+
+        NodeValue nv3 = NodeValue.makeInteger(3);
+        assertTrue("Different values (" + nv1 + "," + nv3 + ")", NodeValue.sameAs(nv1, nv3));
+        assertFalse("Different values - notNotSame (" + nv1 + "," + nv3 + ")", NodeValue.notSameAs(nv1, nv3));
+    }
+
+    @Test
+    public void testSameValue5() {
+        NodeValue nv1 = NodeValue.makeDecimal("-1.5"); // Must be exact for
+                                                       // double and decimal
+        NodeValue nv2 = NodeValue.makeDouble(1.5);
+        assertTrue("Same values (" + nv1 + "," + nv2 + ")", NodeValue.notSameAs(nv1, nv2));
+        assertFalse("Same values (" + nv1 + "," + nv2 + ")", NodeValue.sameAs(nv1, nv2));
+
+        NodeValue nv3 = NodeValue.makeDouble(-1.5);
+        assertTrue("Different values (" + nv1 + "," + nv3 + ")", NodeValue.sameAs(nv1, nv3));
+        assertFalse("Different values - notNotSame (" + nv1 + "," + nv3 + ")", NodeValue.notSameAs(nv1, nv3));
     }
-    
-    @Test public void testSameValue2()
-    {
-        NodeValue nv1 = NodeValue.makeInteger(5) ;
-        NodeValue nv2 = NodeValue.makeNodeInteger(7) ; 
-        assertTrue("Same values ("+nv1+","+nv2+")", NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse("Same values ("+nv1+","+nv2+")", NodeValue.sameAs(nv1, nv2)) ;
 
-        NodeValue nv3 = NodeValue.makeNodeInteger(5) ;
-        assertTrue("Different values ("+nv1+","+nv3+")", NodeValue.sameAs(nv1, nv3)) ;
-        assertFalse("Different values - notNotSame ("+nv1+","+nv3+")", NodeValue.notSameAs(nv1, nv3)) ;
-    }
-    
-    @Test public void testSameValue3()
-    {
-        NodeValue nv1 = NodeValue.makeDecimal("1.5") ;
-        NodeValue nv2 = NodeValue.makeDecimal("1.6") ;
-        assertTrue("Same values ("+nv1+","+nv2+")", NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse("Same values ("+nv1+","+nv2+")", NodeValue.sameAs(nv1, nv2)) ;
+    @Test
+    public void testSameValue6() {
+        NodeValue nv1 = NodeValue.makeNodeInteger(17);
+        NodeValue nv2 = NodeValue.makeDouble(34);
+        assertTrue("Same values (" + nv1 + "," + nv2 + ")", NodeValue.notSameAs(nv1, nv2));
+        assertFalse("Same values (" + nv1 + "," + nv2 + ")", NodeValue.sameAs(nv1, nv2));
 
-        NodeValue nv3 = NodeValue.makeDecimal("1.50") ;
-        assertTrue("Different values ("+nv1+","+nv3+")", NodeValue.sameAs(nv1, nv3)) ;
-        assertFalse("Different values - notNotSame ("+nv1+","+nv3+")", NodeValue.notSameAs(nv1, nv3)) ;
+        NodeValue nv3 = NodeValue.makeDouble(17);
+        assertTrue("Different values (" + nv1 + "," + nv3 + ")", NodeValue.sameAs(nv1, nv3));
+        assertFalse("Different values - notNotSame (" + nv1 + "," + nv3 + ")", NodeValue.notSameAs(nv1, nv3));
     }
-    
-    @Test public void testSameValue4()
-    {
-        NodeValue nv1 = NodeValue.makeDecimal("3") ;
-        NodeValue nv2 = NodeValue.makeInteger(4) ;
-        assertTrue("Same values ("+nv1+","+nv2+")", NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse("Same values ("+nv1+","+nv2+")", NodeValue.sameAs(nv1, nv2)) ;
 
-        NodeValue nv3 = NodeValue.makeInteger(3) ;
-        assertTrue("Different values ("+nv1+","+nv3+")", NodeValue.sameAs(nv1, nv3)) ;
-        assertFalse("Different values - notNotSame ("+nv1+","+nv3+")", NodeValue.notSameAs(nv1, nv3)) ;
-    }
-    
-    @Test public void testSameValue5()
-    {
-        NodeValue nv1 = NodeValue.makeDecimal("-1.5") ;   // Must be exact for double and decimal
-        NodeValue nv2 = NodeValue.makeDouble(1.5) ;
-        assertTrue("Same values ("+nv1+","+nv2+")", NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse("Same values ("+nv1+","+nv2+")", NodeValue.sameAs(nv1, nv2)) ;
+    @Test
+    public void testSameValue7() {
+        NodeValue nv1 = NodeValue.makeBoolean(true);
+        NodeValue nv2 = NodeValue.makeString("a");
+        assertTrue("Same values (" + nv1 + "," + nv2 + ")", NodeValue.notSameAs(nv1, nv2));
+        assertFalse("Same values (" + nv1 + "," + nv2 + ")", NodeValue.sameAs(nv1, nv2));
 
-        NodeValue nv3 = NodeValue.makeDouble(-1.5) ;
-        assertTrue("Different values ("+nv1+","+nv3+")", NodeValue.sameAs(nv1, nv3)) ;
-        assertFalse("Different values - notNotSame ("+nv1+","+nv3+")", NodeValue.notSameAs(nv1, nv3)) ;
+        NodeValue nv3 = NodeValue.makeNodeBoolean(true);
+        assertTrue("Different values (" + nv1 + "," + nv3 + ")", NodeValue.sameAs(nv1, nv3));
+        assertFalse("Different values - notNotSame (" + nv1 + "," + nv3 + ")", NodeValue.notSameAs(nv1, nv3));
     }
-    
-    @Test public void testSameValue6()
-    {
-        NodeValue nv1 = NodeValue.makeNodeInteger(17) ;
-        NodeValue nv2 = NodeValue.makeDouble(34) ;
-        assertTrue("Same values ("+nv1+","+nv2+")", NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse("Same values ("+nv1+","+nv2+")", NodeValue.sameAs(nv1, nv2)) ;
 
-        NodeValue nv3 = NodeValue.makeDouble(17) ;
-        assertTrue("Different values ("+nv1+","+nv3+")", NodeValue.sameAs(nv1, nv3)) ;
-        assertFalse("Different values - notNotSame ("+nv1+","+nv3+")", NodeValue.notSameAs(nv1, nv3)) ;
+    @Test
+    public void testLang1() {
+        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en");
+        NodeValue nv1 = NodeValue.makeNode(n1);
+        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en");
+        NodeValue nv2 = NodeValue.makeNode(n2);
+        assertTrue(NodeValue.sameAs(nv1, nv2));
     }
-    
-    @Test public void testSameValue7()
-    {
-        NodeValue nv1 = NodeValue.makeBoolean(true) ;
-        NodeValue nv2 = NodeValue.makeString("a") ;
-        assertTrue("Same values ("+nv1+","+nv2+")", NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse("Same values ("+nv1+","+nv2+")", NodeValue.sameAs(nv1, nv2)) ;
-        
-        NodeValue nv3 = NodeValue.makeNodeBoolean(true) ;
-        assertTrue("Different values ("+nv1+","+nv3+")", NodeValue.sameAs(nv1, nv3)) ;
-        assertFalse("Different values - notNotSame ("+nv1+","+nv3+")", NodeValue.notSameAs(nv1, nv3)) ;
+
+    @Test
+    public void testLang2() {
+        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en");
+        NodeValue nv1 = NodeValue.makeNode(n1);
+        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "EN");
+        NodeValue nv2 = NodeValue.makeNode(n2);
+        assertTrue(NodeValue.sameAs(nv1, nv2));
+        assertFalse(nv1.equals(nv2));
     }
-    
-    @Test public void testLang1()
-    {
-        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en") ;
-        NodeValue nv1 = NodeValue.makeNode(n1) ;
-        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en") ;
-        NodeValue nv2 = NodeValue.makeNode(n2) ;
-        assertTrue(NodeValue.sameAs(nv1, nv2)) ;
+
+    @Test
+    public void testLang3() {
+        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en");
+        NodeValue nv1 = NodeValue.makeNode(n1);
+        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en");
+        NodeValue nv2 = NodeValue.makeNode(n2);
+        assertFalse(NodeValue.notSameAs(nv1, nv2));
     }
-    
-    @Test public void testLang2()
-    {
-        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en") ;
-        NodeValue nv1 = NodeValue.makeNode(n1) ;
-        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "EN") ;
-        NodeValue nv2 = NodeValue.makeNode(n2) ;
-        assertTrue(NodeValue.sameAs(nv1, nv2)) ;
-        assertFalse(nv1.equals(nv2)) ;
-    }
-
-    @Test public void testLang3()
-    {
-        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en") ;
-        NodeValue nv1 = NodeValue.makeNode(n1) ;
-        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en") ;
-        NodeValue nv2 = NodeValue.makeNode(n2) ;
-        assertFalse(NodeValue.notSameAs(nv1, nv2)) ;
+
+    @Test
+    public void testLang4() {
+        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en");
+        NodeValue nv1 = NodeValue.makeNode(n1);
+        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "EN");
+        NodeValue nv2 = NodeValue.makeNode(n2);
+        assertFalse(NodeValue.notSameAs(nv1, nv2));
+        assertFalse(nv1.equals(nv2));
     }
-    
-    @Test public void testLang4()
-    {
-        Node n1 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "en") ;
-        NodeValue nv1 = NodeValue.makeNode(n1) ;
-        Node n2 = org.apache.jena.graph.NodeFactory.createLiteral("xyz", "EN") ;
-        NodeValue nv2 = NodeValue.makeNode(n2) ;
-        assertFalse(NodeValue.notSameAs(nv1, nv2)) ;
-        assertFalse(nv1.equals(nv2)) ;
-    }
-
-    @Test public void testEquals1()
-    {
-        NodeValue nv1 = NodeValue.makeInteger(1) ;
-        NodeValue nv2 = NodeValue.makeInteger(1) ;
-        assertEquals("Not NodeValue.equals()", nv1, nv2) ;
+
+    @Test
+    public void testEquals1() {
+        NodeValue nv1 = NodeValue.makeInteger(1);
+        NodeValue nv2 = NodeValue.makeInteger(1);
+        assertEquals("Not NodeValue.equals()", nv1, nv2);
     }
-    
-    @Test public void testEquals2()
-    {
-        NodeValue nv1 = NodeValue.makeNodeInteger(1) ;
-        NodeValue nv2 = NodeValue.makeInteger(1) ;
-        assertEquals("Not NodeValue.equals()", nv1, nv2) ;
+
+    @Test
+    public void testEquals2() {
+        NodeValue nv1 = NodeValue.makeNodeInteger(1);
+        NodeValue nv2 = NodeValue.makeInteger(1);
+        assertEquals("Not NodeValue.equals()", nv1, nv2);
     }
-    
-    @Test public void testEquals3()
-    {   // Make different ways but equals 
-        NodeValue nv1 = NodeValue.makeInteger(1) ;
-        NodeValue nv2 = NodeValue.makeNodeInteger(1) ;
-        assertEquals("Not NodeValue.equals()", nv1, nv2) ;
+
+    @Test
+    public void testEquals3() { // Make different ways but equals
+        NodeValue nv1 = NodeValue.makeInteger(1);
+        NodeValue nv2 = NodeValue.makeNodeInteger(1);
+        assertEquals("Not NodeValue.equals()", nv1, nv2);
     }
-    
-    @Test public void testEquals4()
-    {
-        NodeValue nv1 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createURI("http://example")) ;
-        NodeValue nv2 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createURI("http://example")) ;
-        assertEquals("Not NodeValue.equals()", nv1 , nv2) ;
+
+    @Test
+    public void testEquals4() {
+        NodeValue nv1 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createURI("http://example"));
+        NodeValue nv2 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createURI("http://example"));
+        assertEquals("Not NodeValue.equals()", nv1, nv2);
     }
-    
-    @Test public void testNotEquals1()
-    {
-        NodeValue nv1 = NodeValue.makeInteger(1) ;
-        NodeValue nv2 = NodeValue.makeInteger(2) ;
-        assertFalse("NodeValue.equals()", nv1.equals(nv2)) ;
+
+    @Test
+    public void testNotEquals1() {
+        NodeValue nv1 = NodeValue.makeInteger(1);
+        NodeValue nv2 = NodeValue.makeInteger(2);
+        assertFalse("NodeValue.equals()", nv1.equals(nv2));
     }
-    
-    @Test public void testNotEquals2()
-    {
-        NodeValue nv1 = NodeValue.makeNodeInteger(1) ;
-        NodeValue nv2 = NodeValue.makeNodeString("1") ;
-        assertFalse("NodeValue.equals()", nv1.equals(nv2)) ;
+
+    @Test
+    public void testNotEquals2() {
+        NodeValue nv1 = NodeValue.makeNodeInteger(1);
+        NodeValue nv2 = NodeValue.makeNodeString("1");
+        assertFalse("NodeValue.equals()", nv1.equals(nv2));
     }
-    
-    @Test public void testNotEquals3()
-    {   //Literals and URIs are different.
-        NodeValue nv1 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createURI("http://example")) ;
-        NodeValue nv2 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createLiteral("http://example")) ;
-        assertFalse("NodeValue.equals()", nv1.equals(nv2)) ;
-    } 
 
+    @Test
+    public void testNotEquals3() { // Literals and URIs are different.
+        NodeValue nv1 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createURI("http://example"));
+        NodeValue nv2 = NodeValue.makeNode(org.apache.jena.graph.NodeFactory.createLiteral("http://example"));
+        assertFalse("NodeValue.equals()", nv1.equals(nv2));
+    }
 }