Commit 97f1a582 authored by Riegel's avatar Riegel
Browse files

Feat: Add support for zip-file validation to CLI

2 merge requests!28Version 3.17.0 Release,!26Add ZIP-archive support
Pipeline #10590 passed with stage
in 2 minutes and 44 seconds
Showing with 86 additions and 14 deletions
+86 -14
......@@ -80,4 +80,18 @@ public class ArchivePacker {
}
}
public static void packAndDeleteDirectory(String directoryPath) throws IOException {
Path path = Path.of(directoryPath);
if (!path.toFile().exists()) {
throw new IllegalStateException("Directory " + directoryPath + " does not exist");
}
if (!path.toFile().isDirectory()) {
throw new IllegalStateException("Path " + directoryPath + " is not a directory");
}
String outputPath = path.getParent().resolve(path.getFileName() + ".zip").toString();
zipDirectory(outputPath, directoryPath);
FileUtils.deleteDirectory(path.toFile());
}
}
......@@ -21,8 +21,10 @@ package de.hft.stuttgart.citydoctor2;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipArchive;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.citygml4j.core.ade.ADEException;
......@@ -72,7 +74,7 @@ public class CityDoctorValidation {
String outputFile = getOutputFile(argParser, true);
ValidationConfiguration config = getValidationConfig(argParser);
startValidationProcess(new File(inputFile), xmlOutput, pdfOutput, config, outputFile);
startValidationProcess(inputFile, xmlOutput, pdfOutput, config, outputFile);
}
private static String getOutputFile(ArgumentParser argParser, boolean optional) {
......@@ -144,13 +146,28 @@ public class CityDoctorValidation {
pdfOutputPath = pdfOutput.getAbsolutePath();
}
try {
startValidationProcess(inputFile, xmlOutputPath, pdfOutputPath, config, null);
startFileValidation(inputFile, xmlOutputPath, pdfOutputPath, config, null);
} catch (CityDoctorWriteException e) {
// this does not happen as no output file is specified
logger.catching(e);
}
}
public static void startValidationProcess(String input, String xmlOutput, String pdfOutput,
ValidationConfiguration config, String outputFile) throws CityDoctorWriteException, CityGmlParseException, IOException, InvalidGmlFileException {
File inputFile = new File(input);
if (!inputFile.exists()) {
logger.error("Input file '{}' does not exist.", input);
System.exit(1);
}
if (inputFile.getName().endsWith(".gml")) {
startFileValidation(inputFile, xmlOutput, pdfOutput, config, outputFile);
} else if (inputFile.getName().endsWith(".zip")) {
startZipValidation(input, xmlOutput, pdfOutput, config, outputFile);
}
}
/**
* This function will handle the complete validation process
*
......@@ -164,7 +181,7 @@ public class CityDoctorValidation {
* @throws CityGMLBuilderException
* @throws ADEException
*/
public static void startValidationProcess(File inputFile, String xmlOutput, String pdfOutput,
public static void startFileValidation(File inputFile, String xmlOutput, String pdfOutput,
ValidationConfiguration config, String outputFile) throws IOException, CityGmlParseException,
InvalidGmlFileException, CityDoctorWriteException {
......@@ -181,6 +198,29 @@ public class CityDoctorValidation {
}
}
public static void startZipValidation(String inputZipFile, String xmlOutput, String pdfOutput,
ValidationConfiguration config, String outputFile) throws CityGmlParseException, IOException {
xmlOutput = toDirectoryPath(xmlOutput);
pdfOutput = toDirectoryPath(pdfOutput);
outputFile = toDirectoryPath(outputFile);
if (xmlOutput == null && pdfOutput == null && outputFile == null) {
logger.warn("No output locations specified, results of validation will not be saved");
}
CityGmlZipArchive archive = CityGmlZipArchive.register(inputZipFile);
Checker.streamCheck(archive, xmlOutput, pdfOutput, config, outputFile);
}
public static String toDirectoryPath(String input) {
if (input == null) {
return null;
}
String parentDirectory = Path.of(input).getParent().toString() + File.separator;
String name = Path.of(input).getFileName().toString().replaceFirst("\\..+", "") + File.separator;
File f = new File(parentDirectory + name);
f.mkdir();
return f.getPath() + File.separator;
}
public static String getPdfOutput(ArgumentParser argParser) {
if (argParser.containsOption("pdfreport")) {
List<String> reportFiles = argParser.getValues("pdfreport");
......
......@@ -42,6 +42,7 @@ import de.hft.stuttgart.citydoctor2.reporting.XmlStreamReporter;
import de.hft.stuttgart.citydoctor2.reporting.XmlValidationReporter;
import de.hft.stuttgart.citydoctor2.reporting.pdf.PdfReporter;
import de.hft.stuttgart.citydoctor2.reporting.pdf.PdfStreamReporter;
import de.hft.stuttgart.citydoctor2.utils.ArchivePacker;
import de.hft.stuttgart.citydoctor2.utils.Localization;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipArchive;
import de.hft.stuttgart.citydoctor2.zip.CityGmlZipEntry;
......@@ -740,17 +741,24 @@ public class Checker {
return hasUnusedDependency;
}
public static void streamCheck(CityGmlZipArchive archive, String xmlOutput, String pdfOutput, ValidationConfiguration config,
String outputFile) throws IOException, CityGmlParseException {
streamCheck(archive, xmlOutput, pdfOutput, config, null, outputFile);
public static void streamCheck(CityGmlZipArchive archive, String xmlDirectory, String pdfDirectory, ValidationConfiguration config,
String outputDirectory) throws IOException, CityGmlParseException {
streamCheck(archive, xmlDirectory, pdfDirectory, config, null, outputDirectory);
}
public static void streamCheck(CityGmlZipArchive archive, String xmlOutput, String pdfOutput, ValidationConfiguration config,
FeatureCheckedListener l, String outputFile) throws IOException, CityGmlParseException {
public static void streamCheck(CityGmlZipArchive archive, String xmlDirectory, String pdfDirectory, ValidationConfiguration config,
FeatureCheckedListener l, String outputDirectory) throws IOException, CityGmlParseException {
for (CityGmlZipEntry entry : archive.getEntries()) {
String xmlOutput = xmlDirectory == null ? null : xmlDirectory + entry.getFileName().replaceFirst("\\..+", ".xml");
String pdfOutput = pdfDirectory == null ? null : pdfDirectory + entry.getFileName().replaceFirst("\\..+", ".pdf");
String outputFile = outputDirectory == null ? null : outputDirectory + entry.getFileName();
streamCheck(entry, xmlOutput, pdfOutput, config, l, outputFile);
}
if (outputDirectory != null) {
ArchivePacker.packAndDeleteDirectory(outputDirectory);
}
}
......
......@@ -35,10 +35,11 @@ import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
......@@ -120,8 +121,8 @@ public class CheckerTest {
@Test
public void testCliZipChecking() throws IOException, CityDoctorWriteException, CityGmlParseException, InvalidGmlFileException {
File f = folder.newFile("out.zip");
Files.probeContentType(f.toPath());
String output = folder.getRoot().toPath() + File.separator + "test";
try {
String[] args = new String[6];
args[0] = "-in";
......@@ -129,12 +130,21 @@ public class CheckerTest {
args[2] = "-config";
args[3] = "src/test/resources/testConfigWithStreaming.yml";
args[4] = "-out";
args[5] = f.getAbsolutePath();
args[5] = output + File.separator;
CityDoctorValidation.main(args);
File f = new File(output + ".zip");
assertTrue(f.exists());
CityGmlZipArchive cgmlArch = CityGmlZipArchive.register(output + ".zip");
assertNotNull(cgmlArch);
cgmlArch.mountArchive(new ParserConfiguration(8, false));
assertEquals(5, cgmlArch.getEntries().size());
for (CityGmlZipEntry entry : cgmlArch.getEntries()) {
assertNotNull(entry);
assertNull(entry.getErrorType());
}
} finally {
f.delete();
} catch (CityGmlParseException | IOException | InvalidGmlFileException | CityDoctorWriteException e) {
throw e;
}
}
......
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