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/07/04 15:25:36 UTC

svn commit: r1357247 - in /jena/trunk/jena-arq/src: main/java/com/hp/hpl/jena/sparql/graph/ main/java/com/hp/hpl/jena/sparql/resultset/ main/java/com/hp/hpl/jena/sparql/util/ main/java/org/openjena/riot/system/ main/java/org/openjena/riot/tokens/ test/...

Author: andy
Date: Wed Jul  4 13:25:35 2012
New Revision: 1357247

URL: http://svn.apache.org/viewvc?rev=1357247&view=rev
Log:
Consolidate creating nodes from strings using RIOT/TokenizerText into NodeFactory.
Add prefix map handlign to Token.asNode.
Separate SSE tests from NodeFactory (SSE has more features)
Use NodeFactory on TSV header line (TSVInput)



Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/graph/NodeConst.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInput.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInputIterator.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/NodeFactory.java
    jena/trunk/jena-arq/src/main/java/org/openjena/riot/system/PrefixMap.java
    jena/trunk/jena-arq/src/main/java/org/openjena/riot/tokens/Token.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/syntax/TestSSE_Basic.java

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/graph/NodeConst.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/graph/NodeConst.java?rev=1357247&r1=1357246&r2=1357247&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/graph/NodeConst.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/graph/NodeConst.java Wed Jul  4 13:25:35 2012
@@ -37,6 +37,7 @@ public class NodeConst
     public static final Node nodeFirst      = RDF.Nodes.first ;
     public static final Node nodeRest       = RDF.Nodes.rest ;
     public static final Node nodeNil        = RDF.Nodes.nil ;
+    public static final Node nodeANY        = Node.ANY ;
     
     public static final Node nodeOwlSameAs  = OWL.sameAs.asNode() ;
     public static final Node dtRDFlangString = Node.createURI(RDF.getURI()+"langString") ;

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInput.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInput.java?rev=1357247&r1=1357246&r2=1357247&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInput.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInput.java Wed Jul  4 13:25:35 2012
@@ -26,11 +26,14 @@ import java.util.List ;
 import java.util.regex.Pattern ;
 
 import org.openjena.atlas.io.IO ;
+import org.openjena.riot.RiotException ;
 
+import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.query.ResultSet ;
 import com.hp.hpl.jena.sparql.ARQException ;
 import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.engine.ResultSetStream ;
+import com.hp.hpl.jena.sparql.util.NodeFactory ;
 
 /**
  * Input reader associated to {@link TSVOutput}.
@@ -57,14 +60,20 @@ public class TSVInput {
         	    throw new ARQException("TSV Results malformed - input is empty (no header row)") ;
         	if ( ! str.isEmpty() )
         	{
-            	String[] tokens = pattern.split(str,-1);
-            	for ( String token : tokens ) 
-            	{
-            		if (!token.startsWith("?")) throw new ResultSetException("TSV Results malformed - variable names must begin with a ? in the header");
-            		token = token.substring(1);
-            		Var var = Var.alloc(token);
-            		vars.add(var);
-            		varNames.add(var.getName());
+        	    String[] tokens = pattern.split(str,-1);
+        	    for ( String token : tokens ) 
+        	    {
+        	        Node v ;
+        	        try {
+        	            v = NodeFactory.parseNode(token) ;
+        	            if ( v == null || ! v.isVariable())
+        	                throw new ResultSetException("TSV Results malformed - not a variable: "+token);
+        	        } catch (RiotException ex)
+        	        { throw new ResultSetException("TSV Results malformed - variable names must begin with a ? in the header: "+token); }
+
+        	        Var var = Var.alloc(v);
+        	        vars.add(var);
+        	        varNames.add(var.getName());
             	}
         	}
         } 
@@ -77,6 +86,4 @@ public class TSVInput {
         //This will parse actual result rows as needed thus minimising memory usage
         return new ResultSetStream(varNames, null, new TSVInputIterator(reader, vars));
     }
- 
-
-}
+ }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInputIterator.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInputIterator.java?rev=1357247&r1=1357246&r2=1357247&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInputIterator.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/resultset/TSVInputIterator.java Wed Jul  4 13:25:35 2012
@@ -27,8 +27,7 @@ import java.util.NoSuchElementException 
 
 import org.openjena.atlas.io.IO ;
 import org.openjena.atlas.io.IndentedWriter ;
-import org.openjena.riot.tokens.Tokenizer ;
-import org.openjena.riot.tokens.TokenizerFactory ;
+import org.openjena.riot.RiotException ;
 
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.sparql.core.Var ;
@@ -37,6 +36,7 @@ import com.hp.hpl.jena.sparql.engine.bin
 import com.hp.hpl.jena.sparql.engine.binding.BindingMap ;
 import com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase ;
 import com.hp.hpl.jena.sparql.serializer.SerializationContext ;
+import com.hp.hpl.jena.sparql.util.NodeFactory ;
 
 /**
  * Class used to do streaming parsing of actual result rows from the TSV
@@ -112,45 +112,28 @@ public class TSVInputIterator extends Qu
         	 throw new ResultSetException(format("Error Parsing TSV results at Line %d - The result row '%s' has %d values instead of the expected %d.", this.lineNum, line, tokens.length, expectedItems));
         this.binding = BindingFactory.create();
 
-        try
+        for ( int i = 0; i < tokens.length; i++ ) 
         {
-	        for ( int i = 0; i < tokens.length; i++ ) 
-	        {
-	        	String token = tokens[i];
-	
-	        	//If we see an empty string this denotes an unbound value
-	        	if (token.equals("")) continue; 
-	
-        		//Bound value so parse it and add to the binding
-        		Node node = parseNode(token, lineNum);
-        		this.binding.add(this.vars.get(i), node);
-	        }
-    	} catch (Exception e) {
-    		throw new ResultSetException(format("Error Parsing TSV results at Line %d - The result row '%s' contains an invalid encoding of a Node", this.lineNum, line));
-    	}
+            String token = tokens[i];
+
+            //If we see an empty string this denotes an unbound value
+            if (token.equals("")) continue; 
+
+            //Bound value so parse it and add to the binding
+            try {
+                Node node = NodeFactory.parseNode(token) ;
+                if ( !node.isConcrete() )
+                    throw new ResultSetException(format("Line %d: Not a concrete RDF term: %s",lineNum, token)) ;
+                this.binding.add(this.vars.get(i), node);
+            } catch (RiotException ex)
+            {
+                throw new ResultSetException(format("Line %d: %s", lineNum, ex.getMessage()));
+            }
+        }
 
         return true;
 	}
 	
-	private static Node parseNode(String token, long lineNum) {
-	    Tokenizer tokenizer = TokenizerFactory.makeTokenizerString(token) ;
-	    if ( ! tokenizer.hasNext() )
-	        throw new ResultSetException(format("Error Parsing TSV results at Line %d, item '%s' - The result row contains an empty term", lineNum, token)) ; 
-	    Node node = tokenizer.next().asNode() ;
-	    if ( ! node.isConcrete() )
-	        throw new ResultSetException(format("Error Parsing TSV results at Line %d, item '%s' - Bad RDF term", lineNum, token)) ;
-	    if ( tokenizer.hasNext() )
-	        throw new ResultSetException(format("Error Parsing TSV results at Line %d, item '%s' - Trailing characters", lineNum, token)) ;
-	    if ( node.isURI() )
-	    {
-	        // Lightly test for bad URIs.
-	        String x = node.getURI() ;
-	        if ( x.indexOf(' ') >= 0 )
-	            throw new ResultSetException(format("Error Parsing TSV results at Line %d, item '%s' - Space(s) in  IRI", lineNum, token)) ;
-	    }
-	    return node ;
-	}
-
 	@Override
 	protected Binding moveToNextBinding() {
         if (!hasNext()) throw new NoSuchElementException() ;

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/NodeFactory.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/NodeFactory.java?rev=1357247&r1=1357246&r2=1357247&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/NodeFactory.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/NodeFactory.java Wed Jul  4 13:25:35 2012
@@ -18,31 +18,56 @@
 
 package com.hp.hpl.jena.sparql.util;
 
+import org.openjena.riot.RiotException ;
+import org.openjena.riot.system.PrefixMap ;
+import org.openjena.riot.tokens.Token ;
+import org.openjena.riot.tokens.Tokenizer ;
+import org.openjena.riot.tokens.TokenizerFactory ;
+
 import com.hp.hpl.jena.datatypes.RDFDatatype ;
 import com.hp.hpl.jena.datatypes.TypeMapper ;
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.impl.LiteralLabel ;
 import com.hp.hpl.jena.query.QueryParseException ;
-import com.hp.hpl.jena.shared.PrefixMapping ;
-import com.hp.hpl.jena.shared.impl.PrefixMappingImpl ;
 import com.hp.hpl.jena.sparql.sse.SSE ;
 
 public class NodeFactory
 {
+    private static final PrefixMap prefixMappingDefault = PrefixMap.fromPrefixMapping(SSE.getDefaultPrefixMapRead()) ; 
+    
     /** Parse a node - with convenience prefix mapping */ 
     public static Node parseNode(String nodeString)
     {
-        return SSE.parseNode(nodeString) ;
+        return parseNode(nodeString, prefixMappingDefault) ;
     }
 
-    private static PrefixMapping pmapEmpty = new PrefixMappingImpl() ; 
-    /** Parse a string into a node. Pass null for the prefix mapping to indicate using no defined mappings */ 
-    public static Node parseNode(String nodeString, PrefixMapping pmap)
-    {
-        if ( pmap == null )
-            pmap = pmapEmpty ;
-        return SSE.parseNode(nodeString, pmap) ;
+    private static PrefixMap pmapEmpty = new PrefixMap() ; 
+
+    /** Parse a string into a node. 
+     * Pass null for the prefix mapping to indicate using no defined mappings
+     * Allows surrounding white space.
+     */ 
+    public static Node parseNode(String nodeString, PrefixMap pmap)
+    {
+        Tokenizer tokenizer = TokenizerFactory.makeTokenizerString(nodeString) ;
+        if ( ! tokenizer.hasNext() )
+            throw new RiotException("Empty RDF term") ; 
+        Token token = tokenizer.next() ;
+        Node node = token.asNode(pmap) ;
+        if ( node == null )
+            throw new RiotException("Bad RDF Term: "+nodeString) ;
+
+        if ( tokenizer.hasNext() )
+            throw new RiotException("Trailing characters in string: "+nodeString) ;
+        if ( node.isURI() )
+        {
+            // Lightly test for bad URIs.
+            String x = node.getURI() ;
+            if ( x.indexOf(' ') >= 0 )
+                throw new RiotException("Space(s) in  IRI: "+ nodeString) ;
+        }
+        return node ;
     }
     
     private static QueryParseException makeException(String msg, int line, int column)

Modified: jena/trunk/jena-arq/src/main/java/org/openjena/riot/system/PrefixMap.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/org/openjena/riot/system/PrefixMap.java?rev=1357247&r1=1357246&r2=1357247&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/org/openjena/riot/system/PrefixMap.java (original)
+++ jena/trunk/jena-arq/src/main/java/org/openjena/riot/system/PrefixMap.java Wed Jul  4 13:25:35 2012
@@ -23,18 +23,27 @@ import java.util.HashMap ;
 import java.util.Map ;
 import java.util.Map.Entry ;
 
+import org.apache.jena.iri.IRI ;
+import org.apache.jena.iri.IRIFactory ;
 import org.openjena.atlas.iterator.Iter ;
 import org.openjena.atlas.lib.ActionKeyValue ;
 import org.openjena.atlas.lib.Pair ;
 
-import org.apache.jena.iri.IRI ;
-import org.apache.jena.iri.IRIFactory ;
+import com.hp.hpl.jena.shared.PrefixMapping ;
 
 /** Lightweight, prefix mapping for parsers.  No XML rules, no reverse lookup. */
 public class PrefixMap
 {
     private final Map<String, IRI> prefixes = new HashMap<String, IRI>() ;
     private final Map<String, IRI> prefixes2 = Collections.unmodifiableMap(prefixes) ;
+ 
+    public static PrefixMap fromPrefixMapping(PrefixMapping pmap)
+    {
+        PrefixMap pm = new PrefixMap() ;
+        for ( Map.Entry<String, String> e : pmap.getNsPrefixMap().entrySet() )
+            pm.add(e.getKey(), e.getValue()) ;
+        return pm ;
+    }
     
     public PrefixMap() {}
     

Modified: jena/trunk/jena-arq/src/main/java/org/openjena/riot/tokens/Token.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/org/openjena/riot/tokens/Token.java?rev=1357247&r1=1357246&r2=1357247&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/org/openjena/riot/tokens/Token.java (original)
+++ jena/trunk/jena-arq/src/main/java/org/openjena/riot/tokens/Token.java Wed Jul  4 13:25:35 2012
@@ -54,6 +54,8 @@ import com.hp.hpl.jena.datatypes.TypeMap
 import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.rdf.model.AnonId ;
+import com.hp.hpl.jena.sparql.core.Var ;
+import com.hp.hpl.jena.sparql.graph.NodeConst ;
 import com.hp.hpl.jena.sparql.util.FmtUtils ;
 import com.hp.hpl.jena.vocabulary.XSD ;
 
@@ -68,7 +70,9 @@ public final class Token
     private long line ;
     
     // Keywords recognized.
-    public static final String ImageANY = "ANY" ;
+    public static final String ImageANY     = "ANY" ;
+    public static final String ImageTrue    = "true" ;
+    public static final String ImageFalse   = "false" ;
     
     public final TokenType getType() { return tokenType ; }
     public final String getImage()   { return tokenImage ; }
@@ -347,28 +351,47 @@ public final class Token
         return tokenType.equals(TokenType.BNODE) ;
     }
 
-    // Validation of URIs?
     
     /** Token to Node, a very direct form that is purely driven off the token.
      *  Turtle and N-triples need to process the token and not call this:
      *  1/ Use bNode label as given
      *  2/ No prefix or URI resolution.
+     *  3/ No checking.
      */
     public Node asNode()
     {
+        return asNode(null) ;
+    }
+    
+    /** Token to Node, with a prefix map
+     *  Turtle and N-triples need to process the token and not call this:
+     *  1/ Use bNode label as given
+     *  2/ No prefix or URI resolution.
+     *  3/ No checking.
+     */
+    public Node asNode(PrefixMap pmap)
+    {
         switch(tokenType)
         {
             // Assumes that bnode labels have been sorted out already.
             case BNODE : return Node.createAnon(new AnonId(tokenImage)) ;
             case IRI :   return Node.createURI(tokenImage) ; 
             case PREFIXED_NAME :
-                return Node.createURI("urn:prefixed-name:"+tokenImage+":"+tokenImage2) ;
+                if ( pmap == null )
+                    return Node.createURI("urn:prefixed-name:"+tokenImage+":"+tokenImage2) ;
+                String x = pmap.expand(tokenImage, tokenImage2) ;
+                if ( x == null )
+                    throw new RiotException("Can't expand prefixed name: "+this) ;
+                return Node.createURI(x) ;
             case DECIMAL :  return Node.createLiteral(tokenImage, null, XSDDatatype.XSDdecimal)  ; 
             case DOUBLE :   return Node.createLiteral(tokenImage, null, XSDDatatype.XSDdouble)  ;
             case INTEGER:   return Node.createLiteral(tokenImage, null, XSDDatatype.XSDinteger) ;
             case LITERAL_DT :
             {
-                Node n = getSubToken().asNode();
+                if ( pmap == null && getSubToken().hasType(TokenType.PREFIXED_NAME) )
+                    // Must be able to resolve the datattype else we can't find it's datatype.
+                    throw new RiotException("Invalid token: "+this) ;
+                Node n = getSubToken().asNode(pmap);
                 if ( ! n.isURI() )
                     throw new RiotException("Invalid token: "+this) ;
                 RDFDatatype dt = TypeMapper.getInstance().getSafeTypeByName(n.getURI()) ;
@@ -381,14 +404,21 @@ public final class Token
             case LONG_STRING1:
             case LONG_STRING2:
                 return Node.createLiteral(tokenImage) ;
+            case VAR:
+                return Var.alloc(tokenImage) ;
             case KEYWORD:
                 if ( tokenImage.equals(ImageANY) )
-                    return Node.ANY ;
+                    return NodeConst.nodeANY ;
+                if ( tokenImage.equals(ImageTrue) )
+                    return NodeConst.nodeTrue ;
+                if ( tokenImage.equals(ImageFalse) )
+                    return NodeConst.nodeFalse; ;
                 //$FALL-THROUGH$
             default: break ;
         }
         return null ;
     }
+
     
     public boolean hasType(TokenType tokenType)
     {

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/syntax/TestSSE_Basic.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/syntax/TestSSE_Basic.java?rev=1357247&r1=1357246&r2=1357247&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/syntax/TestSSE_Basic.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/syntax/TestSSE_Basic.java Wed Jul  4 13:25:35 2012
@@ -43,7 +43,6 @@ public class TestSSE_Basic extends TestC
 
     static Node typeLit1 = NodeFactory.createLiteralNode("123", null, "http://example/type") ;
     
-    
     static Item int1i = Item.createNode(int1) ;
     static Item int2i = Item.createNode(int2) ;
     static Item int3i = Item.createNode(int3) ;
@@ -126,7 +125,7 @@ public class TestSSE_Basic extends TestC
     // Default allocations
     @Test public void testVar_09()
     { 
-        Node v = NodeFactory.parseNode("?") ;
+        Node v = parseNode("?") ;
         assertTrue( v instanceof Var ) ;
         String vn = ((Var)v).getVarName() ;
         assertFalse(vn.equals("")) ;
@@ -134,7 +133,7 @@ public class TestSSE_Basic extends TestC
     
     @Test public void testVar_10()
     { 
-        Node v = NodeFactory.parseNode("?"+ARQConstants.allocVarAnonMarker) ;
+        Node v = parseNode("?"+ARQConstants.allocVarAnonMarker) ;
         assertTrue( v instanceof Var ) ;
         String vn = ((Var)v).getVarName() ;
         assertFalse(vn.equals(ARQConstants.allocVarAnonMarker)) ;
@@ -142,7 +141,7 @@ public class TestSSE_Basic extends TestC
     
     @Test public void testVar_11()
     { 
-        Node v = NodeFactory.parseNode("?"+ARQConstants.allocVarMarker) ;
+        Node v = parseNode("?"+ARQConstants.allocVarMarker) ;
         assertTrue( v instanceof Var ) ;
         String vn = ((Var)v).getVarName() ;
         assertFalse(vn.equals(ARQConstants.allocVarMarker)) ;
@@ -231,7 +230,7 @@ public class TestSSE_Basic extends TestC
         Item item = SSE.parse("abc") ;
         try {
             item.getInt() ;
-            fail("Succeeded where exception expected") ;
+            fail("Succeeded where exceptiSSE.on expected") ;
         } catch (ItemException ex) {}
     }
 
@@ -348,21 +347,26 @@ public class TestSSE_Basic extends TestC
 
     private void testNode(String str)
     {
-        Node node = NodeFactory.parseNode(str) ;
+        Node node = parseNode(str) ;
     }
     
     private void testVar(String str)
     {
-        Node node = NodeFactory.parseNode(str) ;
+        Node node = parseNode(str) ;
         assertTrue( node instanceof Var ) ;
     }
     
     private void testNode(String str, Node result)
     {
-        Node node = NodeFactory.parseNode(str) ;
+        Node node = parseNode(str) ;
         assertEquals(result, node) ;
     }
 
+    private Node parseNode(String str)
+    {
+        // Not NodeFactory.parseNode which does not have all the features (e.g. "_" and "?") 
+        return SSE.parseNode(str) ;
+    }
     
     private void parseBad(String str)
     {
@@ -378,10 +382,12 @@ public class TestSSE_Basic extends TestC
     private void parseBadNode(String str)
     {
         try {
-            Node node = NodeFactory.parseNode(str) ;
+            // Not NodeFactory.parseNode which does not have all the features (e.g. "_" and "?") 
+            Node node = parseNode(str) ;
             //System.out.println(str+" => "+item) ;
             fail("Did not get a parse failure") ;
         } 
+        //catch (RiotException ex) {}
         catch (SSEParseException ex) {}
         catch (ARQException ex) {}
     }