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 7cc62bc5e6125459e6d9c97f8e2b0f24bbe5f835..67875efd72691e9cb8a1afddf6cee1c52b8529be 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 @@ -42,13 +42,13 @@ public class CityGmlArchive { } if (entry.getName().endsWith(".gml")) { InputStream is = zipFileObj.getInputStream(entry); - Files.copy(is, Path.of( tmpDir.toString(),entry.getName())); - archiveEntries.add(CityGmlZipEntry.of(entry, config, zipFile, tmpDir)); + archiveEntries.add(CityGmlZipEntry.of(entry, config, zipFile, tmpDir, is)); } } } catch (IOException e) { throw new RuntimeException(e); } catch (Exception e){ + // Catch and rethrow Exception to ensure tmpDir deletion throw e; } finally { if (tmpDir != null) { 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 2323ff0c730e7a8b592eac463d53f418ff9f0d68..fa8d7db2a5c9e5821b8906d5483b4d9e12d719f8 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 @@ -10,15 +10,20 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Enumeration; import java.util.zip.ZipEntry; public class CityGmlZipEntry { private static final Logger logger = LogManager.getLogger(CityGmlZipEntry.class); + public enum ZipEntryErrorType { + INVALID_CITY_GML_FILE, EXCESSIVE_FILESIZE, IO_ERROR + } private String fileName; private String archivePath; @@ -27,18 +32,29 @@ public class CityGmlZipEntry { private boolean erroneousEntry = false; private boolean isLibraryObject = false; private boolean validated = false; + private ZipEntryErrorType errorType = null; - public static CityGmlZipEntry of(ZipEntry entry, ParserConfiguration config, String archivePath, Path tempDir){ + 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; - try { - CityGmlParser.gagLogger(true); - cgzEntry.model = CityGmlParser.parseCityGmlFile(tempDir.toString() +"\\" +entry.getName(), config); - } - catch (CityGmlParseException | InvalidGmlFileException e) { - logger.error(e); + if ((double) entry.getSize() /1024/1024 > 20) { cgzEntry.erroneousEntry = true; + cgzEntry.errorType = ZipEntryErrorType.EXCESSIVE_FILESIZE; + } else { + try { + Files.copy(is, Path.of(tempDir.toString(), entry.getName())); + CityGmlParser.gagLogger(true); + cgzEntry.model = CityGmlParser.parseCityGmlFile(tempDir.toString() + "\\" + entry.getName(), config); + } catch (CityGmlParseException | InvalidGmlFileException e) { + logger.error(e); + cgzEntry.erroneousEntry = true; + cgzEntry.errorType = ZipEntryErrorType.INVALID_CITY_GML_FILE; + } catch (IOException e){ + logger.error(e); + cgzEntry.erroneousEntry = true; + cgzEntry.errorType = ZipEntryErrorType.IO_ERROR; + } } return cgzEntry; } @@ -72,6 +88,10 @@ public class CityGmlZipEntry { return model; } + public ZipEntryErrorType getErrorType() { + return errorType; + } + public boolean isLibraryObject() { return isLibraryObject; }