diff --git a/jena-geosparql/pom.xml b/jena-geosparql/pom.xml
index 1367f63de8a..4b1bdee716a 100644
--- a/jena-geosparql/pom.xml
+++ b/jena-geosparql/pom.xml
@@ -65,8 +65,8 @@
- com.esotericsoftware
- kryo-shaded
+ com.esotericsoftware.kryo
+ kryo5
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/EnvelopeSerializer.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/EnvelopeSerializer.java
index eaeec35e144..c3bdc571faf 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/EnvelopeSerializer.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/EnvelopeSerializer.java
@@ -20,10 +20,10 @@
import org.locationtech.jts.geom.Envelope;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
public class EnvelopeSerializer extends Serializer {
@Override
@@ -35,7 +35,7 @@ public void write(Kryo kryo, Output output, Envelope envelope) {
}
@Override
- public Envelope read(Kryo kryo, Input input, Class type) {
+ public Envelope read(Kryo kryo, Input input, Class extends Envelope> type) {
double xMin = input.readDouble();
double xMax = input.readDouble();
double yMin = input.readDouble();
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/GeometrySerializerJtsWkb.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/GeometrySerializerJtsWkb.java
index 00d66ae7bae..bc5b0dccc36 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/GeometrySerializerJtsWkb.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/GeometrySerializerJtsWkb.java
@@ -23,10 +23,10 @@
import org.locationtech.jts.io.WKBReader;
import org.locationtech.jts.io.WKBWriter;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
/** Geometry de-/serialization via the WKB facilities of JTS. */
public class GeometrySerializerJtsWkb
@@ -57,7 +57,7 @@ public void write(Kryo kryo, Output output, Geometry geometry) {
}
@Override
- public Geometry read(Kryo kryo, Input input, Class type) {
+ public Geometry read(Kryo kryo, Input input, Class extends Geometry> type) {
byte[] bytes = kryo.readObject(input, byte[].class);
Geometry geometry;
try {
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/NodeSerializer.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/NodeSerializer.java
index 74f950d73eb..db3b8bfffbf 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/NodeSerializer.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/NodeSerializer.java
@@ -43,10 +43,10 @@
import org.apache.jena.vocabulary.RDFS;
import org.apache.jena.vocabulary.XSD;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
/**
* An RDF 1.2 node serializer for kryo.
@@ -262,7 +262,7 @@ public void write(Kryo kryo, Output output, Node node) {
}
@Override
- public Node read(Kryo kryo, Input input, Class cls) {
+ public Node read(Kryo kryo, Input input, Class extends Node> cls) {
Node result;
String v1, v2;
Triple t;
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/TripleSerializer.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/TripleSerializer.java
index d4582211d86..860514aa45f 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/TripleSerializer.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/kryo/TripleSerializer.java
@@ -20,10 +20,10 @@
import org.apache.jena.graph.Node;
import org.apache.jena.graph.Triple;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
/** Kryo serializer for {@link Triple}. Depends on registered {@link Node} serializers. */
public class TripleSerializer extends Serializer {
@@ -35,7 +35,7 @@ public void write(Kryo kryo, Output output, Triple obj) {
}
@Override
- public Triple read(Kryo kryo, Input input, Class objClass) {
+ public Triple read(Kryo kryo, Input input, Class extends Triple> objClass) {
Node s = (Node)kryo.readClassAndObject(input);
Node p = (Node)kryo.readClassAndObject(input);
Node o = (Node)kryo.readClassAndObject(input);
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/KryoRegistratorSpatialIndexV2.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/KryoRegistratorSpatialIndexV2.java
index a11738f4afb..77d82d0ade1 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/KryoRegistratorSpatialIndexV2.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/KryoRegistratorSpatialIndexV2.java
@@ -20,6 +20,7 @@
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.jena.geosparql.kryo.EnvelopeSerializer;
import org.apache.jena.geosparql.kryo.NodeSerializer;
@@ -40,9 +41,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.serializers.MapSerializer;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.serializers.MapSerializer;
/**
* The class is used to configure the kryo serialization
@@ -58,10 +59,10 @@ public static void registerClasses(Kryo kryo, Serializer geometrySeria
LOGGER.debug("Registering kryo serializers for spatial index v2.");
// Java
- Serializer> mapSerializer = new MapSerializer();
+ Serializer> mapSerializer = new MapSerializer<>();
kryo.register(Map.class, mapSerializer);
kryo.register(HashMap.class, mapSerializer);
- kryo.register(LinkedHashMap.class, mapSerializer);
+ kryo.register(ConcurrentHashMap.class, mapSerializer);
// Jena
NodeSerializer.register(kryo);
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreePerGraphSerializer.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreePerGraphSerializer.java
index 38ba56c7ee7..db7840f0c20 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreePerGraphSerializer.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreePerGraphSerializer.java
@@ -22,10 +22,10 @@
import org.apache.jena.graph.Node;
import org.locationtech.jts.index.strtree.STRtree;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
public class STRtreePerGraphSerializer
extends Serializer
@@ -37,7 +37,7 @@ public void write(Kryo kryo, Output output, STRtreePerGraph index) {
}
@Override
- public STRtreePerGraph read(Kryo kryo, Input input, Class type) {
+ public STRtreePerGraph read(Kryo kryo, Input input, Class extends STRtreePerGraph> type) {
boolean isBuilt = input.readBoolean();
@SuppressWarnings("unchecked")
Map treeMap = (Map)kryo.readClassAndObject(input);
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreeUtils.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreeUtils.java
index 15e40b27543..73fed97511b 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreeUtils.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/STRtreeUtils.java
@@ -22,6 +22,7 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.atlas.iterator.IteratorCloseable;
@@ -54,7 +55,7 @@ public static STRtree buildSpatialIndexTree(Graph graph, String srsURI) throws S
// XXX This method overlaps function-wise with SpatialIndexerComputation. Consolidate?
public static STRtreePerGraph buildSpatialIndexTree(DatasetGraph datasetGraph, String srsURI) throws SpatialIndexException {
- Map treeMap = new LinkedHashMap<>();
+ Map treeMap = new ConcurrentHashMap<>();
// Process default graph.
// LOGGER.info("building spatial index for default graph ...");
diff --git a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/SpatialIndexIoKryo.java b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/SpatialIndexIoKryo.java
index 834c1cc8a6d..b2190d7a8a4 100644
--- a/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/SpatialIndexIoKryo.java
+++ b/jena-geosparql/src/main/java/org/apache/jena/geosparql/spatial/index/v2/SpatialIndexIoKryo.java
@@ -24,6 +24,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Objects;
+import java.util.Set;
import org.apache.jena.atlas.RuntimeIOException;
import org.apache.jena.atlas.io.IOX;
@@ -37,10 +38,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
@@ -51,6 +52,12 @@ public class SpatialIndexIoKryo {
// The current version of the index only stores the envelopes so this feature is not needed.
private static boolean enableGeometrySerde = false;
+ /** Kryo4-based serialization is now obsolete. */
+ private static final Set OBSOLETE_VERSIONS = Set.of("2.0.0");
+
+ /** The version of the index that is created by this class. */
+ public static final String VERSION = "3.0.0";
+
public static SpatialIndex loadOrBuildSpatialIndex(Dataset dataset, Path spatialIndexFile) throws SpatialIndexException {
SpatialIndex spatialIndex = loadOrBuildSpatialIndex(dataset, null, spatialIndexFile);
return spatialIndex;
@@ -149,7 +156,7 @@ public static final void save(Path spatialIndexFile, SpatialIndexPerGraph index)
public static void writeToOutputStream(OutputStream os, SpatialIndexPerGraph index) {
SpatialIndexHeader header = new SpatialIndexHeader();
header.setType(SpatialIndexHeader.TYPE_VALUE);
- header.setVersion("2.0.0");
+ header.setVersion(VERSION);
header.setSrsUri(index.getSrsInfo().getSrsURI());
GeometrySerializerJtsWkb geometrySerializer = null;
@@ -207,8 +214,12 @@ public static final SpatialIndexPerGraph load(Path spatialIndexFile) throws Spat
}
String version = header.getVersion();
- if (!"2.0.0".equals(version)) {
- throw new SpatialIndexException("The version of the spatial index does not match the version of this loader class.");
+ if (!VERSION.equals(version)) {
+ if (OBSOLETE_VERSIONS.contains(version)) {
+ throw new SpatialIndexException("Spatial index version " + version + " is no longer supported. Move or delete this file to allow for creation of a new index in its place: " + spatialIndexFile);
+ } else {
+ throw new SpatialIndexException("Spatial index version " + version + " is not supported (expected version: " + VERSION + "). Offending file: " + spatialIndexFile);
+ }
}
srsUri = header.getSrsUri();
diff --git a/jena-geosparql/src/main/java/org/locationtech/jts/index/strtree/STRtreeSerializer.java b/jena-geosparql/src/main/java/org/locationtech/jts/index/strtree/STRtreeSerializer.java
index 127a2f8e9c6..121568b7380 100644
--- a/jena-geosparql/src/main/java/org/locationtech/jts/index/strtree/STRtreeSerializer.java
+++ b/jena-geosparql/src/main/java/org/locationtech/jts/index/strtree/STRtreeSerializer.java
@@ -23,10 +23,10 @@
import org.locationtech.jts.geom.Envelope;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
/*
* This file is an adapted copy of org.locationtech.jts.index.strtree.IndexSerde from
@@ -53,7 +53,7 @@ public class STRtreeSerializer
extends Serializer
{
@Override
- public STRtree read(Kryo kryo, Input input, Class type) {
+ public STRtree read(Kryo kryo, Input input, Class extends STRtree> type) {
int nodeCapacity = input.readInt();
boolean notEmpty = (input.readByte() & 0x01) == 1;
if (notEmpty) {
diff --git a/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/SimpleGraphSerializer.java b/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/SimpleGraphSerializer.java
index 8235ad30203..7addfc5df1b 100644
--- a/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/SimpleGraphSerializer.java
+++ b/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/SimpleGraphSerializer.java
@@ -22,10 +22,10 @@
import org.apache.jena.sparql.graph.GraphFactory;
import org.apache.jena.util.iterator.ExtendedIterator;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
/** Only used for testing Node_Graph serialization. */
public class SimpleGraphSerializer
@@ -43,7 +43,7 @@ public void write(Kryo kryo, Output output, Graph graph) {
}
@Override
- public Graph read(Kryo kryo, Input input, Class type) {
+ public Graph read(Kryo kryo, Input input, Class extends Graph> type) {
Graph result = GraphFactory.createDefaultGraph();
for (;;) {
Triple t = kryo.readObjectOrNull(input, Triple.class);
diff --git a/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/TestNodeSerializer.java b/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/TestNodeSerializer.java
index 69b546540ce..eacf583c684 100644
--- a/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/TestNodeSerializer.java
+++ b/jena-geosparql/src/test/java/org/apache/jena/geosparql/spatial/index/v2/TestNodeSerializer.java
@@ -37,10 +37,10 @@
import org.junit.Assert;
import org.junit.Test;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.kryo5.Kryo;
+import com.esotericsoftware.kryo.kryo5.Serializer;
+import com.esotericsoftware.kryo.kryo5.io.Input;
+import com.esotericsoftware.kryo.kryo5.io.Output;
public class TestNodeSerializer {
diff --git a/pom.xml b/pom.xml
index 28b3a649353..b1188de5868 100644
--- a/pom.xml
+++ b/pom.xml
@@ -113,7 +113,7 @@
1.37
- 4.0.3
+ 5.6.2
2.3.1
4.0.4
1.82
@@ -749,8 +749,8 @@
- com.esotericsoftware
- kryo-shaded
+ com.esotericsoftware.kryo
+ kryo5
${ver.kryo}