From cc835fd7e1c95c9ca23b404c69bf1cd9d09163b6 Mon Sep 17 00:00:00 2001
From: Eric Duminil <eric.duminil@gmail.com>
Date: Wed, 12 Oct 2022 10:05:33 +0200
Subject: [PATCH] Take size into account for cached hull

---
 .../fast_xml_parser/ConvexHullCalculator.java       | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/ConvexHullCalculator.java b/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/ConvexHullCalculator.java
index 4e9e6b9..850bf38 100644
--- a/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/ConvexHullCalculator.java
+++ b/src/main/java/eu/simstadt/regionchooser/fast_xml_parser/ConvexHullCalculator.java
@@ -25,6 +25,10 @@
 {
 	private static final Logger LOGGER = Logger.getLogger(ConvexHullCalculator.class.getName());
 
+	private ConvexHullCalculator() {
+		throw new IllegalStateException("Utility class");
+	}
+
 	/**
 	 * Relatively fast method to extract a convex hull in WGS84 for any Citygml file for which CRS is known and whose
 	 * size is less than 2GB (VTD XML limitation). It iterates over every building, gets the bounding box as 4
@@ -92,7 +96,6 @@ public static void extractHullsForEveryCityGML(Path repository, Consumer<String>
 					try {
 						Path kmlPath = getHullPath(repository, gmlPath);
 						if (Files.exists(kmlPath)) {
-							//TODO: Check if size is the same as original. Recreate otherwise.
 							LOGGER.fine("Using cache from " + repository.relativize(kmlPath));
 							return new String(Files.readAllBytes(kmlPath), StandardCharsets.UTF_8);
 						} else {
@@ -101,8 +104,8 @@ public static void extractHullsForEveryCityGML(Path repository, Consumer<String>
 						}
 					} catch (IOException ex) {
 						ex.printStackTrace();
+						return null;
 					}
-					return null;
 				})
 				.filter(Objects::nonNull)
 				.forEach(hullKML -> {
@@ -190,6 +193,9 @@ public static String calculateConvexHullPlacemark(Path gmlPath, Path kmlPath, bo
 	 * folder and hides it. The '.cache' folder isn't specific to the project: every kml cache file is written inside the
 	 * same repository '.cache' folder.
 	 *
+	 * The original CityGML filesize is written in KML basename, in order to update the hull if the CityGML file is
+	 * modified, e.g. LoD2_564_5512_2_BY_11946489.kml
+	 *
 	 * @param repository
 	 * @param citygmlPath
 	 *
@@ -197,7 +203,8 @@ public static String calculateConvexHullPlacemark(Path gmlPath, Path kmlPath, bo
 	 * @throws IOException
 	 */
 	private static Path getHullPath(Path repository, Path citygmlPath) throws IOException {
-		String kmlFilename = citygmlPath.getFileName().toString().replaceAll("(?i)\\.gml$", ".kml");
+		String kmlFilename = citygmlPath.getFileName().toString().replaceAll("(?i)\\.gml$",
+				"_" + Files.size(citygmlPath) + ".kml");
 		Path cacheFolder = repository.resolve(".cache/");
 		Path hullsFolder = cacheFolder.resolve("hulls/");
 		Files.createDirectories(hullsFolder);
-- 
GitLab