diff --git a/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java b/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java index c3d88e2f23680b91dd08cf7093c5d1921da7d5ea..5bee332f1ff943ab071e3a6fc45bc0c1439831b3 100644 --- a/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java +++ b/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java @@ -1,6 +1,7 @@ package eu.simstadt.regionchooser; import java.io.BufferedWriter; +import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -102,11 +103,21 @@ public Integer call() throws Exception { logInfo("WKT Polygon expressed in local coordinates: " + wktPolygon); - try (BufferedWriter gmlWriter = Files.newBufferedWriter(outputCityGML)) { - int count = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, localCRS.toString(), gmlWriter, citygmls); - logInfo("Found buildings : " + count); + int count; + + if (outputCityGML.toString().equals("-")) { + logInfo("CityGML written to stdout."); + PrintWriter stdOut = spec.commandLine().getOut(); + count = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, localCRS.toString(), stdOut, citygmls); + } else { + try (BufferedWriter gmlWriter = Files.newBufferedWriter(outputCityGML)) { + count = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, localCRS.toString(), gmlWriter, + citygmls); + } } + logInfo("Found buildings : " + count); + return 0; } diff --git a/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java b/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java index 415eec46b031c1036cb7d575898e65fa85e98023..81722644717bcc3dfa219cb0cc1024019e849f10 100644 --- a/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java +++ b/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java @@ -109,6 +109,24 @@ void testExtractRegionWithStandardInput() throws IOException { assertEquals(2, countBuildings(outGML)); } + @Test + void testExtractRegionWithStandardInputAndStandardOutput() throws IOException { + String wktPolygon = "POLYGON((-73.99325421344473 40.730897087489666, -73.99359753619864 40.7304702545556, -73.99287870418264 40.7300800049056, -73.99244955074026 40.730592207101864, -73.99325421344473 40.730897087489666))"; + Path citygml = TEST_REPOSITORY.resolve("NewYork.proj/ManhattanSmall.gml"); + InputStream stdin = new ByteArrayInputStream(wktPolygon.getBytes(StandardCharsets.UTF_8)); + System.setIn(stdin); + Path noOutput = Paths.get("-"); + Files.deleteIfExists(noOutput); + assertFalse(Files.exists(noOutput)); + new CommandLine(new RegionChooserCLI()).execute("--input=" + citygml, "--output=-", "--wkt=-"); + String expectedLog = "EPSG:32118"; + assertTrue(err.toString().contains(expectedLog), err.toString() + " should contain " + expectedLog); + String expectedBuilding = "uuid_0547df65-ae80-459e-bb15-c839c1a2e566"; + assertTrue(out.toString().contains(expectedBuilding), out.toString() + " should contain " + expectedBuilding); + //TODO: Check if footer is here too + assertFalse(Files.exists(noOutput)); + } + @Test void testExtractRegionWithMissingInput() throws IOException { String wktPolygon = "POLYGON((-73.9959209576448 40.73286384885367, -73.996317924579 40.732359794090684, -73.9947515145143 40.7315061442504, -73.99422580154739 40.73214841515045, -73.9959209576448 40.73286384885367))";