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

Reply via email to