gernotbelger@9567: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9567: * Software engineering by gernotbelger@9567: * Björnsen Beratende Ingenieure GmbH gernotbelger@9567: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9567: * gernotbelger@9567: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9567: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9567: * documentation coming with Dive4Elements River for details. gernotbelger@9567: */ gernotbelger@9567: package test; gernotbelger@9567: gernotbelger@9567: import java.io.ByteArrayInputStream; gernotbelger@9567: import java.io.File; gernotbelger@9567: import java.io.FileNotFoundException; gernotbelger@9567: import java.io.FileOutputStream; gernotbelger@9567: import java.io.IOException; gernotbelger@9567: import java.io.InputStream; gernotbelger@9567: import java.io.InputStreamReader; gernotbelger@9567: import java.net.URL; gernotbelger@9567: import java.nio.charset.Charset; gernotbelger@9567: import java.util.HashMap; gernotbelger@9567: import java.util.Map; gernotbelger@9567: gernotbelger@9567: import org.apache.commons.io.FileUtils; gernotbelger@9567: import org.apache.commons.io.IOUtils; gernotbelger@9567: import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; gernotbelger@9567: import org.dive4elements.artifacts.httpclient.http.HttpClient; gernotbelger@9567: import org.dive4elements.river.client.server.ChartServiceHelper; gernotbelger@9567: import org.junit.Assert; gernotbelger@9567: import org.w3c.dom.Document; gernotbelger@9567: gernotbelger@9567: /** gernotbelger@9567: * @author Domenico Nardi Tironi gernotbelger@9567: * gernotbelger@9567: */ gernotbelger@9567: gernotbelger@9567: public class ModuleRunnerOutput { gernotbelger@9567: gernotbelger@9567: private static final String IGNORE_ERSTELLDATUM = "# Datum der Erstellung"; gernotbelger@9567: private static final String IGNORE_FLYS_VERSION = "# FLYS-Version:"; gernotbelger@9567: private static final String IGNORE_BEARBEITER = "# Bearbeiter:"; gernotbelger@9567: gernotbelger@9567: private static final String LINE_SEPARATOR = System.getProperty("line.separator"); gernotbelger@9567: gernotbelger@9567: private static final String EXPORT_FILE_DIR = "D:" + File.separator; gernotbelger@9567: gernotbelger@9567: final FilenameSupplier filename; gernotbelger@9567: final String outputModeName; gernotbelger@9567: gernotbelger@9567: // private final String collectionIdentifier; gernotbelger@9567: gernotbelger@9567: private final Map params; gernotbelger@9567: gernotbelger@9567: public final String getOutputModename() { gernotbelger@9567: return this.outputModeName; gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: public ModuleRunnerOutput(final FilenameSupplier filename, final String outputModeName, final String currentKm) { gernotbelger@9567: this.filename = filename; gernotbelger@9567: this.outputModeName = outputModeName; gernotbelger@9567: gernotbelger@9567: this.params = getChartExportAttributeMap(currentKm, outputModeName); gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: protected final void assertAndWriteToFile(final HttpClient client, final String collectionId) throws IOException { gernotbelger@9567: gernotbelger@9567: final String type = "csv"; gernotbelger@9567: gernotbelger@9567: final String enc = "UTF-8";// req.getParameter("encoding"); gernotbelger@9567: gernotbelger@9567: final URL expectedResource = getClass().getResource(this.filename.getFilename()); gernotbelger@9567: final Document attr = ChartServiceHelper.getChartAttributes(this.params); gernotbelger@9567: gernotbelger@9567: final Document request = ClientProtocolUtils.newOutCollectionDocument(collectionId, this.outputModeName, type, attr); gernotbelger@9567: gernotbelger@9567: final InputStream response = client.collectionOut(request, collectionId, this.outputModeName); gernotbelger@9567: gernotbelger@9567: final String actual = deleteErstelldatum(IOUtils.toString(response, "UTF-8")); gernotbelger@9567: gernotbelger@9567: final String expected = deleteErstelldatum(FileUtils.readFileToString(new File(expectedResource.getFile()), enc)); gernotbelger@9567: gernotbelger@9567: // if (!actual.equals(expected)) { gernotbelger@9567: // if (this.writeToFile != null && this.writeToFile == true) { gernotbelger@9567: doGetWriteToDisk(actual); // TODO: WENN der Test negativ ausfällt, Datei abspeichern -> Diskussion gernotbelger@9567: // } gernotbelger@9567: gernotbelger@9567: try { gernotbelger@9567: Assert.assertEquals(expected, actual); gernotbelger@9567: } gernotbelger@9567: catch (final AssertionError e) { gernotbelger@9567: // TODO write (both?) files gernotbelger@9567: gernotbelger@9567: // doGetWriteToDisk(actual); // TODO: WENN der Test negativ ausfällt, Datei abspeichern -> Diskussion gernotbelger@9567: throw e; gernotbelger@9567: } gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: public final void doGetWriteToDisk(final String actual_text) throws FileNotFoundException, IOException { gernotbelger@9567: gernotbelger@9567: // final String name = mode; gernotbelger@9567: final String type = "csv"; gernotbelger@9567: gernotbelger@9567: final String fn = this.outputModeName + System.currentTimeMillis() + "." + type; gernotbelger@9567: final String enc = "windows-1252"; gernotbelger@9567: gernotbelger@9567: final String filepath = EXPORT_FILE_DIR + fn; gernotbelger@9567: // BOM gernotbelger@9567: final byte[] BOM = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }; gernotbelger@9567: final String bomChar = new String(BOM, "UTF-8"); gernotbelger@9567: final String actualWithBom = new StringBuilder().append(BOM).append(actual_text).toString(); gernotbelger@9567: gernotbelger@9567: final InputStreamReader in = new InputStreamReader(new ByteArrayInputStream(Charset.forName(enc).encode(actualWithBom).array()), enc); gernotbelger@9567: gernotbelger@9567: IOUtils.copy(in, new FileOutputStream(filepath), enc); gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: private final String deleteErstelldatum(final String input) { gernotbelger@9567: String result = ""; gernotbelger@9567: final String[] lines = input.split(LINE_SEPARATOR); gernotbelger@9567: for (final String line : lines) { gernotbelger@9567: if (!line.contains(IGNORE_ERSTELLDATUM) && !line.contains(IGNORE_FLYS_VERSION) && !line.contains(IGNORE_BEARBEITER)) { gernotbelger@9567: result = result + line + LINE_SEPARATOR; gernotbelger@9567: } gernotbelger@9567: } gernotbelger@9567: return result; gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: private final Map getChartExportAttributeMap(final String currentKm, final String outputmodeName) { gernotbelger@9567: gernotbelger@9567: // From ChartOutputServiceImpl gernotbelger@9567: final Map attr = new HashMap(); gernotbelger@9567: gernotbelger@9567: attr.put("width", "-1"); // req.getParameter("width")); gernotbelger@9567: attr.put("height", "-1"); // req.getParameter("height")); gernotbelger@9567: // attr.put("minx", null);// req.getParameter("minx")); gernotbelger@9567: // attr.put("maxx", req.getParameter("maxx")); gernotbelger@9567: // attr.put("miny", req.getParameter("miny")); gernotbelger@9567: // attr.put("maxy", req.getParameter("maxy")); gernotbelger@9567: attr.put("format", "csv"); // req.getParameter("format")); gernotbelger@9567: attr.put("export", "true");// req.getParameter("export")); gernotbelger@9567: gernotbelger@9567: if (currentKm != null) gernotbelger@9567: attr.put("km", currentKm);// req.getParameter("currentKm")); gernotbelger@9567: // encoding? gernotbelger@9567: gernotbelger@9567: // Weiteres (nicht mehr von CHartOutputServiceImpl, sondern von URL-Parametern): gernotbelger@9567: attr.put("type", outputmodeName); gernotbelger@9567: attr.put("locale", "de"); gernotbelger@9567: attr.put("timestamp", String.valueOf(System.currentTimeMillis())); gernotbelger@9567: attr.put("encoding", "windows-1252"); gernotbelger@9567: gernotbelger@9567: return attr; gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: }