# HG changeset patch # User gernotbelger # Date 1524821644 -7200 # Node ID efd2de78d1581bbcc6443f99dad1b1abb014c3fa # Parent 4dc047fb36332790a565a2e6f04bbdcb2022ce1d work on unit testing diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/main/java/org/dive4elements/river/client/test/ProofMain.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/test/ProofMain.java Fri Apr 27 10:48:28 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2010 by Intevation GmbH - * - * This program is free software under the LGPL (>=v2.1) - * Read the file LGPL.txt coming with the software for details - * or visit http://www.gnu.org/licenses/ if it does not exist. - */ - -package org.dive4elements.river.client.test; - -import java.io.IOException; - -import org.dive4elements.artifacts.httpclient.http.HttpClient; -import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; -import org.dive4elements.river.client.shared.exceptions.ServerException; - -/** - * @author Ingo Weinzierl - */ -public class ProofMain { - - private static final String serverUrl = "http://localhost:8181"; - private static final String locale = "de"; - private static final HttpClient client = new HttpClientImpl(serverUrl, locale); - - public static void main(final String[] args) throws ServerException, IOException { - // logger.info("Starting console client."); - final SinfoProof proof = new SinfoProof("belger", "belger", "sinfo"); - proof.runTest(); - } - -} diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/main/java/org/dive4elements/river/client/test/SinfoProof.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/test/SinfoProof.java Fri Apr 27 10:48:28 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde - * Software engineering by - * Björnsen Beratende Ingenieure GmbH - * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt - * - * This file is Free Software under the GNU AGPL (>=v3) - * and comes with ABSOLUTELY NO WARRANTY! Check out the - * documentation coming with Dive4Elements River for details. - */ -package org.dive4elements.river.client.test; - -import org.dive4elements.river.client.client.ui.NilDatacageTwinPanelInfo; -import org.dive4elements.river.client.client.ui.RecommandationUtils; -import org.dive4elements.river.client.shared.model.Artifact; -import org.dive4elements.river.client.shared.model.Data; -import org.dive4elements.river.client.shared.model.DataItem; -import org.dive4elements.river.client.shared.model.DataList; -import org.dive4elements.river.client.shared.model.DefaultDataItem; -import org.dive4elements.river.client.shared.model.OutputMode; -import org.dive4elements.river.client.shared.model.Recommendation; -import org.dive4elements.river.client.shared.model.StringOptionsData; - -/** - * @author Domenico Nardi Tironi - * - */ -public class SinfoProof extends SuperProof { - - public SinfoProof(final String username, final String password, final String infotype) { - super(username, password, infotype); - - } - - @Override - public void runTest() { - // TODO Auto-generated method stub - /* Select River */ - final Data data = new StringOptionsData("river", "river", new DataItem[] { new DefaultDataItem("Beispielfluss", "Beispielfluss", "Beispielfluss") }); - feedAndGo(new Data[] { data }, 0); - - /* Select CalcMode */ - final DataList calcModes = getArtifact().getArtifactDescription().getCurrentData(); // AUSWAHL-Möglichkeiten - final DataItem minMaxFlowdepth = calcModes.get(0).getItems()[2]; - final Data dataCalcMode = new StringOptionsData("calculation_mode", "calculation_mode", new DataItem[] { minMaxFlowdepth }); - feedAndGo(new Data[] { dataCalcMode }, 0); - - /* Select Range */ - - // entweder eine bestimmte Range - final Data dataFrom = new StringOptionsData("ld_from", "ld_from", new DataItem[] { new DefaultDataItem("10", "10", "10") }); - final Data dataTo = new StringOptionsData("ld_to", "ld_to", new DataItem[] { new DefaultDataItem("100", "100", "100") }); - final Data[] rangeFromToDetermined = new Data[] { dataFrom, dataTo }; - - // oder die maxRange - final DataList list = getArtifact().getArtifactDescription().getCurrentData(); - final Data[] rangeMax = new Data[] { list.get(0), list.get(1) }; - - feedAndGo(rangeFromToDetermined, 0); - - /* Select Fixpunkte */ - // TODO: Create Recoomendation-Generator - final Recommendation rec1 = new Recommendation("staticwqkms", "additionals-wstv-0-103", "sinfo_flowdepth_waterlevels"); - final Recommendation rec2 = new Recommendation("bedheight", "bedheight-single-36-2015-FP-2015_0-502", "sinfo_flowdepthminmax_heights"); - - final Artifact[] artifacts = loadMany(new Recommendation[] { rec1, rec2 }, null); - - // rec1.getDisplayName() TODO: makeDisplayName - final String rec1String = RecommandationUtils.createDataString(artifacts[0].getUuid(), rec1, new NilDatacageTwinPanelInfo("xxxx")); - final String rec2String = RecommandationUtils.createDataString(artifacts[1].getUuid(), rec2, new NilDatacageTwinPanelInfo("xxxx")); - // TODO: check display name - final String combinedIdNeu = rec1String + "#" + rec2String; - - final Data pair = new StringOptionsData("diffids", "diffids", new DataItem[] { new DefaultDataItem(combinedIdNeu, combinedIdNeu, combinedIdNeu) }); - feedAndGo(new Data[] { pair }, 0); - - // Describe collection - describeCollection(); // wichtig, damit die Facets erzeugt werden - - // /* Export calculation */ - final OutputMode[] modes = getArtifact().getArtifactDescription().getOutputModes(); - if (modes != null) { - final OutputMode mode = modes[1]; // output.sinfo_flowdepthminmax_export - doGet(mode.getName()); - } - } - -} diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/main/java/org/dive4elements/river/client/test/SuperProof.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/test/SuperProof.java Fri Apr 27 10:48:28 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,310 +0,0 @@ -/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde - * Software engineering by - * Björnsen Beratende Ingenieure GmbH - * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt - * - * This file is Free Software under the GNU AGPL (>=v3) - * and comes with ABSOLUTELY NO WARRANTY! Check out the - * documentation coming with Dive4Elements River for details. - */ -package org.dive4elements.river.client.test; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.util.ArrayList; -import java.util.HashMap; - -import org.dive4elements.artifacts.common.ArtifactNamespaceContext; -import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; -import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; -import org.dive4elements.artifacts.httpclient.http.HttpClient; -import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; -import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; -import org.dive4elements.artifacts.httpclient.utils.XMLUtils; -import org.dive4elements.river.client.server.AdvanceServiceImpl; -import org.dive4elements.river.client.server.ArtifactHelper; -import org.dive4elements.river.client.server.CollectionHelper; -import org.dive4elements.river.client.server.CreateCollectionServiceImpl; -import org.dive4elements.river.client.server.FLYSArtifactCreator; -import org.dive4elements.river.client.server.FeedServiceImpl; -import org.dive4elements.river.client.server.LoadArtifactServiceImpl; -import org.dive4elements.river.client.server.auth.DefaultUser; -import org.dive4elements.river.client.server.auth.User; -import org.dive4elements.river.client.server.auth.UserClient; -import org.dive4elements.river.client.shared.exceptions.ServerException; -import org.dive4elements.river.client.shared.model.Artifact; -import org.dive4elements.river.client.shared.model.Collection; -import org.dive4elements.river.client.shared.model.Data; -import org.dive4elements.river.client.shared.model.DefaultCollection; -import org.dive4elements.river.client.shared.model.Recommendation; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -/** - * @author Domenico Nardi Tironi - * - */ -public abstract class SuperProof { - - private final String serverUrl = "http://localhost:8181"; - private final String locale = "de"; - private final HttpClient client; - - private final String username; - private final String password; - private final String infotype; - private final String userUuid; - private Collection collection; - private Artifact artifact; - - public SuperProof(final String username, final String password, final String infotype) { - this.username = username; - this.password = password; - this.infotype = infotype; - - // init - this.client = new HttpClientImpl(this.serverUrl, this.locale); - this.userUuid = makeUserUuid(); - this.collection = getCollection(); - this.artifact = getArtifact(); - } - - private String makeUserUuid() { - final User user = new DefaultUser(this.username, this.password, null, false, new ArrayList(), new ArrayList()); - final UserClient userClient = new UserClient(this.serverUrl); - Element userElement; - try { - userElement = userClient.findUser(user); - return userElement.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "uuid"); - } - catch (final ConnectionException e) { - e.printStackTrace(); - } - return ""; - } - - protected final Artifact getArtifact() { - - /* Init Collection */ - if (this.artifact == null) - try { - - this.artifact = ArtifactHelper.createArtifact(this.serverUrl, this.locale, this.infotype, null); - setCollection(CollectionHelper.addArtifact(getCollection(), this.artifact, this.serverUrl, this.locale)); // wichtig; sorgt für Persistenz - } - catch (final ServerException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return this.artifact; - } - - private Collection getCollection() { - - if (this.collection == null) { - try { - // lazy-Loading - final Document create = ClientProtocolUtils.newCreateCollectionDocument(null); - final Document doc = (Document) this.client.createCollection(create, this.userUuid, new DocumentResponseHandler()); - final String uuid = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_UUID, ArtifactNamespaceContext.INSTANCE); - final String ttlStr = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_TTL, ArtifactNamespaceContext.INSTANCE); - this.collection = new DefaultCollection(uuid, Long.valueOf(ttlStr), uuid); - } - catch (final ConnectionException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - return this.collection; - } - - private void setCollection(final Collection collection) { - this.collection = collection; - } - - private void setArtifact(final Artifact artifact) { - this.artifact = artifact; - } - - // TODO: MAKE THIS CLASS ABSTRACT AND OVERRIDE runTest in children - public abstract void runTest(); - - protected final void describeCollection() { - try { - final String uuid = getCollection().identifier(); - final Document describe = ClientProtocolUtils.newDescribeCollectionDocument(uuid); - final Document response = (Document) this.client.doCollectionAction(describe, uuid, new DocumentResponseHandler()); - final Collection c = CollectionHelper.parseCollection(response); - setCollection(c); - } - catch (final ConnectionException e) { - e.printStackTrace(); - } - } - - protected final void feedAndGo(final Data[] data, final int reachableStateIndex) { - try { - feed(data); - advance(getReachableStateByIndex(getArtifact(), reachableStateIndex)); // reachablestate könnte auch String sein... TODO: feedAndgo(data,string) - // bauen - } - catch (final ConnectionException e) { - e.printStackTrace(); - } - catch (final ServerException e) { - e.printStackTrace(); - } - } - - private String getReachableStateByIndex(final Artifact artifact, final int index) { - - final String[] states = artifact.getArtifactDescription().getReachableStates(); - if (states != null) { - if (states.length > index) { - return states[index]; - } else { - return states[0]; - } - } else { - return ""; - } - } - - private void feed(final Data[] data) throws ServerException, ConnectionException { - final Document feed = ClientProtocolUtils.newFeedDocument(getArtifact().getUuid(), getArtifact().getHash(), createKVP(data)); - - final Document description = (Document) this.client.feed( - new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), feed, - new DocumentResponseHandler()); - - final String result = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); - - if (result == null || !result.equals(FeedServiceImpl.OPERATION_FAILURE)) { - setArtifact((Artifact) new FLYSArtifactCreator().create(description)); - } else if (result != null && result.equals(FeedServiceImpl.OPERATION_FAILURE)) { - final String msg = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT_MSG, ArtifactNamespaceContext.INSTANCE); - throw new ServerException(msg); - } - - // throw new ServerException(FeedServiceImpl.ERROR_FEED_DATA); - } - - private String[][] createKVP(final Data[] data) { - if (data != null) { - final String[][] kvp = new String[data.length][]; - - int i = 0; - - for (final Data d : data) { - // final DataItem[] items = d.getItems(); - final String key = d.getLabel(); - final String value = d.getStringValue(); - - kvp[i++] = new String[] { key, value }; - } - - return kvp; - } - return null; - } - - private void advance(final String target) throws ConnectionException, ServerException { - final Document advance = ClientProtocolUtils.newAdvanceDocument(getArtifact().getUuid(), getArtifact().getHash(), target); - // final HttpClient client = new HttpClientImpl(url, locale); - - final Document description = (Document) this.client.advance( - new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), advance, - new DocumentResponseHandler()); - - if (description == null) { - throw new ServerException(AdvanceServiceImpl.ERROR_ADVANCE_ARTIFACT); - } - - final String result = XMLUtils.xpathString(description, AdvanceServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); - - if (result == null || !result.equals(AdvanceServiceImpl.OPERATION_FAILURE)) { - setArtifact((Artifact) new FLYSArtifactCreator().create(description)); - } - - // throw new ServerException(AdvanceServiceImpl.ERROR_ADVANCE_ARTIFACT); - } - - protected final Artifact[] loadMany(final Recommendation[] recoms, final String factory) { - try { - final ArrayList artifacts = new ArrayList(); - final HashMap cloneMap = new HashMap(); - - for (final Recommendation recom : recoms) { - - final Artifact prevClone = cloneMap.get(recom); - if (prevClone != null) { - - artifacts.add(prevClone); - } else { - // Not already cloned. - final String realFactory = factory != null ? factory : recom.getFactory(); - - final Artifact clone = ArtifactHelper.createArtifact(this.serverUrl, this.locale, realFactory, recom); - - if (clone != null) { - final Collection c = CollectionHelper.addArtifact(getCollection(), clone, this.serverUrl, this.locale); - - if (c != null) { - artifacts.add(clone); - // Remember we cloned a recommendation like this. - cloneMap.put(recom, clone); - } else { - throw new ServerException(LoadArtifactServiceImpl.ERROR_LOAD_ARTIFACT); - } - } - } - } - return artifacts.toArray(new Artifact[artifacts.size()]); - } - catch (final ServerException e) { - e.printStackTrace(); - } - return null; - } - - /// ExportServiceImpl - public void doGet(final String mode) { - try { - - final String name = mode; - final String type = "csv"; - - final String fn = name + "." + type; // TODO: make filename unique - final String enc = "windows-1252";// req.getParameter("encoding"); - - final OutputStream out = new FileOutputStream(new File("D:" + File.separator + fn)); - final Document attr = null; - final Document request = ClientProtocolUtils.newOutCollectionDocument(getCollection().identifier(), mode, type, attr); - // final HttpClient client = new HttpClientImpl(serverUrl, locale); - - if (enc != null) { - final InputStreamReader in = new InputStreamReader(this.client.collectionOut(request, getCollection().identifier(), mode), "UTF-8"); - try { - final OutputStreamWriter encOut = new OutputStreamWriter(out, enc); - final char buf[] = new char[4096]; - int c; - while ((c = in.read(buf, 0, buf.length)) >= 0) { - encOut.write(buf, 0, c); - } - encOut.flush(); - encOut.close(); - } finally { - in.close(); - } - } - } - catch (final IOException ioe) { - ioe.printStackTrace(); - } - } - -} diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/test/java/org/dive4elements/river/client/FLYSJUnit.gwt.xml --- a/gwt-client/src/test/java/org/dive4elements/river/client/FLYSJUnit.gwt.xml Fri Apr 27 10:48:28 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/test/java/test/SinfoTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/test/java/test/SinfoTest.java Fri Apr 27 11:34:04 2018 +0200 @@ -0,0 +1,77 @@ +package test; + +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +import java.io.IOException; + +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.OutputMode; +import org.dive4elements.river.client.shared.model.StringOptionsData; + +/** + * @author Domenico Nardi Tironi + * + */ +public class SinfoTest extends SuperTest { + + private final String calcMode; + + public SinfoTest(final String username, final String password, final String infotype, final String calcmode) throws ConnectionException, ServerException { + super(username, password, infotype); + this.calcMode = calcmode; + } + + @Override + public void runTest(final boolean exportToFile) throws ServerException, IOException { + // TODO Auto-generated method stub + /* Select River */ + final Data data = new StringOptionsData("river", "river", new DataItem[] { new DefaultDataItem("Beispielfluss", "Beispielfluss", "Beispielfluss") }); + feedAndGo(new Data[] { data }, 0); + + /* Select CalcMode */ + // final DataList calcModes = getArtifact().getArtifactDescription().getCurrentData(); // AUSWAHL-Möglichkeiten + // final DataItem minMaxFlowdepth = calcModes.get(0).getItems()[2]; // CalcMode + final Data dataCalcMode = new StringOptionsData("calculation_mode", "calculation_mode", + new DataItem[] { new DefaultDataItem(this.calcMode, this.calcMode, this.calcMode) }); + feedAndGo(new Data[] { dataCalcMode }, 0); + + /* Select Range */ + + // entweder eine bestimmte Range + final Data dataFrom = new StringOptionsData("ld_from", "ld_from", new DataItem[] { new DefaultDataItem("10", "10", "10") }); + final Data dataTo = new StringOptionsData("ld_to", "ld_to", new DataItem[] { new DefaultDataItem("100", "100", "100") }); + final Data[] rangeFromToDetermined = new Data[] { dataFrom, dataTo }; + + // oder die maxRange + // final DataList list = getArtifact().getArtifactDescription().getCurrentData(); + // final Data[] rangeMax = new Data[] { list.get(0), list.get(1) }; + + feedAndGo(rangeFromToDetermined, 0); + + /* Select Fixpunkte */ + feedAndGo(super.getPairData(), 0); + + // Describe collection + describeCollection(); // wichtig, damit die Facets erzeugt werden + + // /* Export calculation */ + final OutputMode[] modes = getArtifact().getArtifactDescription().getOutputModes(); + if (modes != null) { + final OutputMode mode = modes[1]; // output.sinfo_flowdepthminmax_export + doGet(mode.getName(), exportToFile); + } + } + +} diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/test/java/test/SuperTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/test/java/test/SuperTest.java Fri Apr 27 11:34:04 2018 +0200 @@ -0,0 +1,328 @@ +package test; + +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.dive4elements.artifacts.common.ArtifactNamespaceContext; +import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; +import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; +import org.dive4elements.artifacts.httpclient.http.HttpClient; +import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; +import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; +import org.dive4elements.artifacts.httpclient.utils.XMLUtils; +import org.dive4elements.river.client.client.ui.NilDatacageTwinPanelInfo; +import org.dive4elements.river.client.client.ui.RecommandationUtils; +import org.dive4elements.river.client.server.AdvanceServiceImpl; +import org.dive4elements.river.client.server.ArtifactHelper; +import org.dive4elements.river.client.server.CollectionHelper; +import org.dive4elements.river.client.server.CreateCollectionServiceImpl; +import org.dive4elements.river.client.server.FLYSArtifactCreator; +import org.dive4elements.river.client.server.FeedServiceImpl; +import org.dive4elements.river.client.server.LoadArtifactServiceImpl; +import org.dive4elements.river.client.server.auth.DefaultUser; +import org.dive4elements.river.client.server.auth.User; +import org.dive4elements.river.client.server.auth.UserClient; +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.dive4elements.river.client.shared.model.Artifact; +import org.dive4elements.river.client.shared.model.Collection; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DefaultCollection; +import org.dive4elements.river.client.shared.model.DefaultDataItem; +import org.dive4elements.river.client.shared.model.Recommendation; +import org.dive4elements.river.client.shared.model.StringOptionsData; +import org.junit.Assert; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * @author Domenico Nardi Tironi + * + */ +public abstract class SuperTest { + + private final String serverUrl = "http://localhost:8181"; + private final String locale = "de"; + private final HttpClient client; + + private static final String exportFileDir = "D:" + File.separator; + private static final String erstellDatumSearchString = "# Datum der Erstellung"; + + private final String username; + private final String password; + private final String infotype; + private final String userUuid; + private Collection collection; + private Artifact artifact; + + private final List pairIds = new ArrayList(); + + public SuperTest(final String username, final String password, final String infotype) throws ConnectionException, ServerException { + this.username = username; + this.password = password; + this.infotype = infotype; + + // init + this.client = new HttpClientImpl(this.serverUrl, this.locale); + this.userUuid = makeUserUuid(); + this.collection = getCollection(); + this.artifact = getArtifact(); + } + + private String makeUserUuid() throws ConnectionException { + final User user = new DefaultUser(this.username, this.password, null, false, new ArrayList(), new ArrayList()); + final UserClient userClient = new UserClient(this.serverUrl); + Element userElement; + + userElement = userClient.findUser(user); + return userElement.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "uuid"); + + } + + protected final Artifact getArtifact() throws ServerException, ConnectionException { + if (this.artifact == null) { + this.artifact = ArtifactHelper.createArtifact(this.serverUrl, this.locale, this.infotype, null); + setCollection(CollectionHelper.addArtifact(getCollection(), this.artifact, this.serverUrl, this.locale)); // wichtig; sorgt für Persistenz + } + return this.artifact; + } + + private Collection getCollection() throws ConnectionException { + + if (this.collection == null) { + // lazy-Loading + final Document create = ClientProtocolUtils.newCreateCollectionDocument(null); + final Document doc = (Document) this.client.createCollection(create, this.userUuid, new DocumentResponseHandler()); + final String uuid = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_UUID, ArtifactNamespaceContext.INSTANCE); + final String ttlStr = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_TTL, ArtifactNamespaceContext.INSTANCE); + this.collection = new DefaultCollection(uuid, Long.valueOf(ttlStr), uuid); + } + return this.collection; + + } + + private void setCollection(final Collection collection) { + this.collection = collection; + } + + private void setArtifact(final Artifact artifact) { + this.artifact = artifact; + } + + public abstract void runTest(final boolean exportToFile) throws ConnectionException, ServerException, IOException; + + protected final void describeCollection() throws ConnectionException { + + final String uuid = getCollection().identifier(); + final Document describe = ClientProtocolUtils.newDescribeCollectionDocument(uuid); + final Document response = (Document) this.client.doCollectionAction(describe, uuid, new DocumentResponseHandler()); + final Collection c = CollectionHelper.parseCollection(response); + setCollection(c); + + } + + protected final void feedAndGo(final Data[] data, final int reachableStateIndex) throws ConnectionException, ServerException { + feed(data); + advance(getReachableStateByIndex(getArtifact(), reachableStateIndex)); // reachablestate könnte auch String sein... TODO: feedAndgo(data,string) + // bauen, falls irgendwann erforderlich + } + + private String getReachableStateByIndex(final Artifact artifact, final int index) { + + final String[] states = artifact.getArtifactDescription().getReachableStates(); + if (states != null) { + if (states.length > index) { + return states[index]; + } else { + return states[0]; + } + } else { + return ""; + } + } + + private void feed(final Data[] data) throws ServerException, ConnectionException { + final Document feed = ClientProtocolUtils.newFeedDocument(getArtifact().getUuid(), getArtifact().getHash(), createKVP(data)); + final Document description = (Document) this.client.feed( + new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), feed, + new DocumentResponseHandler()); + + final String result = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); + + if (result == null || !result.equals(FeedServiceImpl.OPERATION_FAILURE)) { + setArtifact((Artifact) new FLYSArtifactCreator().create(description)); + } else if (result != null && result.equals(FeedServiceImpl.OPERATION_FAILURE)) { + final String msg = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT_MSG, ArtifactNamespaceContext.INSTANCE); + throw new ServerException(msg); + } + } + + private String[][] createKVP(final Data[] data) { + if (data != null) { + final String[][] kvp = new String[data.length][]; + + int i = 0; + + for (final Data d : data) { + // final DataItem[] items = d.getItems(); + final String key = d.getLabel(); + final String value = d.getStringValue(); + + kvp[i++] = new String[] { key, value }; + } + + return kvp; + } + return null; + } + + private void advance(final String target) throws ConnectionException, ServerException { + final Document advance = ClientProtocolUtils.newAdvanceDocument(getArtifact().getUuid(), getArtifact().getHash(), target); + final Document description = (Document) this.client.advance( + new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), advance, + new DocumentResponseHandler()); + + if (description == null) { + throw new ServerException(AdvanceServiceImpl.ERROR_ADVANCE_ARTIFACT); + } + + final String result = XMLUtils.xpathString(description, AdvanceServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); + + if (result == null || !result.equals(AdvanceServiceImpl.OPERATION_FAILURE)) { + setArtifact((Artifact) new FLYSArtifactCreator().create(description)); + } + } + + protected final Artifact[] loadMany(final Recommendation[] recoms, final String factory) throws ServerException, ConnectionException { + final ArrayList artifacts = new ArrayList(); + final HashMap cloneMap = new HashMap(); + + for (final Recommendation recom : recoms) { + + final Artifact prevClone = cloneMap.get(recom); + if (prevClone != null) { + + artifacts.add(prevClone); + } else { + // Not already cloned. + final String realFactory = factory != null ? factory : recom.getFactory(); + + final Artifact clone = ArtifactHelper.createArtifact(this.serverUrl, this.locale, realFactory, recom); + + if (clone != null) { + final Collection c = CollectionHelper.addArtifact(getCollection(), clone, this.serverUrl, this.locale); + + if (c != null) { + artifacts.add(clone); + // Remember we cloned a recommendation like this. + cloneMap.put(recom, clone); + } else { + throw new ServerException(LoadArtifactServiceImpl.ERROR_LOAD_ARTIFACT); + } + } + } + } + return artifacts.toArray(new Artifact[artifacts.size()]); + + } + + /// ExportServiceImpl + public void doGet(final String mode, final boolean exportToFile) throws IOException { + + final String name = mode; + final String type = "csv"; + + final String fn = name + "." + type; // TODO: make filename unique + final String enc = "windows-1252";// req.getParameter("encoding"); + + final URL expectedResource = getClass().getResource("/sinfo/flowdepthminmax/" + fn); + final Document attr = null; + final Document request = ClientProtocolUtils.newOutCollectionDocument(getCollection().identifier(), mode, type, attr); + + final InputStream response = this.client.collectionOut(request, getCollection().identifier(), mode); + + final String actual = deleteErstelldatum(IOUtils.toString(response, "UTF-8")); + + final String expected = deleteErstelldatum(FileUtils.readFileToString(new File(expectedResource.getFile()), enc)); + + // if (!actual.equals(expected)) { + if (exportToFile) { + doGetWriteToDisk(mode); // TODO: WENN der Test negativ ausfällt, Datei abspeichern -> Diskussion + } + Assert.assertEquals(actual, expected); + + } + + private String deleteErstelldatum(final String input) { + String result = ""; + final String[] lines = input.split(System.lineSeparator()); + for (final String line : lines) { + if (!line.contains(SuperTest.erstellDatumSearchString)) { + result = result + line + System.lineSeparator(); + } + } + return result; + } + + public void doGetWriteToDisk(final String mode) throws FileNotFoundException, IOException { + + final String name = mode; + final String type = "csv"; + + final String fn = name + "." + type; // TODO: make filename unique + final String enc = "windows-1252"; + + final String filepath = exportFileDir + fn; + + final Document attr = null; + final Document request = ClientProtocolUtils.newOutCollectionDocument(getCollection().identifier(), mode, type, attr); + + final InputStream response = this.client.collectionOut(request, getCollection().identifier(), mode); + final InputStreamReader in = new InputStreamReader(response, "UTF-8"); + + IOUtils.copy(in, new FileOutputStream(filepath), enc); + + } + + public void addRecommendationPair(final String[] rec1, final String[] rec2) throws ConnectionException, ServerException { + final Recommendation recom1 = new Recommendation(rec1[0], rec1[1], rec1[2]); + final Recommendation recom2 = new Recommendation(rec2[0], rec2[1], rec2[2]); + final Artifact[] artifacts = loadMany(new Recommendation[] { recom1, recom2 }, null); + final String rec1String = RecommandationUtils.createDataString(artifacts[0].getUuid(), recom1, new NilDatacageTwinPanelInfo("xxxx")); + final String rec2String = RecommandationUtils.createDataString(artifacts[1].getUuid(), recom2, new NilDatacageTwinPanelInfo("xxxx")); + // TODO: check display name recom1.getDisplayName() TODO: makeDisplayName + final String combinedIdNeu = rec1String + "#" + rec2String; + this.pairIds.add(combinedIdNeu); + } + + protected Data[] getPairData() { + final Data[] data = new Data[this.pairIds.size()]; + int i = 0; + for (final String pairId : this.pairIds) { + final Data pair = new StringOptionsData("diffids", "diffids", new DataItem[] { new DefaultDataItem(pairId, pairId, pairId) }); + data[i] = pair; + i++; + } + return data; + } +} diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/test/java/test/TestMain.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/test/java/test/TestMain.java Fri Apr 27 11:34:04 2018 +0200 @@ -0,0 +1,41 @@ +package test; + +/* + * Copyright (c) 2010 by Intevation GmbH + * + * This program is free software under the LGPL (>=v2.1) + * Read the file LGPL.txt coming with the software for details + * or visit http://www.gnu.org/licenses/ if it does not exist. + */ + +import java.io.IOException; + +import org.dive4elements.river.client.shared.exceptions.ServerException; +import org.junit.Test; + +/** + * @author Ingo Weinzierl + */ +public class TestMain { + + @Test + public void testSInfoFlowDepthMinMax() throws ServerException, IOException { + // TODO Auto-generated method stub + + /* + * S-Info-calcModes: + * sinfo_calc_flow_depth + * sinfo_calc_flow_depth_development + * sinfo_calc_flow_depth_minmax + * sinfo_calc_grounding + * Transportkörperhöhen + * sinfo_calc_infrastructures_inundation_duration + */ + + final SinfoTest proof = new SinfoTest("belger", "belger", "sinfo", "sinfo_calc_flow_depth_minmax"); + proof.addRecommendationPair(new String[] { "staticwqkms", "additionals-wstv-0-103", "sinfo_flowdepth_waterlevels" }, + new String[] { "bedheight", "bedheight-single-36-2015-FP-2015_0-502", "sinfo_flowdepthminmax_heights" }); + proof.runTest(true); + } + +} diff -r 4dc047fb3633 -r efd2de78d158 gwt-client/src/test/resources/sinfo/flowdepthminmax/sinfo_flowdepthminmax_export.csv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/test/resources/sinfo/flowdepthminmax/sinfo_flowdepthminmax_export.csv Fri Apr 27 11:34:04 2018 +0200 @@ -0,0 +1,184 @@ +"##Ergebnisausgabe - Beispielfluss - Minimale und Maximale Fließtiefe" +"# FLYS-Version: 3.3.x" +"# Bearbeiter: belger" +"# Datum der Erstellung: 26.04.18" +"# Gewässer: Beispielfluss" +"# Höhensystem des Flusses: NHN + m " +"# Bereich (km): 10,000 - 100,000" +"" +"Fluss-km";"Minimale Fließtiefe [m]";"Maximale Fließtiefe [m]";"Wasserstand [NHN + m]";"Q [m³/s]";"Bezeichnung";"Bezugspegel";"Mittlere Sohlhöhe [NHN + m]";"Peilung/Epoche";"Lage" +"" +"##METADATEN PEILUNG" +"# Jahr der Peilung: 2015" +"# Aufnahmeart: Flächenpeilung" +"# Auswerter: BfG" +"# Lagesystem: LS 150 oder LS 100 " +"# Höhensystem: NHN " +"# ursprüngliches Höhensystem: NHN" +"" +"##METADATEN WASSERSPIEGELLAGE" +"# Bezeichnung der Wasserspiegellage: null " +"# Bezugspegel: Torgau" +"" +"41,600";"2,38";"3,71";"77,06";"85,73";"null";"Torgau";"74,29";"FP-2015_0-502";"" +"41,700";"1,98";"3,19";"77,04";"85,73";"null";"Torgau";"74,42";"FP-2015_0-502";"" +"41,800";"1,93";"3,15";"77,02";"85,73";"null";"Torgau";"74,57";"FP-2015_0-502";"" +"41,900";"1,86";"3,13";"77,00";"85,73";"null";"Torgau";"74,58";"FP-2015_0-502";"" +"42,000";"1,76";"3,75";"76,97";"85,73";"null";"Torgau";"74,60";"FP-2015_0-502";"" +"42,100";"1,80";"3,15";"76,90";"85,73";"null";"Torgau";"74,58";"FP-2015_0-502";"" +"42,200";"1,51";"2,98";"76,83";"85,73";"null";"Torgau";"74,45";"FP-2015_0-502";"" +"42,300";"2,13";"2,92";"76,81";"85,73";"null";"Torgau";"74,30";"FP-2015_0-502";"" +"42,400";"2,23";"3,12";"76,79";"85,73";"null";"Torgau";"74,23";"FP-2015_0-502";"" +"42,500";"1,87";"3,79";"76,78";"85,73";"null";"Torgau";"73,99";"FP-2015_0-502";"" +"42,600";"1,78";"4,07";"76,76";"85,73";"null";"Torgau";"73,93";"FP-2015_0-502";"" +"42,700";"1,78";"4,58";"76,75";"85,73";"null";"Torgau";"74,00";"FP-2015_0-502";"" +"42,800";"1,84";"4,71";"76,73";"85,73";"null";"Torgau";"73,96";"FP-2015_0-502";"" +"42,900";"1,97";"4,81";"76,72";"85,73";"null";"Torgau";"73,64";"FP-2015_0-502";"" +"43,000";"1,74";"4,98";"76,70";"85,73";"null";"Torgau";"73,78";"FP-2015_0-502";"" +"43,100";"1,97";"3,84";"76,70";"85,73";"null";"Torgau";"74,06";"FP-2015_0-502";"" +"43,200";"2,06";"3,77";"76,69";"85,73";"null";"Torgau";"74,00";"FP-2015_0-502";"" +"43,300";"2,25";"2,99";"76,68";"85,73";"null";"Torgau";"74,09";"FP-2015_0-502";"" +"43,400";"2,17";"3,27";"76,66";"85,73";"null";"Torgau";"74,03";"FP-2015_0-502";"" +"43,500";"1,86";"3,14";"76,64";"85,73";"null";"Torgau";"73,96";"FP-2015_0-502";"" +"43,600";"1,77";"3,43";"76,61";"85,73";"null";"Torgau";"74,07";"FP-2015_0-502";"" +"43,700";"1,72";"4,10";"76,58";"85,73";"null";"Torgau";"74,08";"FP-2015_0-502";"" +"43,800";"1,77";"3,57";"76,54";"85,73";"null";"Torgau";"74,10";"FP-2015_0-502";"" +"43,900";"1,79";"3,42";"76,53";"85,73";"null";"Torgau";"74,00";"FP-2015_0-502";"" +"44,000";"1,71";"3,60";"76,51";"85,73";"null";"Torgau";"74,13";"FP-2015_0-502";"" +"44,100";"1,92";"3,36";"76,49";"85,73";"null";"Torgau";"74,08";"FP-2015_0-502";"" +"44,200";"2,06";"3,48";"76,46";"85,73";"null";"Torgau";"73,86";"FP-2015_0-502";"" +"44,300";"1,84";"3,89";"76,43";"85,73";"null";"Torgau";"73,80";"FP-2015_0-502";"" +"44,400";"1,88";"3,70";"76,40";"85,73";"null";"Torgau";"73,78";"FP-2015_0-502";"" +"44,500";"2,01";"5,10";"76,38";"85,73";"null";"Torgau";"73,40";"FP-2015_0-502";"" +"44,600";"2,34";"5,11";"76,36";"85,73";"null";"Torgau";"73,08";"FP-2015_0-502";"" +"44,700";"2,83";"4,23";"76,36";"85,73";"null";"Torgau";"73,12";"FP-2015_0-502";"" +"44,800";"2,45";"3,54";"76,35";"85,73";"null";"Torgau";"73,25";"FP-2015_0-502";"" +"44,900";"2,34";"3,66";"76,34";"85,73";"null";"Torgau";"73,34";"FP-2015_0-502";"" +"45,000";"2,04";"3,41";"76,33";"85,73";"null";"Torgau";"73,53";"FP-2015_0-502";"" +"45,100";"1,92";"3,43";"76,33";"85,73";"null";"Torgau";"73,62";"FP-2015_0-502";"" +"45,200";"2,43";"3,64";"76,32";"85,73";"null";"Torgau";"73,38";"FP-2015_0-502";"" +"45,300";"2,34";"3,84";"76,31";"85,73";"null";"Torgau";"73,31";"FP-2015_0-502";"" +"45,400";"1,98";"4,03";"76,30";"85,73";"null";"Torgau";"73,19";"FP-2015_0-502";"" +"45,500";"2,40";"4,01";"76,30";"85,73";"null";"Torgau";"73,09";"FP-2015_0-502";"" +"45,600";"2,32";"3,93";"76,29";"85,73";"null";"Torgau";"73,07";"FP-2015_0-502";"" +"45,700";"2,15";"3,77";"76,28";"85,73";"null";"Torgau";"73,37";"FP-2015_0-502";"" +"45,800";"2,20";"4,16";"76,27";"85,73";"null";"Torgau";"73,37";"FP-2015_0-502";"Hafen: Torgau" +"45,900";"2,33";"3,85";"76,26";"85,73";"null";"Torgau";"73,21";"FP-2015_0-502";"" +"46,000";"2,04";"3,67";"76,25";"85,73";"null";"Torgau";"73,50";"FP-2015_0-502";"" +"46,100";"1,95";"3,81";"76,24";"85,73";"null";"Torgau";"73,45";"FP-2015_0-502";"Brücke: Torgau -Straße B87" +"46,200";"1,92";"2,93";"76,23";"85,73";"null";"Torgau";"73,80";"FP-2015_0-502";"" +"46,300";"1,96";"2,94";"76,17";"85,73";"null";"Torgau";"73,75";"FP-2015_0-502";"" +"46,400";"1,96";"2,82";"76,10";"85,73";"null";"Torgau";"73,73";"FP-2015_0-502";"" +"46,500";"1,87";"3,17";"76,07";"85,73";"null";"Torgau";"73,73";"FP-2015_0-502";"" +"46,600";"2,02";"2,97";"76,04";"85,73";"null";"Torgau";"73,73";"FP-2015_0-502";"" +"46,700";"1,86";"2,81";"76,01";"85,73";"null";"Torgau";"73,66";"FP-2015_0-502";"" +"46,800";"2,08";"2,83";"75,98";"85,73";"null";"Torgau";"73,63";"FP-2015_0-502";"Geschiebemessstelle: Torgau" +"46,900";"2,07";"2,99";"75,97";"85,73";"null";"Torgau";"73,57";"FP-2015_0-502";"" +"47,000";"2,11";"3,08";"75,97";"85,73";"null";"Torgau";"73,38";"FP-2015_0-502";"" +"47,100";"2,34";"3,03";"75,95";"85,73";"null";"Torgau";"73,34";"FP-2015_0-502";"" +"47,200";"2,08";"3,11";"75,92";"85,73";"null";"Torgau";"73,30";"FP-2015_0-502";"" +"47,300";"2,35";"4,01";"75,90";"85,73";"null";"Torgau";"73,09";"FP-2015_0-502";"" +"47,400";"2,37";"4,22";"75,88";"85,73";"null";"Torgau";"72,86";"FP-2015_0-502";"" +"47,500";"2,52";"4,36";"75,88";"85,73";"null";"Torgau";"72,56";"FP-2015_0-502";"" +"47,600";"2,61";"4,05";"75,88";"85,73";"null";"Torgau";"72,52";"FP-2015_0-502";"" +"47,700";"2,39";"3,89";"75,87";"85,73";"null";"Torgau";"72,84";"FP-2015_0-502";"" +"47,800";"2,32";"3,98";"75,86";"85,73";"null";"Torgau";"72,81";"FP-2015_0-502";"" +"47,900";"2,52";"4,13";"75,84";"85,73";"null";"Torgau";"72,63";"FP-2015_0-502";"" +"48,000";"2,17";"3,73";"75,82";"85,73";"null";"Torgau";"72,73";"FP-2015_0-502";"" +"48,100";"2,27";"3,60";"75,81";"85,73";"null";"Torgau";"72,88";"FP-2015_0-502";"" +"48,200";"2,14";"3,40";"75,79";"85,73";"null";"Torgau";"72,85";"FP-2015_0-502";"" +"48,300";"2,17";"3,50";"75,77";"85,73";"null";"Torgau";"72,94";"FP-2015_0-502";"" +"48,400";"2,01";"3,92";"75,74";"85,73";"null";"Torgau";"72,72";"FP-2015_0-502";"" +"48,500";"2,07";"3,18";"75,73";"85,73";"null";"Torgau";"72,95";"FP-2015_0-502";"" +"48,600";"2,10";"3,40";"75,71";"85,73";"null";"Torgau";"72,89";"FP-2015_0-502";"" +"48,700";"1,82";"4,02";"75,69";"85,73";"null";"Torgau";"72,70";"FP-2015_0-502";"" +"48,800";"1,48";"4,65";"75,66";"85,73";"null";"Torgau";"72,64";"FP-2015_0-502";"" +"48,900";"1,47";"5,03";"75,63";"85,73";"null";"Torgau";"72,48";"FP-2015_0-502";"" +"49,000";"2,53";"4,05";"75,60";"85,73";"null";"Torgau";"72,29";"FP-2015_0-502";"" +"49,100";"2,02";"3,44";"75,59";"85,73";"null";"Torgau";"72,75";"FP-2015_0-502";"" +"49,200";"2,31";"3,39";"75,58";"85,73";"null";"Torgau";"72,84";"FP-2015_0-502";"" +"49,300";"2,02";"3,10";"75,53";"85,73";"null";"Torgau";"72,94";"FP-2015_0-502";"" +"49,400";"2,01";"3,57";"75,48";"85,73";"null";"Torgau";"72,79";"FP-2015_0-502";"" +"49,500";"2,47";"3,11";"75,48";"85,73";"null";"Torgau";"72,59";"FP-2015_0-502";"" +"49,600";"1,74";"3,11";"75,48";"85,73";"null";"Torgau";"72,80";"FP-2015_0-502";"" +"49,700";"1,85";"4,02";"75,45";"85,73";"null";"Torgau";"72,89";"FP-2015_0-502";"" +"49,800";"1,98";"3,65";"75,42";"85,73";"null";"Torgau";"72,66";"FP-2015_0-502";"" +"49,900";"2,20";"3,61";"75,42";"85,73";"null";"Torgau";"72,39";"FP-2015_0-502";"" +"50,000";"2,03";"3,48";"75,41";"85,73";"null";"Torgau";"72,60";"FP-2015_0-502";"" +"50,100";"1,87";"3,48";"75,38";"85,73";"null";"Torgau";"72,60";"FP-2015_0-502";"" +"50,200";"1,88";"4,10";"75,35";"85,73";"null";"Torgau";"72,38";"FP-2015_0-502";"" +"50,300";"2,03";"4,32";"75,33";"85,73";"null";"Torgau";"72,16";"FP-2015_0-502";"" +"50,400";"1,91";"3,96";"75,30";"85,73";"null";"Torgau";"72,44";"FP-2015_0-502";"" +"50,500";"1,88";"3,46";"75,28";"85,73";"null";"Torgau";"72,64";"FP-2015_0-502";"" +"50,600";"1,93";"3,27";"75,26";"85,73";"null";"Torgau";"72,67";"FP-2015_0-502";"" +"50,700";"1,76";"3,35";"75,22";"85,73";"null";"Torgau";"72,67";"FP-2015_0-502";"" +"50,800";"1,84";"3,24";"75,17";"85,73";"null";"Torgau";"72,65";"FP-2015_0-502";"" +"50,900";"1,84";"3,47";"75,13";"85,73";"null";"Torgau";"72,46";"FP-2015_0-502";"" +"51,000";"1,50";"3,81";"75,08";"85,73";"null";"Torgau";"72,41";"FP-2015_0-502";"" +"51,100";"1,63";"4,71";"75,02";"85,73";"null";"Torgau";"72,05";"FP-2015_0-502";"" +"51,200";"2,03";"4,68";"74,97";"85,73";"null";"Torgau";"71,92";"FP-2015_0-502";"" +"51,300";"2,21";"4,08";"74,96";"85,73";"null";"Torgau";"72,00";"FP-2015_0-502";"" +"51,400";"1,85";"4,51";"74,94";"85,73";"null";"Torgau";"71,86";"FP-2015_0-502";"" +"51,500";"1,94";"3,46";"74,92";"85,73";"null";"Torgau";"72,12";"FP-2015_0-502";"" +"51,600";"1,77";"3,48";"74,90";"85,73";"null";"Torgau";"72,10";"FP-2015_0-502";"" +"94,100";"2,16";"3,16";"66,61";"91,31";"null";"außerh. d. Bez.pegels";"63,90";"FP-2015_0-502";"" +"94,200";"2,46";"2,95";"66,60";"91,31";"null";"außerh. d. Bez.pegels";"63,91";"FP-2015_0-502";"" +"94,300";"2,27";"3,24";"66,58";"91,31";"null";"außerh. d. Bez.pegels";"63,91";"FP-2015_0-502";"" +"94,400";"1,99";"3,03";"66,55";"91,31";"null";"außerh. d. Bez.pegels";"63,94";"FP-2015_0-502";"" +"94,500";"2,01";"3,00";"66,52";"91,31";"null";"außerh. d. Bez.pegels";"63,97";"FP-2015_0-502";"" +"94,600";"1,95";"2,75";"66,49";"91,31";"null";"außerh. d. Bez.pegels";"64,10";"FP-2015_0-502";"HW-Schutz: Galliner-Deich" +"94,700";"1,89";"2,88";"66,47";"91,31";"null";"außerh. d. Bez.pegels";"64,12";"FP-2015_0-502";"" +"94,800";"1,99";"3,67";"66,44";"91,31";"null";"außerh. d. Bez.pegels";"64,04";"FP-2015_0-502";"" +"94,900";"1,87";"3,85";"66,41";"91,31";"null";"außerh. d. Bez.pegels";"63,94";"FP-2015_0-502";"" +"95,000";"2,14";"3,33";"66,37";"91,31";"null";"außerh. d. Bez.pegels";"63,84";"FP-2015_0-502";"" +"95,100";"2,25";"3,06";"66,34";"91,31";"null";"außerh. d. Bez.pegels";"63,65";"FP-2015_0-502";"" +"95,200";"1,87";"3,04";"66,31";"91,31";"null";"außerh. d. Bez.pegels";"63,65";"FP-2015_0-502";"" +"95,300";"2,03";"3,05";"66,29";"91,31";"null";"außerh. d. Bez.pegels";"63,61";"FP-2015_0-502";"" +"95,400";"1,97";"2,92";"66,27";"91,31";"null";"außerh. d. Bez.pegels";"63,77";"FP-2015_0-502";"" +"95,500";"2,29";"2,89";"66,23";"91,31";"null";"außerh. d. Bez.pegels";"63,70";"FP-2015_0-502";"" +"95,600";"2,24";"2,85";"66,18";"91,31";"null";"außerh. d. Bez.pegels";"63,77";"FP-2015_0-502";"" +"95,700";"2,06";"2,98";"66,15";"91,31";"null";"außerh. d. Bez.pegels";"63,67";"FP-2015_0-502";"" +"95,800";"2,04";"3,04";"66,12";"91,31";"null";"außerh. d. Bez.pegels";"63,52";"FP-2015_0-502";"" +"95,900";"2,16";"3,54";"66,10";"91,31";"null";"außerh. d. Bez.pegels";"63,51";"FP-2015_0-502";"" +"96,000";"2,10";"3,73";"66,07";"91,31";"null";"außerh. d. Bez.pegels";"63,25";"FP-2015_0-502";"" +"96,100";"2,32";"3,80";"66,05";"91,31";"null";"außerh. d. Bez.pegels";"63,08";"FP-2015_0-502";"" +"96,200";"2,28";"3,37";"66,02";"91,31";"null";"außerh. d. Bez.pegels";"63,17";"FP-2015_0-502";"" +"96,300";"2,25";"3,13";"66,02";"91,31";"null";"außerh. d. Bez.pegels";"63,28";"FP-2015_0-502";"" +"96,400";"2,18";"3,09";"66,01";"91,31";"null";"außerh. d. Bez.pegels";"63,45";"FP-2015_0-502";"" +"96,500";"2,13";"3,07";"65,99";"91,31";"null";"außerh. d. Bez.pegels";"63,51";"FP-2015_0-502";"" +"96,600";"2,03";"3,07";"65,97";"91,31";"null";"außerh. d. Bez.pegels";"63,30";"FP-2015_0-502";"" +"96,700";"1,79";"3,62";"65,96";"91,31";"null";"außerh. d. Bez.pegels";"63,36";"FP-2015_0-502";"" +"96,800";"1,74";"3,55";"65,94";"91,31";"null";"außerh. d. Bez.pegels";"63,26";"FP-2015_0-502";"" +"96,900";"2,11";"3,21";"65,92";"91,31";"null";"außerh. d. Bez.pegels";"63,12";"FP-2015_0-502";"" +"97,000";"2,03";"2,96";"65,90";"91,31";"null";"außerh. d. Bez.pegels";"63,36";"FP-2015_0-502";"" +"97,100";"2,05";"2,72";"65,87";"91,31";"null";"außerh. d. Bez.pegels";"63,49";"FP-2015_0-502";"Zufluss: Alte Elbe" +"97,200";"2,23";"4,19";"65,84";"91,31";"null";"außerh. d. Bez.pegels";"63,27";"FP-2015_0-502";"" +"97,300";"1,97";"4,05";"65,82";"91,31";"null";"außerh. d. Bez.pegels";"63,07";"FP-2015_0-502";"" +"97,400";"2,06";"3,45";"65,80";"91,31";"null";"außerh. d. Bez.pegels";"62,90";"FP-2015_0-502";"" +"97,500";"1,77";"3,87";"65,80";"91,31";"null";"außerh. d. Bez.pegels";"62,85";"FP-2015_0-502";"" +"97,600";"1,99";"3,80";"65,79";"91,31";"null";"außerh. d. Bez.pegels";"62,94";"FP-2015_0-502";"" +"97,700";"2,04";"3,43";"65,77";"91,31";"null";"außerh. d. Bez.pegels";"63,07";"FP-2015_0-502";"" +"97,800";"1,93";"3,56";"65,74";"91,31";"null";"außerh. d. Bez.pegels";"63,11";"FP-2015_0-502";"" +"97,900";"2,14";"3,46";"65,72";"91,31";"null";"außerh. d. Bez.pegels";"63,07";"FP-2015_0-502";"" +"98,000";"2,18";"3,27";"65,70";"91,31";"null";"außerh. d. Bez.pegels";"62,99";"FP-2015_0-502";"" +"98,100";"2,21";"3,79";"65,69";"91,31";"null";"außerh. d. Bez.pegels";"63,00";"FP-2015_0-502";"" +"98,200";"2,00";"3,47";"65,67";"91,31";"null";"außerh. d. Bez.pegels";"62,99";"FP-2015_0-502";"" +"98,300";"1,90";"3,66";"65,66";"91,31";"null";"außerh. d. Bez.pegels";"63,26";"FP-2015_0-502";"" +"98,400";"2,06";"3,30";"65,64";"91,31";"null";"außerh. d. Bez.pegels";"63,25";"FP-2015_0-502";"" +"98,500";"1,95";"3,89";"65,61";"91,31";"null";"außerh. d. Bez.pegels";"63,22";"FP-2015_0-502";"" +"98,600";"1,93";"2,96";"65,58";"91,31";"null";"außerh. d. Bez.pegels";"63,28";"FP-2015_0-502";"" +"98,700";"1,90";"2,95";"65,54";"91,31";"null";"außerh. d. Bez.pegels";"62,97";"FP-2015_0-502";"" +"98,800";"1,88";"3,27";"65,50";"91,31";"null";"außerh. d. Bez.pegels";"62,77";"FP-2015_0-502";"" +"98,900";"2,08";"3,55";"65,47";"91,31";"null";"außerh. d. Bez.pegels";"62,57";"FP-2015_0-502";"" +"99,000";"2,18";"3,81";"65,45";"91,31";"null";"außerh. d. Bez.pegels";"62,37";"FP-2015_0-502";"" +"99,100";"2,05";"3,70";"65,45";"91,31";"null";"außerh. d. Bez.pegels";"62,51";"FP-2015_0-502";"" +"99,200";"1,90";"4,12";"65,44";"91,31";"null";"außerh. d. Bez.pegels";"62,50";"FP-2015_0-502";"" +"99,300";"2,11";"3,76";"65,43";"91,31";"null";"außerh. d. Bez.pegels";"62,60";"FP-2015_0-502";"" +"99,400";"2,11";"3,55";"65,41";"91,31";"null";"außerh. d. Bez.pegels";"62,80";"FP-2015_0-502";"" +"99,500";"2,22";"2,83";"65,40";"91,31";"null";"außerh. d. Bez.pegels";"62,84";"FP-2015_0-502";"" +"99,600";"2,21";"2,75";"65,38";"91,31";"null";"außerh. d. Bez.pegels";"62,92";"FP-2015_0-502";"" +"99,700";"2,23";"2,88";"65,36";"91,31";"null";"außerh. d. Bez.pegels";"62,91";"FP-2015_0-502";"" +"99,800";"2,15";"2,84";"65,34";"91,31";"null";"außerh. d. Bez.pegels";"62,88";"FP-2015_0-502";"" +"99,900";"2,17";"2,75";"65,31";"91,31";"null";"außerh. d. Bez.pegels";"62,79";"FP-2015_0-502";"" +"100,000";"2,13";"2,78";"65,29";"91,31";"null";"außerh. d. Bez.pegels";"62,84";"FP-2015_0-502";"" +""