From d1bfb680183a90b5ac60f16d8ae09c69b0897259 Mon Sep 17 00:00:00 2001 From: Riegel <alexander.riegel@hft-stuttgart.de> Date: Tue, 3 Dec 2024 13:17:40 +0100 Subject: [PATCH] Refactor: Rework parsing to use Streams instead of tempDir --- .../citydoctor2/ziploader/CityGmlArchive.java | 21 ++++++------- .../ziploader/CityGmlZipEntry.java | 30 +++++++++++-------- .../ziploader/utils/ArchivePacker.java | 3 +- .../citydoctor2/ziploader/ZipTest.java | 17 ----------- 4 files changed, 30 insertions(+), 41 deletions(-) diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlArchive.java b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlArchive.java index 03b9d2d..9093a0b 100644 --- a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlArchive.java +++ b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlArchive.java @@ -1,25 +1,19 @@ package de.hft.stuttgart.citydoctor2.ziploader; import de.hft.stuttgart.citydoctor2.check.Checker; -import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration; import de.hft.stuttgart.citydoctor2.ziploader.utils.ArchivePacker; -import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.Serial; -import java.nio.file.Files; + import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Enumeration; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; + import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; @@ -32,6 +26,7 @@ public class CityGmlArchive { private static final long serialVersionUID = 2168389511043362615L; private final List<CityGmlZipEntry> entries; + private final Path archivePath; public static CityGmlArchive fromZipFile(String zipFile, ParserConfiguration config) { ArrayList<CityGmlZipEntry> archiveEntries = new ArrayList<>(); @@ -60,11 +55,13 @@ public class CityGmlArchive { } } logger.info("Zip-archive successfully uncompressed, {} CityGml files detected", archiveEntries.size()); - return new CityGmlArchive(archiveEntries); + return new CityGmlArchive(archiveEntries, Path.of(zipFile)); } - private CityGmlArchive(List<CityGmlZipEntry> entries) { + private CityGmlArchive(List<CityGmlZipEntry> entries, Path archivePath) { this.entries = entries; + entries.forEach(e -> e.setArchive(this)); + this.archivePath = archivePath; } public void exportToZipFile(String path) { @@ -78,6 +75,10 @@ public class CityGmlArchive { } } + public Path getArchivePath() { + return archivePath; + } + public List<CityGmlZipEntry> getEntries() { return entries; } diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlZipEntry.java b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlZipEntry.java index b60591b..486e0f0 100644 --- a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlZipEntry.java +++ b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/CityGmlZipEntry.java @@ -18,26 +18,22 @@ public class CityGmlZipEntry { private static final Logger logger = LogManager.getLogger(CityGmlZipEntry.class); - private String fileName; - private String archivePath; - private CityDoctorModel model; - - private boolean erroneousEntry = false; - private boolean isLibraryObject = false; + private final String fileName; + private final CityDoctorModel model; + private CityGmlArchive parentArchive; private boolean validated = false; private ZipEntryErrorType errorType = null; - public static CityGmlZipEntry of(ZipEntry entry, ParserConfiguration config, String archivePath, Path tempDir, InputStream is){ - CityGmlZipEntry cgzEntry = new CityGmlZipEntry(); - cgzEntry.fileName = entry.getName(); - cgzEntry.archivePath = archivePath; + + public static CityGmlZipEntry of(ZipEntry entry, ZipFile archive, ParserConfiguration config){ if ((double) entry.getSize() /1024/1024 > 20) { return new ErroneousEntry(entry, ZipEntryErrorType.EXCESSIVE_FILESIZE); } else { try { - Files.copy(is, Path.of(tempDir.toString(), entry.getName())); + ZipInputStream zis = new ZipInputStream(archive.getInputStream(entry)); CityGmlParser.gagLogger(true); - cgzEntry.model = CityGmlParser.parseCityGmlFile(tempDir.toString() + File.separator + entry.getName(), config); + CityDoctorModel model = CityGmlParser.parseCityGmlStream(zis, config); + return new CityGmlZipEntry(entry.getName(), model); } catch (CityGmlParseException | InvalidGmlFileException e) { logger.error(e); return new ErroneousEntry(entry, ZipEntryErrorType.INVALID_CITY_GML_FILE); @@ -46,7 +42,6 @@ public class CityGmlZipEntry { return new ErroneousEntry(entry, ZipEntryErrorType.IO_ERROR); } } - return cgzEntry; } private CityGmlZipEntry(String filename, CityDoctorModel model){ @@ -58,6 +53,15 @@ public class CityGmlZipEntry { this.fileName = entry.getName(); this.model = null; } + + public void setArchive(CityGmlArchive archive){ + parentArchive = archive; + } + + public CityGmlArchive getArchive(){ + return parentArchive; + } + public void validateModel(){ Checker checker = new Checker(this.getModel()); checker.runChecks(); diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/utils/ArchivePacker.java b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/utils/ArchivePacker.java index bdee9ed..fc4cc2d 100644 --- a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/utils/ArchivePacker.java +++ b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/main/java/de/hft/stuttgart/citydoctor2/ziploader/utils/ArchivePacker.java @@ -3,6 +3,7 @@ package de.hft.stuttgart.citydoctor2.ziploader.utils; import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; import de.hft.stuttgart.citydoctor2.ziploader.CityGmlArchive; import de.hft.stuttgart.citydoctor2.ziploader.CityGmlZipEntry; +import de.hft.stuttgart.citydoctor2.ziploader.ErroneousEntry; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -31,7 +32,7 @@ public class ArchivePacker { tmpDir = Files.createTempDirectory("zipTmp"); tmpDir.toFile().deleteOnExit(); for (CityGmlZipEntry entry : archive.getEntries()) { - if (entry.isErroneousEntry()){ + if (entry instanceof ErroneousEntry){ continue; } CityDoctorModel model = entry.getModel(); diff --git a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java index 2e97f7b..158d83b 100644 --- a/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java +++ b/CityDoctorParent/Extensions/CityDoctorZipLoader/src/test/java/de/hft/stuttgart/citydoctor2/ziploader/ZipTest.java @@ -5,13 +5,10 @@ import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.mockito.Mockito; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.zip.ZipEntry; import static org.junit.Assert.*; @@ -42,20 +39,6 @@ public class ZipTest { cgmlArch.exportToZipFile("src/test/resources/mock"); } - @Test - public void testExcessiveFilesize(){ - ZipEntry zipEntry = Mockito.mock(ZipEntry.class); - Path mockPath = Mockito.mock(Path.class); - InputStream mockIs = Mockito.mock(InputStream.class); - // Mock filesize of 30 Gb - Mockito.when(zipEntry.getSize()).thenReturn(1024L*1024L*30); - Mockito.when(zipEntry.getName()).thenReturn("mock.gml"); - CityGmlZipEntry cgmlZE = CityGmlZipEntry.of(zipEntry, config, "test", mockPath, mockIs); - assertNotNull(cgmlZE); - assertTrue(cgmlZE.isErroneousEntry()); - assertEquals(CityGmlZipEntry.ZipEntryErrorType.EXCESSIVE_FILESIZE, cgmlZE.getErrorType()); - - } @Test public void testZipping() throws IOException { -- GitLab