Skip to content

Commit 2eed40a

Browse files
author
James Leigh
committed
Issue #69: Deprecate ParsedURI in favor of ParsedIRI
Signed-off-by: James Leigh <james.leigh@ontotext.com>
1 parent 472116c commit 2eed40a

10 files changed

Lines changed: 75 additions & 145 deletions

File tree

core/queryparser/sparql/src/main/java/org/eclipse/rdf4j/query/parser/sparql/BaseDeclProcessor.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
*******************************************************************************/
88
package org.eclipse.rdf4j.query.parser.sparql;
99

10+
import java.net.URISyntaxException;
11+
12+
import org.eclipse.rdf4j.common.net.ParsedIRI;
1013
import org.eclipse.rdf4j.common.net.ParsedURI;
1114
import org.eclipse.rdf4j.query.MalformedQueryException;
1215
import org.eclipse.rdf4j.query.parser.sparql.ast.ASTBaseDecl;
@@ -44,20 +47,30 @@ public class BaseDeclProcessor {
4447
public static void process(ASTOperationContainer qc, String externalBaseURI)
4548
throws MalformedQueryException
4649
{
47-
ParsedURI parsedBaseURI = null;
50+
ParsedIRI parsedBaseURI = null;
4851

4952
// Use the query model's own base URI, if available
5053
ASTBaseDecl baseDecl = qc.getBaseDecl();
5154
if (baseDecl != null) {
52-
parsedBaseURI = new ParsedURI(baseDecl.getIRI());
55+
try {
56+
parsedBaseURI = new ParsedIRI(baseDecl.getIRI());
57+
}
58+
catch (URISyntaxException e) {
59+
throw new MalformedQueryException(e);
60+
}
5361

5462
if (!parsedBaseURI.isAbsolute()) {
5563
throw new MalformedQueryException("BASE IRI is not an absolute IRI: " + externalBaseURI);
5664
}
5765
}
5866
else if (externalBaseURI != null) {
5967
// Use external base URI if the query doesn't contain one itself
60-
parsedBaseURI = new ParsedURI(externalBaseURI);
68+
try {
69+
parsedBaseURI = new ParsedIRI(externalBaseURI);
70+
}
71+
catch (URISyntaxException e) {
72+
throw new MalformedQueryException(e);
73+
}
6174

6275
if (!parsedBaseURI.isAbsolute()) {
6376
throw new IllegalArgumentException(
@@ -98,18 +111,21 @@ else if (qc.getOperation() instanceof ASTDeleteData) {
98111

99112
private static class RelativeIRIResolver extends AbstractASTVisitor {
100113

101-
private ParsedURI parsedBaseURI;
114+
private ParsedIRI parsedBaseURI;
102115

103116
public RelativeIRIResolver(ParsedURI parsedBaseURI) {
117+
this(ParsedIRI.create(parsedBaseURI.toString()));
118+
}
119+
120+
public RelativeIRIResolver(ParsedIRI parsedBaseURI) {
104121
this.parsedBaseURI = parsedBaseURI;
105122
}
106123

107124
@Override
108125
public Object visit(ASTIRI node, Object data)
109126
throws VisitorException
110127
{
111-
ParsedURI resolvedURI = parsedBaseURI.resolve(node.getValue());
112-
node.setValue(resolvedURI.toString());
128+
node.setValue(parsedBaseURI.resolve(node.getValue()));
113129

114130
return super.visit(node, data);
115131
}

core/repository/sparql/src/main/java/org/eclipse/rdf4j/repository/sparql/query/SPARQLOperation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import java.util.regex.Pattern;
1616

1717
import org.apache.http.client.HttpClient;
18-
import org.eclipse.rdf4j.common.net.ParsedURI;
18+
import org.eclipse.rdf4j.common.net.ParsedIRI;
1919
import org.eclipse.rdf4j.model.IRI;
2020
import org.eclipse.rdf4j.model.Literal;
2121
import org.eclipse.rdf4j.model.Value;
@@ -48,7 +48,7 @@ public SPARQLOperation(HttpClient client, String url, String base, String operat
4848
this.url = url;
4949
this.operation = operation;
5050
this.client = client;
51-
boolean abs = base != null && base.length() > 0 && new ParsedURI(base).isAbsolute();
51+
boolean abs = base != null && base.length() > 0 && ParsedIRI.create(base).isAbsolute();
5252
if (abs && !operation.toUpperCase().contains("BASE")) {
5353
this.operation = "BASE <" + base + "> " + operation;
5454
}

core/rio/api/src/main/java/org/eclipse/rdf4j/rio/helpers/AbstractRDFParser.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*******************************************************************************/
88
package org.eclipse.rdf4j.rio.helpers;
99

10-
import java.io.UnsupportedEncodingException;
10+
import java.net.URISyntaxException;
1111
import java.nio.charset.StandardCharsets;
1212
import java.security.MessageDigest;
1313
import java.security.NoSuchAlgorithmException;
@@ -20,6 +20,7 @@
2020

2121
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
2222

23+
import org.eclipse.rdf4j.common.net.ParsedIRI;
2324
import org.eclipse.rdf4j.common.net.ParsedURI;
2425
import org.eclipse.rdf4j.model.BNode;
2526
import org.eclipse.rdf4j.model.IRI;
@@ -74,7 +75,7 @@ public abstract class AbstractRDFParser implements RDFParser {
7475
/**
7576
* The base URI for resolving relative URIs.
7677
*/
77-
private ParsedURI baseURI;
78+
private ParsedIRI baseURI;
7879

7980
/**
8081
* Enables a consistent global mapping of blank node identifiers without using a map, but concatenating
@@ -298,16 +299,16 @@ public DatatypeHandling datatypeHandling() {
298299
*/
299300
protected void setBaseURI(String uriSpec) {
300301
// Store normalized base URI
301-
ParsedURI baseURI = new ParsedURI(uriSpec);
302-
baseURI.normalize();
303-
setBaseURI(baseURI);
302+
if (this.baseURI == null || !this.baseURI.toString().equals(uriSpec)) {
303+
this.baseURI = ParsedIRI.create(uriSpec).normalize();
304+
}
304305
}
305306

306307
/**
307308
* Sets the base URI for resolving relative URIs.
308309
*/
309310
protected void setBaseURI(ParsedURI baseURI) {
310-
this.baseURI = baseURI;
311+
setBaseURI(baseURI.toString());
311312
}
312313

313314
/**
@@ -375,15 +376,23 @@ protected IRI resolveURI(String uriSpec)
375376
throws RDFParseException
376377
{
377378
// Resolve relative URIs against base URI
378-
ParsedURI uri = new ParsedURI(uriSpec);
379+
ParsedIRI uri;
380+
try {
381+
uri = new ParsedIRI(uriSpec);
382+
}
383+
catch (URISyntaxException e) {
384+
reportError("Invalid base IRI '" + uriSpec,
385+
BasicParserSettings.VERIFY_URI_SYNTAX);
386+
uri = ParsedIRI.create(uriSpec);
387+
}
379388

380-
if (uri.isRelative()) {
389+
if (!uri.isAbsolute()) {
381390
if (baseURI == null) {
382391
reportFatalError("Unable to resolve URIs, no base URI has been set");
383392
}
384393

385394
if (getParserConfig().get(BasicParserSettings.VERIFY_RELATIVE_URIS)) {
386-
if (uri.isRelative() && !uri.isSelfReference() && baseURI.isOpaque()) {
395+
if (!uri.isAbsolute() && uriSpec.length() > 0 && !uriSpec.startsWith("#") && baseURI.isOpaque()) {
387396
reportError("Relative URI '" + uriSpec
388397
+ "' cannot be resolved using the opaque base URI '" + baseURI + "'",
389398
BasicParserSettings.VERIFY_RELATIVE_URIS);

core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,12 @@ protected void setBaseURI(ParsedURI baseURI) {
478478
super.setBaseURI(baseURI);
479479
}
480480

481+
@Override
482+
protected void setBaseURI(String baseURI) {
483+
// Note: we need to override this method to allow SAXFilter to access it
484+
super.setBaseURI(baseURI);
485+
}
486+
481487
void setXMLLang(String xmlLang) {
482488
if ("".equals(xmlLang)) {
483489
this.xmlLang = null;

core/rio/rdfxml/src/main/java/org/eclipse/rdf4j/rio/rdfxml/SAXFilter.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import java.util.Map;
1515
import java.util.Stack;
1616

17-
import org.eclipse.rdf4j.common.net.ParsedURI;
17+
import org.eclipse.rdf4j.common.net.ParsedIRI;
1818
import org.eclipse.rdf4j.common.xml.XMLUtil;
1919
import org.eclipse.rdf4j.model.vocabulary.RDF;
2020
import org.eclipse.rdf4j.rio.ParseLocationListener;
@@ -60,7 +60,7 @@ class SAXFilter implements ContentHandler {
6060
/**
6161
* The document's URI.
6262
*/
63-
private ParsedURI documentURI;
63+
private ParsedIRI documentURI;
6464

6565
/**
6666
* Flag indicating whether the parser parses stand-alone RDF documents. In stand-alone documents, the
@@ -320,7 +320,7 @@ private void reportDeferredStartElement()
320320
elInfoStack.push(deferredElement);
321321
rdfContextStackHeight++;
322322

323-
rdfParser.setBaseURI(deferredElement.baseURI);
323+
rdfParser.setBaseURI(deferredElement.baseURI.toString());
324324
rdfParser.setXMLLang(deferredElement.xmlLang);
325325

326326
rdfParser.startElement(deferredElement.namespaceURI, deferredElement.localName, deferredElement.qName,
@@ -383,7 +383,7 @@ public void endElement(String namespaceURI, String localName, String qName)
383383
// Check for any deferred start elements
384384
if (deferredElement != null) {
385385
// Start element still deferred, this is an empty element
386-
rdfParser.setBaseURI(deferredElement.baseURI);
386+
rdfParser.setBaseURI(deferredElement.baseURI.toString());
387387
rdfParser.setXMLLang(deferredElement.xmlLang);
388388

389389
rdfParser.emptyElement(deferredElement.namespaceURI, deferredElement.localName,
@@ -547,10 +547,8 @@ public void setParseLiteralMode() {
547547
unknownPrefixesInXMLLiteral.clear();
548548
}
549549

550-
private ParsedURI createBaseURI(String uriString) {
551-
ParsedURI uri = new ParsedURI(uriString);
552-
uri.normalize();
553-
return uri;
550+
private ParsedIRI createBaseURI(String uriString) {
551+
return ParsedIRI.create(uriString).normalize();
554552
}
555553

556554
/*---------------------------------*
@@ -675,7 +673,7 @@ private class ElementInfo {
675673

676674
private Map<String, String> namespaceMap;
677675

678-
public ParsedURI baseURI;
676+
public ParsedIRI baseURI;
679677

680678
public String xmlLang;
681679

core/util/src/main/java/org/eclipse/rdf4j/common/net/ParsedURI.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
* resolve relative URIs correctly.
1919
* <p>
2020
* Note: this implementation is not guaranteed to handle ipv6 addresses correctly (yet).
21+
* @deprecated use {@link ParsedIRI} instead
2122
*/
23+
@Deprecated
2224
public class ParsedURI implements java.lang.Cloneable {
2325

2426
/*

testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/n3/N3ParserTestCase.java

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,13 @@
88
package org.eclipse.rdf4j.rio.n3;
99

1010
import java.io.InputStream;
11-
import java.io.UnsupportedEncodingException;
1211
import java.net.MalformedURLException;
1312
import java.net.URL;
14-
import java.net.URLDecoder;
15-
import java.net.URLEncoder;
1613
import java.util.LinkedHashSet;
1714
import java.util.LinkedList;
1815
import java.util.List;
1916
import java.util.Set;
2017

21-
import junit.framework.TestCase;
22-
import junit.framework.TestSuite;
23-
2418
import org.eclipse.rdf4j.model.Statement;
2519
import org.eclipse.rdf4j.model.util.Models;
2620
import org.eclipse.rdf4j.query.BindingSet;
@@ -36,6 +30,9 @@
3630
import org.eclipse.rdf4j.rio.ntriples.NTriplesParser;
3731
import org.eclipse.rdf4j.sail.memory.MemoryStore;
3832

33+
import junit.framework.TestCase;
34+
import junit.framework.TestSuite;
35+
3936
/**
4037
* JUnit test for the N3 parser that uses the tests that are available
4138
* <a href="http://www.w3.org/2000/10/swap/test/n3parser.tests">online</a>.
@@ -250,32 +247,10 @@ protected void runTest() {
250247
private static URL url(String uri)
251248
throws MalformedURLException
252249
{
253-
if (!uri.startsWith("injar:"))
254-
return new URL(uri);
255-
int start = uri.indexOf(':') + 3;
256-
int end = uri.indexOf('/', start);
257-
String encoded = uri.substring(start, end);
258-
try {
259-
String jar = URLDecoder.decode(encoded, "UTF-8");
260-
return new URL("jar:" + jar + '!' + uri.substring(end));
261-
}
262-
catch (UnsupportedEncodingException e) {
263-
throw new AssertionError(e);
264-
}
250+
return new URL(uri);
265251
}
266252

267253
private static String base(String uri) {
268-
if (!uri.startsWith("jar:"))
269-
return uri;
270-
int start = uri.indexOf(':') + 1;
271-
int end = uri.lastIndexOf('!');
272-
String jar = uri.substring(start, end);
273-
try {
274-
String encoded = URLEncoder.encode(jar, "UTF-8");
275-
return "injar://" + encoded + uri.substring(end + 1);
276-
}
277-
catch (UnsupportedEncodingException e) {
278-
throw new AssertionError(e);
279-
}
254+
return uri;
280255
}
281256
}

testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserTestCase.java

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,11 @@
1212
import java.io.UnsupportedEncodingException;
1313
import java.net.MalformedURLException;
1414
import java.net.URL;
15-
import java.net.URLDecoder;
16-
import java.net.URLEncoder;
1715
import java.util.LinkedHashSet;
1816
import java.util.Set;
1917

2018
import javax.xml.parsers.ParserConfigurationException;
2119

22-
import junit.framework.TestCase;
23-
import junit.framework.TestSuite;
24-
2520
import org.apache.xml.security.c14n.CanonicalizationException;
2621
import org.apache.xml.security.c14n.Canonicalizer;
2722
import org.apache.xml.security.c14n.InvalidCanonicalizerException;
@@ -46,6 +41,9 @@
4641
import org.eclipse.rdf4j.sail.memory.MemoryStore;
4742
import org.xml.sax.SAXException;
4843

44+
import junit.framework.TestCase;
45+
import junit.framework.TestSuite;
46+
4947
/**
5048
* JUnit test for the RDF/XML parser that uses the test manifest that is available
5149
* <a href="http://www.w3.org/2000/10/rdf-tests/rdfcore/Manifest.rdf">online</a>.
@@ -318,32 +316,10 @@ public Literal createLiteral(String value, IRI datatype) {
318316
private static URL url(String uri)
319317
throws MalformedURLException
320318
{
321-
if (!uri.startsWith("injar:"))
322-
return new URL(uri);
323-
int start = uri.indexOf(':') + 3;
324-
int end = uri.indexOf('/', start);
325-
String encoded = uri.substring(start, end);
326-
try {
327-
String jar = URLDecoder.decode(encoded, "UTF-8");
328-
return new URL("jar:" + jar + '!' + uri.substring(end));
329-
}
330-
catch (UnsupportedEncodingException e) {
331-
throw new AssertionError(e);
332-
}
319+
return new URL(uri);
333320
}
334321

335322
private static String base(String uri) {
336-
if (!uri.startsWith("jar:"))
337-
return uri;
338-
int start = uri.indexOf(':') + 1;
339-
int end = uri.lastIndexOf('!');
340-
String jar = uri.substring(start, end);
341-
try {
342-
String encoded = URLEncoder.encode(jar, "UTF-8");
343-
return "injar://" + encoded + uri.substring(end + 1);
344-
}
345-
catch (UnsupportedEncodingException e) {
346-
throw new AssertionError(e);
347-
}
323+
return uri;
348324
}
349325
}

0 commit comments

Comments
 (0)