changeset 9028:7f3818ec6eb6

work on proof 2
author gernotbelger
date Thu, 26 Apr 2018 13:12:33 +0200
parents 274ddafb719b
children 3e90c84f3aea
files gwt-client/src/main/java/org/dive4elements/river/client/test/ProofMain.java gwt-client/src/main/java/org/dive4elements/river/client/test/SinfoProof.java gwt-client/src/main/java/org/dive4elements/river/client/test/SuperProof.java
diffstat 3 files changed, 342 insertions(+), 299 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/test/ProofMain.java	Thu Apr 26 13:12:33 2018 +0200
@@ -0,0 +1,32 @@
+/*
+ * 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 <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
+ */
+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();
+    }
+
+}
--- a/gwt-client/src/main/java/org/dive4elements/river/client/test/SinfoProof.java	Thu Apr 26 10:46:12 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,299 +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.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.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.DataList;
-import org.dive4elements.river.client.shared.model.DefaultCollection;
-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;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
- */
-public class SinfoProof {
-
-    private static final String serverUrl = "http://localhost:8181";
-    private static final String locale = "de";
-
-    public static void main(final String[] args) throws ServerException, IOException {
-        // logger.info("Starting console client.");
-
-        final User user = new DefaultUser("belger", "belger", null, false, new ArrayList<String>(), new ArrayList<String>());
-        final UserClient userClient = new UserClient(serverUrl);
-        final Element userElement = userClient.findUser(user);
-        final String userUuid = userElement.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "uuid");
-
-        /* Init Collection */
-        final Collection collection = createCollection(serverUrl, locale, userUuid);
-        final org.dive4elements.river.client.shared.model.Artifact sinfoArtifact = ArtifactHelper.createArtifact(serverUrl, locale, "sinfo", null);
-        final Collection newColl = CollectionHelper.addArtifact(collection, sinfoArtifact, serverUrl, locale); // wichtig; sorgt für Persistenz
-
-        /* Select River */
-        final Data data = new StringOptionsData("river", "river", new DataItem[] { new DefaultDataItem("Beispielfluss", "Beispielfluss", "Beispielfluss") });
-        final Artifact calcModeArtifact = feedAndGo(sinfoArtifact, new Data[] { data }, 0);
-
-        /* Select CalcMode */
-        final DataList calcModes = calcModeArtifact.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 });
-        final Artifact rangeArtifact = feedAndGo(calcModeArtifact, 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 = rangeArtifact.getArtifactDescription().getCurrentData();
-        final Data[] rangeMax = new Data[] { list.get(0), list.get(1) };
-
-        final Artifact dataChoiceArtifact = feedAndGo(rangeArtifact, rangeFromToDetermined, 0);
-
-        /* Select Fixpunkte */
-        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(collection, 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) });
-        final Artifact exportArtifact = feedAndGo(dataChoiceArtifact, new Data[] { pair }, 0);
-
-        // Describe collection
-        describeCollection(collection); // wichtig, damit die Facets erzeugt werden
-
-        // /* Export calculation */
-        final OutputMode[] modes = exportArtifact.getArtifactDescription().getOutputModes();
-        if (modes != null) {
-            final OutputMode mode = modes[1]; // output.sinfo_flowdepthminmax_export
-            doGet(mode.getName(), collection.identifier());
-        }
-    }
-
-    private static Collection describeCollection(final Collection collection) throws ConnectionException {
-
-        final String uuid = collection.identifier();
-
-        final Document describe = ClientProtocolUtils.newDescribeCollectionDocument(uuid);
-
-        final HttpClient client = new HttpClientImpl(serverUrl, locale);
-
-        final Document response = (Document) client.doCollectionAction(describe, uuid, new DocumentResponseHandler());
-
-        final Collection c = CollectionHelper.parseCollection(response);
-
-        return c;
-    }
-
-    private static Artifact feedAndGo(final Artifact inputArtifact, final Data[] data, final int reachableStateIndex)
-            throws ConnectionException, ServerException {
-        final Artifact artifact = feed(serverUrl, locale, inputArtifact, data);
-        return advance(serverUrl, locale, artifact, getReachableStateByIndex(artifact, reachableStateIndex));
-    }
-
-    private static 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 "";
-        }
-    }
-
-    public static Collection createCollection(final String url, final String locale, final String ownerId) throws ConnectionException {
-        final Document create = ClientProtocolUtils.newCreateCollectionDocument(null);
-        final HttpClient client = new HttpClientImpl(url, locale);
-        final Document doc = (Document) client.createCollection(create, ownerId, 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);
-
-        return new DefaultCollection(uuid, Long.valueOf(ttlStr), uuid);
-    }
-
-    public static Artifact feed(final String url, final String locale, final Artifact artifact, final Data[] data) throws ServerException, ConnectionException {
-        final Document feed = ClientProtocolUtils.newFeedDocument(artifact.getUuid(), artifact.getHash(), createKVP(data));
-
-        final HttpClient client = new HttpClientImpl(url, locale);
-
-        final Document description = (Document) client.feed(new org.dive4elements.artifacts.httpclient.objects.Artifact(artifact.getUuid(), artifact.getHash()),
-                feed, new DocumentResponseHandler());
-
-        final String result = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE);
-
-        if (result == null || !result.equals(FeedServiceImpl.OPERATION_FAILURE)) {
-            return (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);
-    }
-
-    protected static 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;
-    }
-
-    public static Artifact advance(final String url, final String locale, final Artifact artifact, final String target)
-            throws ConnectionException, ServerException {
-        final Document advance = ClientProtocolUtils.newAdvanceDocument(artifact.getUuid(), artifact.getHash(), target);
-        final HttpClient client = new HttpClientImpl(url, locale);
-
-        final Document description = (Document) client.advance(
-                new org.dive4elements.artifacts.httpclient.objects.Artifact(artifact.getUuid(), artifact.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)) {
-            return (Artifact) new FLYSArtifactCreator().create(description);
-        }
-
-        throw new ServerException(AdvanceServiceImpl.ERROR_ADVANCE_ARTIFACT);
-    }
-
-    public static Artifact[] loadMany(final Collection parent, final Recommendation[] recoms, final String factory) throws ServerException {
-
-        final ArrayList<Artifact> artifacts = new ArrayList<Artifact>();
-        final HashMap<Recommendation, Artifact> cloneMap = new HashMap<Recommendation, Artifact>();
-
-        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(serverUrl, locale, realFactory, recom);
-
-                if (clone != null) {
-                    final Collection c = CollectionHelper.addArtifact(parent, clone, serverUrl, 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 static void doGet(final String mode, final String collectionId) {
-
-        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(collectionId, mode, type, attr);
-            final HttpClient client = new HttpClientImpl(serverUrl, locale);
-
-            if (enc != null) {
-                final InputStreamReader in = new InputStreamReader(client.collectionOut(request, collectionId, 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();
-        }
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/test/SuperProof.java	Thu Apr 26 13:12:33 2018 +0200
@@ -0,0 +1,310 @@
+/** 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<String>(), new ArrayList<String>());
+        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<Artifact> artifacts = new ArrayList<Artifact>();
+            final HashMap<Recommendation, Artifact> cloneMap = new HashMap<Recommendation, Artifact>();
+
+            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();
+        }
+    }
+
+}

http://dive4elements.wald.intevation.org