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/08/28 17:45:32 UTC

svn commit: r1378184 - in /jena/trunk/jena-tdb/src: main/java/com/hp/hpl/jena/tdb/store/NodeId.java test/java/com/hp/hpl/jena/tdb/store/TestNodeId.java

Author: andy
Date: Tue Aug 28 15:45:31 2012
New Revision: 1378184

URL: http://svn.apache.org/viewvc?rev=1378184&view=rev
Log:
Hanlde out-of-range derived integers and very, very large integers (>63 bits).

Modified:
    jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/store/NodeId.java
    jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/TestNodeId.java

Modified: jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/store/NodeId.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/store/NodeId.java?rev=1378184&r1=1378183&r2=1378184&view=diff
==============================================================================
--- jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/store/NodeId.java (original)
+++ jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/store/NodeId.java Tue Aug 28 15:45:31 2012
@@ -207,13 +207,25 @@ public class NodeId
         {
             if ( XSDDatatype.XSDinteger.isValidLiteral(lit) )
             {
-                long v = ((Number)lit.getValue()).longValue() ;
-                v = IntegerNode.pack(v) ;
-                // Value -1 is "does not fit"
-                if ( v != -1 )
-                    return new NodeId(v) ;
-                else
+                // Check length of lexical form to see if it's in range of a long.
+                // Long.MAX_VALUE =  9223372036854775807
+                // Long.MIN_VALUE = -9223372036854775808
+                // 9,223,372,036,854,775,807 is 19 digits.
+                
+                if ( lit.getLexicalForm().length() > 19 )
                     return null ;
+
+                try {
+                    long v = ((Number)lit.getValue()).longValue() ;
+                    v = IntegerNode.pack(v) ;
+                    // Value -1 is "does not fit"
+                    if ( v != -1 )
+                        return new NodeId(v) ;
+                    else
+                        return null ;
+                }
+                // Out of range for the type, not a long etc etc.
+                catch (Throwable ex) { return null ; }
             }
         }
         
@@ -292,11 +304,6 @@ public class NodeId
             case INTEGER:
             {
                 long val = IntegerNode.unpack(v) ;
-//                
-//                long val = BitsLong.clear(v, 56, 64) ;
-//                // Sign extends to 64 bits.
-//                if ( BitsLong.isSet(val, 55) )
-//                    val = BitsLong.set(v, 56, 64) ;
                 Node n = Node.createLiteral(Long.toString(val), null, XSDDatatype.XSDinteger) ;
                 return n ;
             }

Modified: jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/TestNodeId.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/TestNodeId.java?rev=1378184&r1=1378183&r2=1378184&view=diff
==============================================================================
--- jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/TestNodeId.java (original)
+++ jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/TestNodeId.java Tue Aug 28 15:45:31 2012
@@ -41,30 +41,37 @@ public class TestNodeId extends BaseTest
     
     // Inlines
     
-    @Test public void nodeId_int_1()
+    @Test public void nodeId_int_01()
     { test("1", NodeFactory.parseNode("1")) ; }
 
-    @Test public void nodeId_int_2()
+    @Test public void nodeId_int_02()
     { test("2", NodeFactory.parseNode("2")) ; }
 
-    @Test public void nodeId_int_3()
+    @Test public void nodeId_int_03()
     { test("'3'^^xsd:int", NodeFactory.parseNode("3")) ; }
 
-    @Test public void nodeId_int_4()
+    @Test public void nodeId_int_04()
     { test("'3'", (Node)null) ; }
 
-    @Test public void nodeId_int_5()
+    @Test public void nodeId_int_05()
     { test("-1",  NodeFactory.parseNode("-1")) ; }
     
-    @Test public void nodeId_int_6()
+    @Test public void nodeId_int_06()
     { test("-180",  NodeFactory.parseNode("-180")) ; }
 
-    @Test public void nodeId_int_7()
+    @Test public void nodeId_int_07()
     { test("01",  NodeFactory.parseNode("1")) ; }
     
-    @Test public void nodeId_int_8()
+    @Test public void nodeId_int_08()
     { test("+01",  NodeFactory.parseNode("1")) ; }
     
+    @Test public void nodeId_int_09()
+    // More than Long.MAX_VALUE
+    { test("92233720368547758070",  (Node)null) ; }
+
+    @Test public void nodeId_int_10()
+    { test("'300'^^xsd:byte",  (Node)null) ; }
+    
     @Test public void nodeId_decimal_1()
     { test("3.14", NodeFactory.parseNode("3.14")) ; }