From efede371cc5a039e934e82c7eeab56f2f61d14cf Mon Sep 17 00:00:00 2001
From: Eric Duminil <eric.duminil@gmail.com>
Date: Thu, 29 Sep 2022 11:02:43 +0200
Subject: [PATCH] Write CityGml in buffer, not as a whole string.

---
 .../simstadt/regionchooser/RegionChooserBrowser.java | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/main/java/eu/simstadt/regionchooser/RegionChooserBrowser.java b/src/main/java/eu/simstadt/regionchooser/RegionChooserBrowser.java
index 92bf767..2089403 100644
--- a/src/main/java/eu/simstadt/regionchooser/RegionChooserBrowser.java
+++ b/src/main/java/eu/simstadt/regionchooser/RegionChooserBrowser.java
@@ -10,7 +10,6 @@
 import java.util.prefs.Preferences;
 import org.locationtech.jts.io.ParseException;
 import com.ximpleware.NavException;
-import com.ximpleware.XPathEvalException;
 import com.ximpleware.XPathParseException;
 import eu.simstadt.regionchooser.fast_xml_parser.ConvexHullCalculator;
 import javafx.application.Platform;
@@ -30,6 +29,7 @@
 public class RegionChooserBrowser extends Region
 {
 	private static final Logger LOGGER = Logger.getLogger(RegionChooserBrowser.class.getName());
+	private static final int BUFFER = 1024;
 
 	/**
 	 * JavaFX Backend for RegionChooser. Inside simstadt_openlayers.js frontend, this class is available as `fxapp`.
@@ -70,15 +70,19 @@ public Void call() throws IOException {
 		}
 
 		public void downloadRegionFromCityGML(String wktPolygon, String project, String citygml, String srsName)
-				throws IOException, ParseException, XPathParseException, NavException, XPathEvalException {
+				throws IOException, ParseException, XPathParseException, NavException {
 			StringBuilder sb = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, srsName,
 					citygmlPath(project, citygml));
 
 			File buildingIdsFile = selectSaveFileWithDialog(project, citygml, "selected_region");
 			if (buildingIdsFile != null) {
 				try (BufferedWriter writer = Files.newBufferedWriter(buildingIdsFile.toPath())) {
-					//NOTE: isn't there a better way??
-					writer.write(sb.toString());
+					char[] chars = new char[BUFFER];
+					for (int aPosStart = 0; aPosStart < sb.length(); aPosStart += BUFFER) {
+						int chunk = Math.min(BUFFER, sb.length() - aPosStart);
+						sb.getChars(aPosStart, aPosStart + chunk, chars, 0);
+						writer.write(chars, 0, chunk);
+					}
 				}
 			}
 		}
-- 
GitLab