From 1dfd824aa8b52a3dd257b4343267bd03987b5722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Tue, 4 Jun 2024 22:27:09 +0200 Subject: [PATCH] GH-5015 improvements to AbstractIRI and models --- .../eclipse/rdf4j/model/base/AbstractIRI.java | 16 +++++++++++++++- .../eclipse/rdf4j/model/impl/AbstractModel.java | 4 ++++ .../rdf4j/model/impl/LinkedHashModel.java | 7 +++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/core/model-api/src/main/java/org/eclipse/rdf4j/model/base/AbstractIRI.java b/core/model-api/src/main/java/org/eclipse/rdf4j/model/base/AbstractIRI.java index 47f16ce3143..ad3db23bc91 100644 --- a/core/model-api/src/main/java/org/eclipse/rdf4j/model/base/AbstractIRI.java +++ b/core/model-api/src/main/java/org/eclipse/rdf4j/model/base/AbstractIRI.java @@ -45,9 +45,23 @@ public boolean equals(Object o) { return false; } + private int cachedHashCode = 0; + @Override public int hashCode() { - return stringValue().hashCode(); + int cached = cachedHashCode; + if (cached == 0) { + synchronized (this) { + cached = cachedHashCode; + if (cached == 0) { + cached = stringValue().hashCode(); + cachedHashCode = cached; + } + } + cached = stringValue().hashCode(); + cachedHashCode = cached; + } + return cached; } @Override diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java index 3f596a82285..de93dacea11 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/AbstractModel.java @@ -31,6 +31,7 @@ public abstract class AbstractModel extends AbstractSet implements Model { private static final long serialVersionUID = 4254119331281455614L; + public static final Resource[] NULL_CONTEXT = { null }; @Override public Model unmodifiable() { @@ -179,6 +180,9 @@ public boolean remove(Object o) { public boolean contains(Object o) { if (o instanceof Statement) { Statement st = (Statement) o; + if (st.getContext() == null) { + return contains(st.getSubject(), st.getPredicate(), st.getObject(), NULL_CONTEXT); + } return contains(st.getSubject(), st.getPredicate(), st.getObject(), st.getContext()); } return false; diff --git a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModel.java b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModel.java index 3b2f05071fc..43cb01d7a01 100644 --- a/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModel.java +++ b/core/model/src/main/java/org/eclipse/rdf4j/model/impl/LinkedHashModel.java @@ -420,6 +420,13 @@ public boolean equals(Object other) { if (this == other) { return true; } + if (other == null) { + return false; + } + if (other == statement) { + return true; + } + if (!super.equals(other)) { return false; }