RIOT support for undefined prefix mode. Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/ef245546 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/ef245546 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/ef245546
Branch: refs/heads/master Commit: ef245546d21aad00b178b4d76b5a59792339e55f Parents: 816e49c Author: Andy Seaborne <[email protected]> Authored: Tue Apr 19 13:48:32 2016 +0100 Committer: Andy Seaborne <[email protected]> Committed: Tue Apr 19 13:48:32 2016 +0100 ---------------------------------------------------------------------- .../main/java/org/apache/jena/query/ARQ.java | 12 +++---- .../jena/riot/system/ParserProfileBase.java | 6 +++- .../jena/riot/system/ParserProfileChecker.java | 4 ++- .../org/apache/jena/riot/system/RiotLib.java | 38 +++++++++++++++++--- .../org/apache/jena/sparql/lang/ParserBase.java | 7 ++-- 5 files changed, 49 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/ef245546/jena-arq/src/main/java/org/apache/jena/query/ARQ.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/query/ARQ.java b/jena-arq/src/main/java/org/apache/jena/query/ARQ.java index 75d1306..4691e42 100644 --- a/jena-arq/src/main/java/org/apache/jena/query/ARQ.java +++ b/jena-arq/src/main/java/org/apache/jena/query/ARQ.java @@ -18,9 +18,8 @@ package org.apache.jena.query; -import java.util.function.Function ; - import org.apache.jena.riot.RIOT ; +import org.apache.jena.riot.system.RiotLib ; import org.apache.jena.sparql.SystemARQ ; import org.apache.jena.sparql.algebra.optimize.TransformOrderByDistinctApplication ; import org.apache.jena.sparql.core.assembler.AssemblerUtils ; @@ -254,14 +253,13 @@ public class ARQ public static final Symbol serviceAllowed = Service.serviceAllowed ; /** If set to true, the parsers will convert undefined prefixes to a URI - * according to the fixup function {@link #fixupPrefixes}. - * Normally, false. + * according to the fixup function {@link RiotLib#fixupPrefixes}. + * Normally, unset (which equates to false). + * + * @see RiotLib#isPrefixIRI */ public static final Symbol fixupUndefinedPrefixes = SystemARQ.allocSymbol("fixupPrefixes") ; - /** Function applied to undefined prefixes to convert to a URI string */ - public static final Function<String,String> fixupPrefixes = (x) -> "::"+x ; - /** * A Long value that specifies the number of bindings (or triples for CONSTRUCT queries) to be stored in memory by sort * operations or hash tables before switching to temporary disk files. The value defaults to -1, which will always http://git-wip-us.apache.org/repos/asf/jena/blob/ef245546/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileBase.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileBase.java b/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileBase.java index e743cdc..8ed68e3 100644 --- a/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileBase.java +++ b/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileBase.java @@ -26,6 +26,7 @@ import org.apache.jena.graph.Node ; import org.apache.jena.graph.NodeFactory ; import org.apache.jena.graph.Triple ; import org.apache.jena.iri.IRI ; +import org.apache.jena.query.ARQ ; import org.apache.jena.riot.RiotException ; import org.apache.jena.riot.SysRIOT ; import org.apache.jena.riot.tokens.Token ; @@ -217,8 +218,11 @@ public class ParserProfileBase implements ParserProfile { private static String expandPrefixedName(ParserProfile pp, String prefix, String localPart, Token token) { String expansion = pp.getPrologue().getPrefixMap().expand(prefix, localPart) ; - if (expansion == null) + if (expansion == null) { + if ( ARQ.isTrue(ARQ.fixupUndefinedPrefixes) ) + return RiotLib.fixupPrefixIRI(prefix, localPart) ; pp.getHandler().fatal("Undefined prefix: " + prefix, token.getLine(), token.getColumn()) ; + } return expansion ; } http://git-wip-us.apache.org/repos/asf/jena/blob/ef245546/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileChecker.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileChecker.java b/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileChecker.java index 920ce55..aa33649 100644 --- a/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileChecker.java +++ b/jena-arq/src/main/java/org/apache/jena/riot/system/ParserProfileChecker.java @@ -103,7 +103,9 @@ public class ParserProfileChecker extends ParserProfileBase // implements Parser @Override public Node createURI(String x, long line, long col) { - if ( ! RiotLib.isBNodeIRI(x) ) + if ( RiotLib.isBNodeIRI(x) ) {} + else if ( RiotLib.isPrefixIRI(x) ) {} + else x = resolveIRI(x, line, col) ; return super.createURI(x, line, col) ; } http://git-wip-us.apache.org/repos/asf/jena/blob/ef245546/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java index 01161dd..cde6a91 100644 --- a/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java +++ b/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java @@ -29,6 +29,8 @@ import static org.apache.jena.riot.writer.WriterConst.rdfNS ; import java.io.OutputStream ; import java.io.Writer ; import java.util.* ; +import java.util.function.Function ; +import java.util.function.Predicate ; import org.apache.jena.atlas.io.IndentedWriter ; import org.apache.jena.atlas.iterator.Iter ; @@ -38,7 +40,10 @@ import org.apache.jena.graph.Node ; import org.apache.jena.graph.NodeFactory ; import org.apache.jena.graph.Triple ; import org.apache.jena.query.ARQ ; -import org.apache.jena.riot.* ; +import org.apache.jena.riot.Lang ; +import org.apache.jena.riot.RDFLanguages ; +import org.apache.jena.riot.SysRIOT ; +import org.apache.jena.riot.WriterDatasetRIOT ; import org.apache.jena.riot.lang.LabelToNode ; import org.apache.jena.riot.tokens.Token ; import org.apache.jena.riot.tokens.Tokenizer ; @@ -73,12 +78,37 @@ public class RiotLib return NodeFactory.createURI(iri) ; } - /** Test whether */ - public static boolean isBNodeIRI(String iri) - { + /** Test whether a IRI is a ARQ-encoded blank node. */ + public static boolean isBNodeIRI(String iri) { return skolomizedBNodes && iri.startsWith(bNodeLabelStart) ; } + // These two must be in-step. + /** Function applied to undefined prefixes to convert to a URI string */ + public static final Function<String,String> fixupPrefixes = (x) -> "::"+x ; + + /** Function to test for undefined prefix URIs*/ + public static final Predicate<String> testFixupedPrefixURI = (x) -> x.startsWith("::") ; + + /** Test whether a IRI is a ARQ-encoded blank node. */ + public static boolean isPrefixIRI(String iri) { + return testFixupedPrefixURI.test(iri) ; + } + + /** Convert an prefix name (qname) to an IRI, for when the prerix is nor defined. + * @see ARQ#fixupUndefinedPrefixes + */ + public static String fixupPrefixIRI(String prefix, String localPart) { + return fixupPrefixIRI(prefix+":"+localPart) ; + } + + /** Convert an prefix name (qname) to an IRI, for when the prerix is nor defined. + * @see ARQ#fixupUndefinedPrefixes + */ + public static String fixupPrefixIRI(String prefixedName) { + return fixupPrefixes.apply(prefixedName) ; + } + private static ParserProfile profile = profile(RDFLanguages.TURTLE, null, ErrorHandlerFactory.errorHandlerStd) ; static { PrefixMap pmap = profile.getPrologue().getPrefixMap() ; http://git-wip-us.apache.org/repos/asf/jena/blob/ef245546/jena-arq/src/main/java/org/apache/jena/sparql/lang/ParserBase.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/lang/ParserBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/lang/ParserBase.java index 90d5164..075d6b1 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/lang/ParserBase.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/lang/ParserBase.java @@ -268,9 +268,6 @@ public class ParserBase return iriStr ; } - // Pragmatic. - private final boolean fixupUndefinedPrefixedNames = ARQ.isTrue(ARQ.fixupUndefinedPrefixes) ; - protected String resolvePName(String prefixedName, int line, int column) { // It's legal. int idx = prefixedName.indexOf(':') ; @@ -284,8 +281,8 @@ public class ParserBase String s = getPrologue().expandPrefixedName(prefixedName) ; if ( s == null ) { - if ( fixupUndefinedPrefixedNames ) - return ARQ.fixupPrefixes.apply(prefixedName) ; + if ( ARQ.isTrue(ARQ.fixupUndefinedPrefixes) ) + return RiotLib.fixupPrefixes.apply(prefixedName) ; throwParseException("Unresolved prefixed name: " + prefixedName, line, column) ; } return s ;
