This is an automated email from the ASF dual-hosted git repository. bchapuis pushed a commit to branch sonar in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
commit ce1ba472eba0742166c97a389c0b634b1cca28f8 Author: Bertil Chapuis <[email protected]> AuthorDate: Wed Jun 12 23:07:58 2024 +0200 Improve visibility and isolation in pmtiles --- .../org/apache/baremaps/pmtiles/Compression.java | 2 +- .../java/org/apache/baremaps/pmtiles/Entry.java | 2 +- .../java/org/apache/baremaps/pmtiles/Header.java | 2 +- .../org/apache/baremaps/pmtiles/PMTilesReader.java | 8 +- .../pmtiles/{PMTiles.java => PMTilesUtils.java} | 36 ++++----- .../org/apache/baremaps/pmtiles/PMTilesWriter.java | 6 +- .../java/org/apache/baremaps/pmtiles/TileType.java | 2 +- .../{PMTilesTest.java => PMTilesUtilsTest.java} | 86 +++++++++++----------- 8 files changed, 72 insertions(+), 72 deletions(-) diff --git a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Compression.java b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Compression.java index f2891b27..9976367c 100644 --- a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Compression.java +++ b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Compression.java @@ -21,7 +21,7 @@ import java.io.*; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -enum Compression { +public enum Compression { UNKNOWN, NONE, GZIP, diff --git a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Entry.java b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Entry.java index 27823192..882b8697 100644 --- a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Entry.java +++ b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Entry.java @@ -17,7 +17,7 @@ package org.apache.baremaps.pmtiles; -class Entry { +public class Entry { private long tileId; private long offset; private long length; diff --git a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Header.java b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Header.java index 143934d1..2ad0b74d 100644 --- a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Header.java +++ b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/Header.java @@ -19,7 +19,7 @@ package org.apache.baremaps.pmtiles; import java.util.Objects; -class Header { +public class Header { private int specVersion; private long rootDirectoryOffset; diff --git a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesReader.java b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesReader.java index 55ff4c8d..27d8f91b 100644 --- a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesReader.java +++ b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesReader.java @@ -41,7 +41,7 @@ public class PMTilesReader { public Header getHeader() { if (header == null) { try (var inputStream = new LittleEndianDataInputStream(Files.newInputStream(path))) { - header = PMTiles.deserializeHeader(inputStream); + header = PMTilesUtils.deserializeHeader(inputStream); } catch (IOException e) { throw new RuntimeException(e); } @@ -66,7 +66,7 @@ public class PMTilesReader { } try (var decompressed = new LittleEndianDataInputStream(header.getInternalCompression().decompress(input))) { - return PMTiles.deserializeEntries(decompressed); + return PMTilesUtils.deserializeEntries(decompressed); } } catch (IOException e) { throw new RuntimeException(e); @@ -74,10 +74,10 @@ public class PMTilesReader { } public ByteBuffer getTile(int z, long x, long y) { - var tileId = PMTiles.zxyToTileId(z, x, y); + var tileId = PMTilesUtils.zxyToTileId(z, x, y); var header = getHeader(); var entries = getRootDirectory(); - var entry = PMTiles.findTile(entries, tileId); + var entry = PMTilesUtils.findTile(entries, tileId); if (entry == null) { return null; diff --git a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTiles.java b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesUtils.java similarity index 91% rename from baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTiles.java rename to baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesUtils.java index fa872e3c..26e51443 100644 --- a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTiles.java +++ b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesUtils.java @@ -27,13 +27,15 @@ import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; -public class PMTiles { +class PMTilesUtils { - public static long toNum(long low, long high) { + private static final int HEADER_SIZE_BYTES = 127; + + static long toNum(long low, long high) { return high * 0x100000000L + low; } - public static long readVarIntRemainder(InputStream input, long l) + static long readVarIntRemainder(InputStream input, long l) throws IOException { long h, b; b = input.read() & 0xff; @@ -69,7 +71,7 @@ public class PMTiles { throw new RuntimeException("Expected varint not more than 10 bytes"); } - public static int writeVarInt(OutputStream output, long value) + static int writeVarInt(OutputStream output, long value) throws IOException { int n = 1; while (value >= 0x80) { @@ -81,7 +83,7 @@ public class PMTiles { return n; } - public static long readVarInt(InputStream input) throws IOException { + static long readVarInt(InputStream input) throws IOException { long val, b; b = input.read() & 0xff; val = b & 0x7f; @@ -107,7 +109,7 @@ public class PMTiles { return readVarIntRemainder(input, val); } - public static void rotate(long n, long[] xy, long rx, long ry) { + static void rotate(long n, long[] xy, long rx, long ry) { if (ry == 0) { if (rx == 1) { xy[0] = n - 1 - xy[0]; @@ -119,7 +121,7 @@ public class PMTiles { } } - public static long[] idOnLevel(int z, long pos) { + static long[] idOnLevel(int z, long pos) { long n = LongMath.pow(2, z); long rx, ry, t = pos; long[] xy = new long[] {0, 0}; @@ -143,7 +145,7 @@ public class PMTiles { 93824992236885L, 375299968947541L, 1501199875790165L, }; - public static long zxyToTileId(int z, long x, long y) { + static long zxyToTileId(int z, long x, long y) { if (z > 26) { throw new RuntimeException("Tile zoom level exceeds max safe number limit (26)"); } @@ -167,7 +169,7 @@ public class PMTiles { return acc + d; } - public static long[] tileIdToZxy(long i) { + static long[] tileIdToZxy(long i) { long acc = 0; for (int z = 0; z < 27; z++) { long numTiles = (0x1L << z) * (0x1L << z); @@ -179,9 +181,7 @@ public class PMTiles { throw new RuntimeException("Tile zoom level exceeds max safe number limit (26)"); } - private static final int HEADER_SIZE_BYTES = 127; - - public static Header deserializeHeader(InputStream input) throws IOException { + static Header deserializeHeader(InputStream input) throws IOException { byte[] bytes = new byte[HEADER_SIZE_BYTES]; var num = input.read(bytes); if (num != HEADER_SIZE_BYTES) { @@ -217,7 +217,7 @@ public class PMTiles { (double) buffer.getInt() / 10000000); } - public static byte[] serializeHeader(Header header) { + static byte[] serializeHeader(Header header) { var buffer = ByteBuffer.allocate(HEADER_SIZE_BYTES).order(ByteOrder.LITTLE_ENDIAN); buffer.put((byte) 0x50); buffer.put((byte) 0x4D); @@ -255,7 +255,7 @@ public class PMTiles { return buffer.array(); } - public static void serializeEntries(OutputStream output, List<Entry> entries) + static void serializeEntries(OutputStream output, List<Entry> entries) throws IOException { var buffer = ByteBuffer.allocate(entries.size() * 48); writeVarInt(output, entries.size()); @@ -283,7 +283,7 @@ public class PMTiles { output.write(buffer.array(), 0, buffer.limit()); } - public static List<Entry> deserializeEntries(InputStream buffer) + static List<Entry> deserializeEntries(InputStream buffer) throws IOException { long numEntries = readVarInt(buffer); List<Entry> entries = new ArrayList<>((int) numEntries); @@ -315,7 +315,7 @@ public class PMTiles { return entries; } - public static Entry findTile(List<Entry> entries, long tileId) { + static Entry findTile(List<Entry> entries, long tileId) { int m = 0; int n = entries.size() - 1; while (m <= n) { @@ -342,7 +342,7 @@ public class PMTiles { return null; } - public static Directories buildRootLeaves(List<Entry> entries, int leafSize, + static Directories buildRootLeaves(List<Entry> entries, int leafSize, Compression compression) throws IOException { var rootEntries = new ArrayList<Entry>(); var numLeaves = 0; @@ -379,7 +379,7 @@ public class PMTiles { return new Directories(rootBytes, leavesBytes, numLeaves); } - public static Directories optimizeDirectories(List<Entry> entries, int targetRootLength, + static Directories optimizeDirectories(List<Entry> entries, int targetRootLength, Compression compression) throws IOException { if (entries.size() < 16384) { diff --git a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesWriter.java b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesWriter.java index a6e1e940..365ef4da 100644 --- a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesWriter.java +++ b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesWriter.java @@ -80,7 +80,7 @@ public class PMTilesWriter { public void setTile(int z, int x, int y, byte[] bytes) throws IOException { // Write the tile - var tileId = PMTiles.zxyToTileId(z, x, y); + var tileId = PMTilesUtils.zxyToTileId(z, x, y); var tileLength = bytes.length; Long tileHash = Hashing.farmHashFingerprint64().hashBytes(bytes).asLong(); @@ -155,7 +155,7 @@ public class PMTilesWriter { entries.sort(Comparator.comparingLong(Entry::getTileId)); } - var directories = PMTiles.optimizeDirectories(entries, 16247, compression); + var directories = PMTilesUtils.optimizeDirectories(entries, 16247, compression); byte[] metadataBytes; try (var metadataOutput = new ByteArrayOutputStream()) { @@ -204,7 +204,7 @@ public class PMTilesWriter { header.setCenterLon(centerLon); try (var output = new FileOutputStream(path.toFile())) { - output.write(PMTiles.serializeHeader(header)); + output.write(PMTilesUtils.serializeHeader(header)); output.write(directories.getRoot()); output.write(metadataBytes); output.write(directories.getLeaves()); diff --git a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/TileType.java b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/TileType.java index 001db982..6888470f 100644 --- a/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/TileType.java +++ b/baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/TileType.java @@ -17,7 +17,7 @@ package org.apache.baremaps.pmtiles; -enum TileType { +public enum TileType { UNKNOWN, MVT, PNG, diff --git a/baremaps-pmtiles/src/test/java/org/apache/baremaps/pmtiles/PMTilesTest.java b/baremaps-pmtiles/src/test/java/org/apache/baremaps/pmtiles/PMTilesUtilsTest.java similarity index 72% rename from baremaps-pmtiles/src/test/java/org/apache/baremaps/pmtiles/PMTilesTest.java rename to baremaps-pmtiles/src/test/java/org/apache/baremaps/pmtiles/PMTilesUtilsTest.java index 5bb38642..5a014625 100644 --- a/baremaps-pmtiles/src/test/java/org/apache/baremaps/pmtiles/PMTilesTest.java +++ b/baremaps-pmtiles/src/test/java/org/apache/baremaps/pmtiles/PMTilesUtilsTest.java @@ -32,7 +32,7 @@ import java.util.Random; import org.apache.baremaps.testing.TestFiles; import org.junit.jupiter.api.Test; -class PMTilesTest { +class PMTilesUtilsTest { @Test void decodeVarInt() throws IOException { @@ -41,53 +41,53 @@ class PMTilesTest { (byte) 127, (byte) 0xe5, (byte) 0x8e, (byte) 0x26 })); - assertEquals(PMTiles.readVarInt(b), 0); - assertEquals(PMTiles.readVarInt(b), 1); - assertEquals(PMTiles.readVarInt(b), 127); - assertEquals(PMTiles.readVarInt(b), 624485); + assertEquals(PMTilesUtils.readVarInt(b), 0); + assertEquals(PMTilesUtils.readVarInt(b), 1); + assertEquals(PMTilesUtils.readVarInt(b), 127); + assertEquals(PMTilesUtils.readVarInt(b), 624485); b = new LittleEndianDataInputStream(new ByteArrayInputStream(new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x0f, })); - assertEquals(PMTiles.readVarInt(b), 9007199254740991L); + assertEquals(PMTilesUtils.readVarInt(b), 9007199254740991L); } @Test void encodeVarInt() throws IOException { for (long i = 0; i < 1000; i++) { var array = new ByteArrayOutputStream(); - PMTiles.writeVarInt(array, i); + PMTilesUtils.writeVarInt(array, i); var input = new LittleEndianDataInputStream(new ByteArrayInputStream(array.toByteArray())); - assertEquals(i, PMTiles.readVarInt(input)); + assertEquals(i, PMTilesUtils.readVarInt(input)); } for (long i = Long.MAX_VALUE - 1000; i < Long.MAX_VALUE; i++) { var array = new ByteArrayOutputStream(); - PMTiles.writeVarInt(array, i); + PMTilesUtils.writeVarInt(array, i); var input = new LittleEndianDataInputStream(new ByteArrayInputStream(array.toByteArray())); - assertEquals(i, PMTiles.readVarInt(input)); + assertEquals(i, PMTilesUtils.readVarInt(input)); } } @Test void zxyToTileId() { - assertEquals(PMTiles.zxyToTileId(0, 0, 0), 0); - assertEquals(PMTiles.zxyToTileId(1, 0, 0), 1); - assertEquals(PMTiles.zxyToTileId(1, 0, 1), 2); - assertEquals(PMTiles.zxyToTileId(1, 1, 1), 3); - assertEquals(PMTiles.zxyToTileId(1, 1, 0), 4); - assertEquals(PMTiles.zxyToTileId(2, 0, 0), 5); + assertEquals(PMTilesUtils.zxyToTileId(0, 0, 0), 0); + assertEquals(PMTilesUtils.zxyToTileId(1, 0, 0), 1); + assertEquals(PMTilesUtils.zxyToTileId(1, 0, 1), 2); + assertEquals(PMTilesUtils.zxyToTileId(1, 1, 1), 3); + assertEquals(PMTilesUtils.zxyToTileId(1, 1, 0), 4); + assertEquals(PMTilesUtils.zxyToTileId(2, 0, 0), 5); } @Test void tileIdToZxy() { - assertArrayEquals(PMTiles.tileIdToZxy(0), new long[] {0, 0, 0}); - assertArrayEquals(PMTiles.tileIdToZxy(1), new long[] {1, 0, 0}); - assertArrayEquals(PMTiles.tileIdToZxy(2), new long[] {1, 0, 1}); - assertArrayEquals(PMTiles.tileIdToZxy(3), new long[] {1, 1, 1}); - assertArrayEquals(PMTiles.tileIdToZxy(4), new long[] {1, 1, 0}); - assertArrayEquals(PMTiles.tileIdToZxy(5), new long[] {2, 0, 0}); + assertArrayEquals(PMTilesUtils.tileIdToZxy(0), new long[] {0, 0, 0}); + assertArrayEquals(PMTilesUtils.tileIdToZxy(1), new long[] {1, 0, 0}); + assertArrayEquals(PMTilesUtils.tileIdToZxy(2), new long[] {1, 0, 1}); + assertArrayEquals(PMTilesUtils.tileIdToZxy(3), new long[] {1, 1, 1}); + assertArrayEquals(PMTilesUtils.tileIdToZxy(4), new long[] {1, 1, 0}); + assertArrayEquals(PMTilesUtils.tileIdToZxy(5), new long[] {2, 0, 0}); } @Test @@ -95,7 +95,7 @@ class PMTilesTest { for (int z = 0; z < 9; z++) { for (long x = 0; x < 1 << z; x++) { for (long y = 0; y < 1 << z; y++) { - var result = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, x, y)); + var result = PMTilesUtils.tileIdToZxy(PMTilesUtils.zxyToTileId(z, x, y)); if (result[0] != z || result[1] != x || result[2] != y) { fail("roundtrip failed"); } @@ -108,22 +108,22 @@ class PMTilesTest { void tileExtremes() { for (var z = 0; z < 27; z++) { var dim = LongMath.pow(2, z) - 1; - var tl = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, 0, 0)); + var tl = PMTilesUtils.tileIdToZxy(PMTilesUtils.zxyToTileId(z, 0, 0)); assertArrayEquals(new long[] {z, 0, 0}, tl); - var tr = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, dim, 0)); + var tr = PMTilesUtils.tileIdToZxy(PMTilesUtils.zxyToTileId(z, dim, 0)); assertArrayEquals(new long[] {z, dim, 0}, tr); - var bl = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, 0, dim)); + var bl = PMTilesUtils.tileIdToZxy(PMTilesUtils.zxyToTileId(z, 0, dim)); assertArrayEquals(new long[] {z, 0, dim}, bl); - var br = PMTiles.tileIdToZxy(PMTiles.zxyToTileId(z, dim, dim)); + var br = PMTilesUtils.tileIdToZxy(PMTilesUtils.zxyToTileId(z, dim, dim)); assertArrayEquals(new long[] {z, dim, dim}, br); } } @Test void invalidTiles() { - assertThrows(RuntimeException.class, () -> PMTiles.tileIdToZxy(9007199254740991L)); - assertThrows(RuntimeException.class, () -> PMTiles.zxyToTileId(27, 0, 0)); - assertThrows(RuntimeException.class, () -> PMTiles.zxyToTileId(0, 1, 1)); + assertThrows(RuntimeException.class, () -> PMTilesUtils.tileIdToZxy(9007199254740991L)); + assertThrows(RuntimeException.class, () -> PMTilesUtils.zxyToTileId(27, 0, 0)); + assertThrows(RuntimeException.class, () -> PMTilesUtils.zxyToTileId(0, 1, 1)); } @Test @@ -131,7 +131,7 @@ class PMTilesTest { var file = TestFiles.resolve("baremaps-testing/data/pmtiles/test_fixture_1.pmtiles"); try (var channel = FileChannel.open(file)) { var input = new LittleEndianDataInputStream(Channels.newInputStream(channel)); - var header = PMTiles.deserializeHeader(input); + var header = PMTilesUtils.deserializeHeader(input); assertEquals(header.getRootDirectoryOffset(), 127); assertEquals(header.getRootDirectoryLength(), 25); assertEquals(header.getJsonMetadataOffset(), 152); @@ -187,10 +187,10 @@ class PMTilesTest { 0); var array = new ByteArrayOutputStream(); - array.write(PMTiles.serializeHeader(header)); + array.write(PMTilesUtils.serializeHeader(header)); var input = new LittleEndianDataInputStream(new ByteArrayInputStream(array.toByteArray())); - var header2 = PMTiles.deserializeHeader(input); + var header2 = PMTilesUtils.deserializeHeader(input); assertEquals(header, header2); } @@ -198,7 +198,7 @@ class PMTilesTest { @Test void searchForMissingEntry() { var entries = new ArrayList<Entry>(); - assertEquals(PMTiles.findTile(entries, 101), null); + assertEquals(PMTilesUtils.findTile(entries, 101), null); } @Test @@ -206,7 +206,7 @@ class PMTilesTest { var entry = new Entry(100, 1, 1, 1); var entries = new ArrayList<Entry>(); entries.add(entry); - assertEquals(PMTiles.findTile(entries, 100), entry); + assertEquals(PMTilesUtils.findTile(entries, 100), entry); } @Test @@ -215,21 +215,21 @@ class PMTilesTest { var entries = new ArrayList<Entry>(); entries.add(entry); entries.add(new Entry(5, 5, 1, 2)); - assertEquals(PMTiles.findTile(entries, 4), entry); + assertEquals(PMTilesUtils.findTile(entries, 4), entry); } @Test void searchWithMultipleTileEntries() { var entries = new ArrayList<Entry>(); entries.add(new Entry(100, 1, 1, 2)); - var entry = PMTiles.findTile(entries, 101); + var entry = PMTilesUtils.findTile(entries, 101); assertEquals(entry.getOffset(), 1); assertEquals(entry.getLength(), 1); entries = new ArrayList<Entry>(); entries.add(new Entry(100, 1, 1, 1)); entries.add(new Entry(150, 2, 2, 2)); - entry = PMTiles.findTile(entries, 151); + entry = PMTilesUtils.findTile(entries, 151); assertEquals(entry.getOffset(), 2); assertEquals(entry.getLength(), 2); @@ -237,7 +237,7 @@ class PMTilesTest { entries.add(new Entry(50, 1, 1, 2)); entries.add(new Entry(100, 2, 2, 1)); entries.add(new Entry(150, 3, 3, 1)); - entry = PMTiles.findTile(entries, 51); + entry = PMTilesUtils.findTile(entries, 51); assertEquals(entry.getOffset(), 1); assertEquals(entry.getLength(), 1); } @@ -246,7 +246,7 @@ class PMTilesTest { void leafSearch() { var entries = new ArrayList<Entry>(); entries.add(new Entry(100, 1, 1, 0)); - var entry = PMTiles.findTile(entries, 150); + var entry = PMTilesUtils.findTile(entries, 150); assertEquals(entry.getOffset(), 1); assertEquals(entry.getLength(), 1); } @@ -254,7 +254,7 @@ class PMTilesTest { @Test void buildRootLeaves() throws IOException { var entries = List.of(new Entry(100, 1, 1, 0)); - var directories = PMTiles.buildRootLeaves(entries, 1, Compression.NONE); + var directories = PMTilesUtils.buildRootLeaves(entries, 1, Compression.NONE); assertEquals(directories.getNumLeaves(), 1); } @@ -264,7 +264,7 @@ class PMTilesTest { var random = new Random(3857); var entries = new ArrayList<Entry>(); entries.add(new Entry(0, 0, 100, 1)); - var directories = PMTiles.optimizeDirectories(entries, 100, Compression.NONE); + var directories = PMTilesUtils.optimizeDirectories(entries, 100, Compression.NONE); assertFalse(directories.getLeaves().length > 0); assertEquals(0, directories.getNumLeaves()); @@ -275,7 +275,7 @@ class PMTilesTest { entries.add(new Entry(i, offset, randTileSize, 1)); offset += randTileSize; } - directories = PMTiles.optimizeDirectories(entries, 1024, Compression.NONE); + directories = PMTilesUtils.optimizeDirectories(entries, 1024, Compression.NONE); assertFalse(directories.getRoot().length > 1024); assertFalse(directories.getNumLeaves() == 0); assertFalse(directories.getLeaves().length == 0);
