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