This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-rdf.git
commit 8dae5fca7787d76e5f3b380c7fbbd8920dce616c Author: Gary D. Gregory <garydgreg...@gmail.com> AuthorDate: Sat May 17 09:13:33 2025 -0400 Better caching for hashCode() and equals() implementation - W3CRDFSyntax and RDFSyntax make multiple media type and file extensions first class citizens - The experimental package is not tested in this module, adjust the jacoco coverage request - Add some missing assertions to some tests --- commons-rdf-api/pom.xml | 4 +- .../org/apache/commons/rdf/api/W3CRDFSyntax.java | 80 +++++++++++----------- .../commons/rdf/api/AbstractDatasetTest.java | 2 + .../org/apache/commons/rdf/api/RDFSyntaxTest.java | 10 ++- 4 files changed, 54 insertions(+), 42 deletions(-) diff --git a/commons-rdf-api/pom.xml b/commons-rdf-api/pom.xml index 852a5db3..5b799d34 100644 --- a/commons-rdf-api/pom.xml +++ b/commons-rdf-api/pom.xml @@ -36,7 +36,7 @@ <!-- project.build.outputTimestamp is managed by Maven plugins, see https://maven.apache.org/guides/mini/guide-reproducible-builds.html --> <project.build.outputTimestamp>2024-02-01T03:27:02Z</project.build.outputTimestamp> <!-- JaCoCo: Don't make code coverage worse than: --> - <commons.jacoco.classRatio>0.90</commons.jacoco.classRatio> + <commons.jacoco.classRatio>0.88</commons.jacoco.classRatio> <commons.jacoco.instructionRatio>0.79</commons.jacoco.instructionRatio> <commons.jacoco.methodRatio>0.77</commons.jacoco.methodRatio> <commons.jacoco.branchRatio>0.30</commons.jacoco.branchRatio> @@ -58,7 +58,7 @@ <executions> <execution> <id>test-jar</id> - <!-- Also expose abstract test classes --> + <!-- Also expose abstract test classes --> <goals> <goal>test-jar</goal> </goals> diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java index 23180d94..05dddba0 100644 --- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/W3CRDFSyntax.java @@ -22,7 +22,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Locale; +import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * W3C RDF 1.1 serialization syntax. @@ -46,10 +49,10 @@ class W3CRDFSyntax implements RDFSyntax { private static final class FormatIRI implements IRI { private static final String BASE = "http://www.w3.org/ns/formats/"; - private final String format; + private final String iriString; private FormatIRI(final String format) { - this.format = format; + this.iriString = BASE + Objects.requireNonNull(format, "format"); } @Override @@ -66,7 +69,7 @@ class W3CRDFSyntax implements RDFSyntax { @Override public String getIRIString() { - return BASE + format; + return iriString; } @Override @@ -93,59 +96,48 @@ class W3CRDFSyntax implements RDFSyntax { static final RDFSyntax RDFXML; static final RDFSyntax TRIG; static final Set<RDFSyntax> SYNTAXES; - static { // Initialize within static block to avoid inserting nulls - JSONLD = new W3CRDFSyntax("JSON-LD", "JSON-LD 1.0", "application/ld+json", ".jsonld", true); - TURTLE = new W3CRDFSyntax("Turtle", "RDF 1.1 Turtle", "text/turtle", ".ttl", false); - NQUADS = new W3CRDFSyntax("N-Quads", "RDF 1.1 N-Quads", "application/n-quads", ".nq", true); - NTRIPLES = new W3CRDFSyntax("N-Triples", "RDF 1.1 N-Triples", "application/n-triples", ".nt", false); - RDFXML = new W3CRDFSyntax("RDF_XML", "RDF 1.1 XML Syntax", "application/rdf+xml", ".rdf", false); - TRIG = new W3CRDFSyntax("TriG", "RDF 1.1 TriG", "application/trig", ".trig", true); - RDFA = new W3CRDFSyntax("RDFa", "HTML+RDFa 1.1", "text/html", ".html", false) { - - private final Set<String> types = Collections.unmodifiableSet(new LinkedHashSet<>(Arrays.asList("text/html", "application/xhtml+xml"))); - private final Set<String> extensions = Collections.unmodifiableSet(new LinkedHashSet<>(Arrays.asList(".html", ".xhtml"))); - - @Override - public Set<String> fileExtensions() { - return extensions; - } - - @Override - public Set<String> mediaTypes() { - return types; - } - }; + JSONLD = new W3CRDFSyntax("JSON-LD", "JSON-LD 1.0", "application/ld+json", true, ".jsonld"); + TURTLE = new W3CRDFSyntax("Turtle", "RDF 1.1 Turtle", "text/turtle", false, ".ttl"); + NQUADS = new W3CRDFSyntax("N-Quads", "RDF 1.1 N-Quads", "application/n-quads", true, ".nq"); + NTRIPLES = new W3CRDFSyntax("N-Triples", "RDF 1.1 N-Triples", "application/n-triples", false, ".nt"); + RDFXML = new W3CRDFSyntax("RDF_XML", "RDF 1.1 XML Syntax", "application/rdf+xml", false, ".rdf"); + TRIG = new W3CRDFSyntax("TriG", "RDF 1.1 TriG", "application/trig", true, ".trig"); + RDFA = new W3CRDFSyntax("RDFa", "HTML+RDFa 1.1", new LinkedHashSet<>(Arrays.asList("text/html", "application/xhtml+xml")), false, ".html", ".xhtml"); SYNTAXES = Collections.unmodifiableSet(new LinkedHashSet<>(Arrays.asList(JSONLD, NQUADS, NTRIPLES, RDFA, RDFXML, TRIG, TURTLE))); } - private final String title; - private final String mediaType; - private final String fileExtension; + private final LinkedHashSet<String> mediaTypes; + private final LinkedHashSet<String> fileExtensions; private final boolean supportsDataset; private final String name; private final IRI iri; - private W3CRDFSyntax(final String name, final String title, final String mediaType, final String fileExtension, final boolean supportsDataset) { + private W3CRDFSyntax(final String name, final String title, final LinkedHashSet<String> mediaTypes, final boolean supportsDataset, + final String... fileExtension) { this.name = name; this.title = title; - this.mediaType = mediaType.toLowerCase(Locale.ROOT); - this.fileExtension = fileExtension.toLowerCase(Locale.ROOT); + this.mediaTypes = mediaTypes.stream().map(s -> s.toLowerCase(Locale.ROOT)).collect(Collectors.toCollection(LinkedHashSet::new)); + this.fileExtensions = Stream.of(fileExtension).map(s -> s.toLowerCase(Locale.ROOT)).collect(Collectors.toCollection(LinkedHashSet::new)); this.supportsDataset = supportsDataset; this.iri = new FormatIRI(name); } + private W3CRDFSyntax(final String name, final String title, final String mediaType, final boolean supportsDataset, final String... fileExtension) { + this(name, title, new LinkedHashSet<>(Arrays.asList(mediaType)), supportsDataset, fileExtension); + } + @Override - public boolean equals(final Object obj) { - if (obj == this) { + public boolean equals(Object obj) { + if (this == obj) { return true; } - if (!(obj instanceof RDFSyntax)) { + if (!(obj instanceof W3CRDFSyntax)) { return false; } - final RDFSyntax other = (RDFSyntax) obj; - return mediaType.equals(other.mediaType().toLowerCase(Locale.ROOT)); + W3CRDFSyntax other = (W3CRDFSyntax) obj; + return Objects.equals(mediaTypes, other.mediaTypes); } /** @@ -156,12 +148,17 @@ class W3CRDFSyntax implements RDFSyntax { */ @Override public String fileExtension() { - return fileExtension; + return fileExtensions.iterator().next(); + } + + @Override + public Set<String> fileExtensions() { + return fileExtensions; } @Override public int hashCode() { - return mediaType.hashCode(); + return Objects.hash(mediaTypes); } @Override @@ -177,7 +174,12 @@ class W3CRDFSyntax implements RDFSyntax { */ @Override public String mediaType() { - return mediaType; + return mediaTypes.iterator().next(); + } + + @Override + public Set<String> mediaTypes() { + return mediaTypes; } @Override diff --git a/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java b/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java index d7ecf3f2..0c031edd 100644 --- a/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java +++ b/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java @@ -433,6 +433,7 @@ public abstract class AbstractDatasetTest { try (final Graph defaultGraph = dataset.getGraph()) { // TODO: Can we assume the default graph was empty before our new triples? assertEquals(2, defaultGraph.size()); + assertFalse(defaultGraph.isEmpty()); assertTrue(defaultGraph.contains(alice, isPrimaryTopicOf, graph1)); // NOTE: graph2 is a BlankNode assertTrue(defaultGraph.contains(bob, isPrimaryTopicOf, null)); @@ -560,6 +561,7 @@ public abstract class AbstractDatasetTest { for (final Quad t : dataset.iterate()) { quads.add(t); } + assertFalse(dataset.isEmpty()); assertEquals(dataset.size(), quads.size()); //assertTrue(quads.contains(bobNameQuad)); diff --git a/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/RDFSyntaxTest.java b/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/RDFSyntaxTest.java index a5342134..92b699e1 100644 --- a/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/RDFSyntaxTest.java +++ b/commons-rdf-api/src/test/java/org/apache/commons/rdf/api/RDFSyntaxTest.java @@ -104,7 +104,7 @@ public class RDFSyntaxTest { @CartesianTest @CartesianTest.MethodFactory("providerRDFSyntax") - void testEqualsAndHashCode(final RDFSyntax left, final RDFSyntax right) { + public void testEqualsAndHashCode(final RDFSyntax left, final RDFSyntax right) { assertNotNull(left); assertNotNull(right); assertEquals(left, left); @@ -112,15 +112,23 @@ public class RDFSyntaxTest { if (left == right) { assertEquals(left, right); assertEquals(left.hashCode(), right.hashCode()); + assertEquals(left.iri(), right.iri()); + assertEquals(left.iri().hashCode(), right.iri().hashCode()); } else { assertNotEquals(left, right); assertNotEquals(left.hashCode(), right.hashCode()); + assertNotEquals(left.iri(), right.iri()); + assertNotEquals(left.iri().hashCode(), right.iri().hashCode()); } assertFalse(left.equals(null)); assertFalse(right.equals(null)); + assertFalse(left.iri().equals(null)); + assertFalse(right.iri().equals(null)); final Object notAnInstance = "a"; assertFalse(left.equals(notAnInstance)); assertFalse(right.equals(notAnInstance)); + assertFalse(left.iri().equals(notAnInstance)); + assertFalse(right.iri().equals(notAnInstance)); } @Test