Skip to content

Commit 828be54

Browse files
author
James Leigh
committed
Fix #780: Validate all IRIs in AbstractRDFParser by default
Signed-off-by: James Leigh <james.leigh@ontotext.com>
1 parent c38e52f commit 828be54

10 files changed

Lines changed: 68 additions & 19 deletions

File tree

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfjson/RDFJSONParserCustomTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class RDFJSONParserCustomTest {
2424
public void testSupportedSettings()
2525
throws Exception
2626
{
27-
assertEquals(17, Rio.createParser(RDFFormat.RDFJSON).getSupportedSettings().size());
27+
assertEquals(18, Rio.createParser(RDFFormat.RDFJSON).getSupportedSettings().size());
2828
}
2929

3030
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/rdfxml/RDFXMLParserCustomTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,6 @@ public void testParseCommentAtStart()
223223
public void testSupportedSettings()
224224
throws Exception
225225
{
226-
assertEquals(21, Rio.createParser(RDFFormat.RDFXML).getSupportedSettings().size());
226+
assertEquals(22, Rio.createParser(RDFFormat.RDFXML).getSupportedSettings().size());
227227
}
228228
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/trig/TriGParserCustomTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ public void testBadPname02()
226226
public void testSupportedSettings()
227227
throws Exception
228228
{
229-
assertEquals(12, Rio.createParser(RDFFormat.TRIG).getSupportedSettings().size());
229+
assertEquals(13, Rio.createParser(RDFFormat.TRIG).getSupportedSettings().size());
230230
}
231231

232232
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/turtle/CustomTurtleParserTest.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,25 @@
77
*******************************************************************************/
88
package org.eclipse.rdf4j.rio.turtle;
99

10-
import static org.junit.Assert.*;
10+
import static org.junit.Assert.assertEquals;
11+
import static org.junit.Assert.assertFalse;
12+
import static org.junit.Assert.assertTrue;
13+
import static org.junit.Assert.fail;
1114

1215
import java.io.StringReader;
1316
import java.io.StringWriter;
1417
import java.util.Collections;
18+
import java.util.function.Consumer;
1519

1620
import org.eclipse.rdf4j.model.IRI;
1721
import org.eclipse.rdf4j.model.Literal;
1822
import org.eclipse.rdf4j.model.Model;
1923
import org.eclipse.rdf4j.model.Namespace;
24+
import org.eclipse.rdf4j.model.Value;
2025
import org.eclipse.rdf4j.model.ValueFactory;
2126
import org.eclipse.rdf4j.model.impl.LinkedHashModel;
2227
import org.eclipse.rdf4j.model.impl.NamespaceImpl;
28+
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
2329
import org.eclipse.rdf4j.model.impl.ValueFactoryImpl;
2430
import org.eclipse.rdf4j.model.util.Models;
2531
import org.eclipse.rdf4j.model.vocabulary.RDF;
@@ -206,7 +212,7 @@ public void testLiteralWithNewlines()
206212
public void testSupportedSettings()
207213
throws Exception
208214
{
209-
assertEquals(12, parser.getSupportedSettings().size());
215+
assertEquals(13, parser.getSupportedSettings().size());
210216
}
211217

212218
@Test
@@ -507,4 +513,24 @@ public void testParsingNamespacesWithOverride()
507513
assertTrue(model.contains(vf.createIRI("urn:a"), vf.createIRI("urn:not_skos:broader"),
508514
vf.createIRI("urn:b")));
509515
}
516+
517+
@Test
518+
public void test780IRISpace()
519+
throws Exception
520+
{
521+
String ttl = "_:b25978837 a <http://purl.bioontology.org/ontology/UATC/\\u0020SERINE\\u0020\\u0020> .";
522+
try {
523+
Rio.parse(new StringReader(ttl), "", RDFFormat.TURTLE);
524+
fail();
525+
}
526+
catch (RDFParseException e) {
527+
// Invalid IRI
528+
}
529+
Model model = Rio.parse(new StringReader(ttl), "", RDFFormat.TURTLE,
530+
new ParserConfig().set(BasicParserSettings.VERIFY_URI_SYNTAX, false),
531+
SimpleValueFactory.getInstance(), new ParseErrorLogger());
532+
assertEquals(1, model.size());
533+
model.filter(null, RDF.TYPE, null).objects().forEach(obj -> assertEquals(
534+
"http://purl.bioontology.org/ontology/UATC/%20SERINE%20%20", obj.stringValue()));
535+
}
510536
}

compliance/rio/src/test/java/org/eclipse/rdf4j/rio/turtle/TurtleParserTest.java

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

10-
import junit.framework.Test;
11-
1210
import org.eclipse.rdf4j.rio.RDFParser;
13-
import org.eclipse.rdf4j.rio.helpers.TurtleParserSettings;
11+
import org.eclipse.rdf4j.rio.helpers.BasicParserSettings;
1412
import org.eclipse.rdf4j.rio.ntriples.NTriplesParser;
15-
import org.eclipse.rdf4j.rio.turtle.TurtleParser;
16-
import org.eclipse.rdf4j.rio.turtle.TurtleParserTestCase;
13+
14+
import junit.framework.Test;
1715

1816
/**
1917
* JUnit test for the Turtle parser that uses the tests that are available
@@ -30,11 +28,16 @@ public static Test suite()
3028
@Override
3129
protected RDFParser createTurtleParser() {
3230
RDFParser result = new TurtleParser();
31+
// localName_with_assigned_nfc_PN_CHARS_BASE_character_boundaries contains illegal trailing character
32+
result.set(BasicParserSettings.VERIFY_URI_SYNTAX, false);
3333
return result;
3434
}
3535

3636
@Override
3737
protected RDFParser createNTriplesParser() {
38-
return new NTriplesParser();
38+
NTriplesParser result = new NTriplesParser();
39+
// localName_with_assigned_nfc_PN_CHARS_BASE_character_boundaries contains illegal trailing character
40+
result.set(BasicParserSettings.VERIFY_URI_SYNTAX, false);
41+
return result;
3942
}
4043
}

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ public Collection<RioSetting<?>> getSupportedSettings() {
198198
// Supported in RDFParserBase.resolveURI
199199
result.add(BasicParserSettings.VERIFY_RELATIVE_URIS);
200200

201+
// Supported in createURI
202+
result.add(BasicParserSettings.VERIFY_URI_SYNTAX);
203+
201204
// Supported in RDFParserBase.createBNode(String)
202205
result.add(BasicParserSettings.PRESERVE_BNODE_IDS);
203206

@@ -376,7 +379,15 @@ protected IRI resolveURI(String uriSpec)
376379
throws RDFParseException
377380
{
378381
// Resolve relative URIs against base URI
379-
ParsedIRI uri = ParsedIRI.create(uriSpec);
382+
ParsedIRI uri;
383+
try {
384+
uri = new ParsedIRI(uriSpec);
385+
}
386+
catch (URISyntaxException e) {
387+
reportError("Invalid IRI '" + uriSpec,
388+
BasicParserSettings.VERIFY_URI_SYNTAX);
389+
uri = ParsedIRI.create(uriSpec);
390+
}
380391

381392
if (!uri.isAbsolute()) {
382393
if (baseURI == null) {
@@ -403,6 +414,15 @@ protected IRI resolveURI(String uriSpec)
403414
protected IRI createURI(String uri)
404415
throws RDFParseException
405416
{
417+
if (getParserConfig().get(BasicParserSettings.VERIFY_URI_SYNTAX)) {
418+
try {
419+
new ParsedIRI(uri);
420+
}
421+
catch (URISyntaxException e) {
422+
reportError(e.getMessage(),
423+
BasicParserSettings.VERIFY_URI_SYNTAX);
424+
}
425+
}
406426
try {
407427
return valueFactory.createIRI(uri);
408428
}

testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/nquads/AbstractNQuadsParserUnitTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ public void assertHandler(int expected) {
709709
public void testSupportedSettings()
710710
throws Exception
711711
{
712-
assertEquals(12, parser.getSupportedSettings().size());
712+
assertEquals(13, parser.getSupportedSettings().size());
713713
}
714714

715715
protected abstract RDFParser createRDFParser();

testsuites/rio/src/main/java/org/eclipse/rdf4j/rio/ntriples/AbstractNTriplesParserUnitTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ public void testBlankNodeIdentifiersRDF11()
380380
public void testSupportedSettings()
381381
throws Exception
382382
{
383-
assertEquals(12, createRDFParser().getSupportedSettings().size());
383+
assertEquals(13, createRDFParser().getSupportedSettings().size());
384384
}
385385

386386
@Test
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
<:_about> <http://purl.org/dc/terms/creator> <http://example.org/anna> .
2-
<:_anna> <http://xmlns.com/foaf/0.1/name> "Anna" .
1+
_:about <http://purl.org/dc/terms/creator> <http://example.org/anna> .
2+
_:anna <http://xmlns.com/foaf/0.1/name> "Anna" .
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
":_about" : {
2+
"_:about" : {
33
"http://purl.org/dc/terms/creator" : [ { "value" : "http://example.org/anna",
44
"type" : "uri" } ]
55
},
6-
":_anna" : {
6+
"_:anna" : {
77
"http://xmlns.com/foaf/0.1/name" : [ { "value" : "Anna",
88
"type" : "literal" } ]
99
}
10-
}
10+
}

0 commit comments

Comments
 (0)