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 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 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 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 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 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 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 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}