Commit a1ec190b authored by Riegel's avatar Riegel
Browse files

Feat: Implement unzipping of zip-files

parent db25e16d
package de.hft.stuttgart.citydoctor2.ziploader;
import de.hft.stuttgart.citydoctor2.check.Checker;
import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.zip.ZipEntry;
import java.util.zip.ZipFile;
public class CityGmlArchive {
private static final Logger logger = LogManager.getLogger(CityGmlArchive.class);
@Serial
private static final long serialVersionUID = 2168389511043362615L;
private List<CityGmlZipEntry> entries;
public CityGmlArchive(List<CityGmlZipEntry> entries) {
private boolean validated = false;
public static CityGmlArchive fromZipFile(String zipFile, ParserConfiguration config) {
ArrayList<CityGmlZipEntry> archiveEntries = new ArrayList<>();
Path tmpDir = null;
try (ZipFile zipFileObj = new ZipFile(zipFile)) {
tmpDir = Files.createTempDirectory("zipTmp");
tmpDir.toFile().deleteOnExit();
for (Enumeration<? extends ZipEntry> entries = zipFileObj.entries(); entries.hasMoreElements();) {
ZipEntry entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
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));
}
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e){
throw e;
} finally {
if (tmpDir != null) {
try {
FileUtils.deleteDirectory(tmpDir.toFile());
} catch (IOException e) {
logger.error(e);
}
}
}
logger.info("Parsed zip-archive with {} entries", archiveEntries.size());
return new CityGmlArchive(archiveEntries);
}
private CityGmlArchive(List<CityGmlZipEntry> entries) {
this.entries = entries;
}
public void exportToZipFile(String path) {
if (!path.endsWith(".zip")){
throw new IllegalArgumentException("Target zip-filepath must end with '.zip'");
}
if (validated) {
//TODO: Export of validation reports for each entry
}
}
public void checkEntries(){
validated = false;
for(CityGmlZipEntry entry : entries){
Checker checker = new Checker(entry.getModel());
checker.runChecks();
}
validated = true;
}
public List<CityGmlZipEntry> getEntries() {
return entries;
}
}
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.CityGmlParseException;
import de.hft.stuttgart.citydoctor2.parser.CityGmlParser;
......@@ -8,6 +9,10 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
public class CityGmlZipEntry {
......@@ -19,23 +24,38 @@ public class CityGmlZipEntry {
private String archivePath;
private CityDoctorModel model;
private boolean erroneous = false;
private boolean erroneousEntry = false;
private boolean isLibraryObject = false;
private boolean validated = false;
public static CityGmlZipEntry of(ZipEntry entry, ParserConfiguration config, String archivePath){
public static CityGmlZipEntry of(ZipEntry entry, ParserConfiguration config, String archivePath, Path tempDir){
CityGmlZipEntry cgzEntry = new CityGmlZipEntry();
cgzEntry.fileName = entry.getName();
cgzEntry.archivePath = archivePath;
try {
cgzEntry.model = CityGmlParser.parseCityGmlFile(entry.getName(), config);
CityGmlParser.gagLogger(true);
cgzEntry.model = CityGmlParser.parseCityGmlFile(tempDir.toString() +"\\" +entry.getName(), config);
}
catch (CityGmlParseException | InvalidGmlFileException e) {
logger.error(e);
cgzEntry.erroneous = true;
cgzEntry.erroneousEntry = true;
}
return cgzEntry;
}
public void validateModel(){
if(erroneousEntry){
return;
}
Checker checker = new Checker(this.getModel());
checker.runChecks();
validated = true;
}
public boolean isValidated(){
return validated;
}
public void setIsLibraryObject(boolean isLibraryObject) {
this.isLibraryObject = isLibraryObject;
}
......@@ -56,7 +76,7 @@ public class CityGmlZipEntry {
return isLibraryObject;
}
public boolean isErroneous() {
return erroneous;
public boolean isErroneousEntry() {
return erroneousEntry;
}
}
......@@ -16,22 +16,6 @@ public class ZipParser {
private static final Logger logger = LogManager.getLogger(ZipParser.class);
public static List<CityGmlZipEntry> parseZipFile(String zipFile, ParserConfiguration config) {
ArrayList<CityGmlZipEntry> archiveEntries = new ArrayList<>();
try (ZipFile zipFileObj = new ZipFile(zipFile)) {
for (Enumeration<? extends ZipEntry> entries = zipFileObj.entries(); entries.hasMoreElements();) {
ZipEntry entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
if (entry.getName().endsWith(".gml")) {
archiveEntries.add(CityGmlZipEntry.of(entry, config, zipFile));
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return archiveEntries;
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment