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) {}
}