gernotbelger@9028: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9028: * Software engineering by gernotbelger@9028: * Björnsen Beratende Ingenieure GmbH gernotbelger@9028: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9028: * gernotbelger@9028: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9028: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9028: * documentation coming with Dive4Elements River for details. gernotbelger@9028: */ gernotbelger@9028: package org.dive4elements.river.client.test; gernotbelger@9028: gernotbelger@9028: import java.io.File; gernotbelger@9028: import java.io.FileOutputStream; gernotbelger@9028: import java.io.IOException; gernotbelger@9028: import java.io.InputStreamReader; gernotbelger@9028: import java.io.OutputStream; gernotbelger@9028: import java.io.OutputStreamWriter; gernotbelger@9028: import java.util.ArrayList; gernotbelger@9028: import java.util.HashMap; gernotbelger@9028: gernotbelger@9028: import org.dive4elements.artifacts.common.ArtifactNamespaceContext; gernotbelger@9028: import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; gernotbelger@9028: import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; gernotbelger@9028: import org.dive4elements.artifacts.httpclient.http.HttpClient; gernotbelger@9028: import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; gernotbelger@9028: import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; gernotbelger@9028: import org.dive4elements.artifacts.httpclient.utils.XMLUtils; gernotbelger@9028: import org.dive4elements.river.client.server.AdvanceServiceImpl; gernotbelger@9028: import org.dive4elements.river.client.server.ArtifactHelper; gernotbelger@9028: import org.dive4elements.river.client.server.CollectionHelper; gernotbelger@9028: import org.dive4elements.river.client.server.CreateCollectionServiceImpl; gernotbelger@9028: import org.dive4elements.river.client.server.FLYSArtifactCreator; gernotbelger@9028: import org.dive4elements.river.client.server.FeedServiceImpl; gernotbelger@9028: import org.dive4elements.river.client.server.LoadArtifactServiceImpl; gernotbelger@9028: import org.dive4elements.river.client.server.auth.DefaultUser; gernotbelger@9028: import org.dive4elements.river.client.server.auth.User; gernotbelger@9028: import org.dive4elements.river.client.server.auth.UserClient; gernotbelger@9028: import org.dive4elements.river.client.shared.exceptions.ServerException; gernotbelger@9028: import org.dive4elements.river.client.shared.model.Artifact; gernotbelger@9028: import org.dive4elements.river.client.shared.model.Collection; gernotbelger@9028: import org.dive4elements.river.client.shared.model.Data; gernotbelger@9028: import org.dive4elements.river.client.shared.model.DefaultCollection; gernotbelger@9028: import org.dive4elements.river.client.shared.model.Recommendation; gernotbelger@9028: import org.w3c.dom.Document; gernotbelger@9028: import org.w3c.dom.Element; gernotbelger@9028: gernotbelger@9028: /** gernotbelger@9028: * @author Domenico Nardi Tironi gernotbelger@9028: * gernotbelger@9028: */ gernotbelger@9028: public abstract class SuperProof { gernotbelger@9028: gernotbelger@9028: private final String serverUrl = "http://localhost:8181"; gernotbelger@9028: private final String locale = "de"; gernotbelger@9028: private final HttpClient client; gernotbelger@9028: gernotbelger@9028: private final String username; gernotbelger@9028: private final String password; gernotbelger@9028: private final String infotype; gernotbelger@9028: private final String userUuid; gernotbelger@9028: private Collection collection; gernotbelger@9028: private Artifact artifact; gernotbelger@9028: gernotbelger@9028: public SuperProof(final String username, final String password, final String infotype) { gernotbelger@9028: this.username = username; gernotbelger@9028: this.password = password; gernotbelger@9028: this.infotype = infotype; gernotbelger@9028: gernotbelger@9028: // init gernotbelger@9028: this.client = new HttpClientImpl(this.serverUrl, this.locale); gernotbelger@9028: this.userUuid = makeUserUuid(); gernotbelger@9028: this.collection = getCollection(); gernotbelger@9028: this.artifact = getArtifact(); gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private String makeUserUuid() { gernotbelger@9028: final User user = new DefaultUser(this.username, this.password, null, false, new ArrayList(), new ArrayList()); gernotbelger@9028: final UserClient userClient = new UserClient(this.serverUrl); gernotbelger@9028: Element userElement; gernotbelger@9028: try { gernotbelger@9028: userElement = userClient.findUser(user); gernotbelger@9028: return userElement.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "uuid"); gernotbelger@9028: } gernotbelger@9028: catch (final ConnectionException e) { gernotbelger@9028: e.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: return ""; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: protected final Artifact getArtifact() { gernotbelger@9028: gernotbelger@9028: /* Init Collection */ gernotbelger@9028: if (this.artifact == null) gernotbelger@9028: try { gernotbelger@9028: gernotbelger@9028: this.artifact = ArtifactHelper.createArtifact(this.serverUrl, this.locale, this.infotype, null); gernotbelger@9028: setCollection(CollectionHelper.addArtifact(getCollection(), this.artifact, this.serverUrl, this.locale)); // wichtig; sorgt für Persistenz gernotbelger@9028: } gernotbelger@9028: catch (final ServerException e) { gernotbelger@9028: // TODO Auto-generated catch block gernotbelger@9028: e.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: return this.artifact; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private Collection getCollection() { gernotbelger@9028: gernotbelger@9028: if (this.collection == null) { gernotbelger@9028: try { gernotbelger@9028: // lazy-Loading gernotbelger@9028: final Document create = ClientProtocolUtils.newCreateCollectionDocument(null); gernotbelger@9028: final Document doc = (Document) this.client.createCollection(create, this.userUuid, new DocumentResponseHandler()); gernotbelger@9028: final String uuid = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_UUID, ArtifactNamespaceContext.INSTANCE); gernotbelger@9028: final String ttlStr = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_TTL, ArtifactNamespaceContext.INSTANCE); gernotbelger@9028: this.collection = new DefaultCollection(uuid, Long.valueOf(ttlStr), uuid); gernotbelger@9028: } gernotbelger@9028: catch (final ConnectionException e) { gernotbelger@9028: // TODO Auto-generated catch block gernotbelger@9028: e.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: return this.collection; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private void setCollection(final Collection collection) { gernotbelger@9028: this.collection = collection; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private void setArtifact(final Artifact artifact) { gernotbelger@9028: this.artifact = artifact; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: // TODO: MAKE THIS CLASS ABSTRACT AND OVERRIDE runTest in children gernotbelger@9028: public abstract void runTest(); gernotbelger@9028: gernotbelger@9028: protected final void describeCollection() { gernotbelger@9028: try { gernotbelger@9028: final String uuid = getCollection().identifier(); gernotbelger@9028: final Document describe = ClientProtocolUtils.newDescribeCollectionDocument(uuid); gernotbelger@9028: final Document response = (Document) this.client.doCollectionAction(describe, uuid, new DocumentResponseHandler()); gernotbelger@9028: final Collection c = CollectionHelper.parseCollection(response); gernotbelger@9028: setCollection(c); gernotbelger@9028: } gernotbelger@9028: catch (final ConnectionException e) { gernotbelger@9028: e.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: protected final void feedAndGo(final Data[] data, final int reachableStateIndex) { gernotbelger@9028: try { gernotbelger@9028: feed(data); gernotbelger@9028: advance(getReachableStateByIndex(getArtifact(), reachableStateIndex)); // reachablestate könnte auch String sein... TODO: feedAndgo(data,string) gernotbelger@9028: // bauen gernotbelger@9028: } gernotbelger@9028: catch (final ConnectionException e) { gernotbelger@9028: e.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: catch (final ServerException e) { gernotbelger@9028: e.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private String getReachableStateByIndex(final Artifact artifact, final int index) { gernotbelger@9028: gernotbelger@9028: final String[] states = artifact.getArtifactDescription().getReachableStates(); gernotbelger@9028: if (states != null) { gernotbelger@9028: if (states.length > index) { gernotbelger@9028: return states[index]; gernotbelger@9028: } else { gernotbelger@9028: return states[0]; gernotbelger@9028: } gernotbelger@9028: } else { gernotbelger@9028: return ""; gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private void feed(final Data[] data) throws ServerException, ConnectionException { gernotbelger@9028: final Document feed = ClientProtocolUtils.newFeedDocument(getArtifact().getUuid(), getArtifact().getHash(), createKVP(data)); gernotbelger@9028: gernotbelger@9028: final Document description = (Document) this.client.feed( gernotbelger@9028: new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), feed, gernotbelger@9028: new DocumentResponseHandler()); gernotbelger@9028: gernotbelger@9028: final String result = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); gernotbelger@9028: gernotbelger@9028: if (result == null || !result.equals(FeedServiceImpl.OPERATION_FAILURE)) { gernotbelger@9028: setArtifact((Artifact) new FLYSArtifactCreator().create(description)); gernotbelger@9028: } else if (result != null && result.equals(FeedServiceImpl.OPERATION_FAILURE)) { gernotbelger@9028: final String msg = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT_MSG, ArtifactNamespaceContext.INSTANCE); gernotbelger@9028: throw new ServerException(msg); gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: // throw new ServerException(FeedServiceImpl.ERROR_FEED_DATA); gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private String[][] createKVP(final Data[] data) { gernotbelger@9028: if (data != null) { gernotbelger@9028: final String[][] kvp = new String[data.length][]; gernotbelger@9028: gernotbelger@9028: int i = 0; gernotbelger@9028: gernotbelger@9028: for (final Data d : data) { gernotbelger@9028: // final DataItem[] items = d.getItems(); gernotbelger@9028: final String key = d.getLabel(); gernotbelger@9028: final String value = d.getStringValue(); gernotbelger@9028: gernotbelger@9028: kvp[i++] = new String[] { key, value }; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: return kvp; gernotbelger@9028: } gernotbelger@9028: return null; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: private void advance(final String target) throws ConnectionException, ServerException { gernotbelger@9028: final Document advance = ClientProtocolUtils.newAdvanceDocument(getArtifact().getUuid(), getArtifact().getHash(), target); gernotbelger@9028: // final HttpClient client = new HttpClientImpl(url, locale); gernotbelger@9028: gernotbelger@9028: final Document description = (Document) this.client.advance( gernotbelger@9028: new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), advance, gernotbelger@9028: new DocumentResponseHandler()); gernotbelger@9028: gernotbelger@9028: if (description == null) { gernotbelger@9028: throw new ServerException(AdvanceServiceImpl.ERROR_ADVANCE_ARTIFACT); gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: final String result = XMLUtils.xpathString(description, AdvanceServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); gernotbelger@9028: gernotbelger@9028: if (result == null || !result.equals(AdvanceServiceImpl.OPERATION_FAILURE)) { gernotbelger@9028: setArtifact((Artifact) new FLYSArtifactCreator().create(description)); gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: // throw new ServerException(AdvanceServiceImpl.ERROR_ADVANCE_ARTIFACT); gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: protected final Artifact[] loadMany(final Recommendation[] recoms, final String factory) { gernotbelger@9028: try { gernotbelger@9028: final ArrayList artifacts = new ArrayList(); gernotbelger@9028: final HashMap cloneMap = new HashMap(); gernotbelger@9028: gernotbelger@9028: for (final Recommendation recom : recoms) { gernotbelger@9028: gernotbelger@9028: final Artifact prevClone = cloneMap.get(recom); gernotbelger@9028: if (prevClone != null) { gernotbelger@9028: gernotbelger@9028: artifacts.add(prevClone); gernotbelger@9028: } else { gernotbelger@9028: // Not already cloned. gernotbelger@9028: final String realFactory = factory != null ? factory : recom.getFactory(); gernotbelger@9028: gernotbelger@9028: final Artifact clone = ArtifactHelper.createArtifact(this.serverUrl, this.locale, realFactory, recom); gernotbelger@9028: gernotbelger@9028: if (clone != null) { gernotbelger@9028: final Collection c = CollectionHelper.addArtifact(getCollection(), clone, this.serverUrl, this.locale); gernotbelger@9028: gernotbelger@9028: if (c != null) { gernotbelger@9028: artifacts.add(clone); gernotbelger@9028: // Remember we cloned a recommendation like this. gernotbelger@9028: cloneMap.put(recom, clone); gernotbelger@9028: } else { gernotbelger@9028: throw new ServerException(LoadArtifactServiceImpl.ERROR_LOAD_ARTIFACT); gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: return artifacts.toArray(new Artifact[artifacts.size()]); gernotbelger@9028: } gernotbelger@9028: catch (final ServerException e) { gernotbelger@9028: e.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: return null; gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: /// ExportServiceImpl gernotbelger@9028: public void doGet(final String mode) { gernotbelger@9028: try { gernotbelger@9028: gernotbelger@9028: final String name = mode; gernotbelger@9028: final String type = "csv"; gernotbelger@9028: gernotbelger@9028: final String fn = name + "." + type; // TODO: make filename unique gernotbelger@9028: final String enc = "windows-1252";// req.getParameter("encoding"); gernotbelger@9028: gernotbelger@9028: final OutputStream out = new FileOutputStream(new File("D:" + File.separator + fn)); gernotbelger@9028: final Document attr = null; gernotbelger@9028: final Document request = ClientProtocolUtils.newOutCollectionDocument(getCollection().identifier(), mode, type, attr); gernotbelger@9028: // final HttpClient client = new HttpClientImpl(serverUrl, locale); gernotbelger@9028: gernotbelger@9028: if (enc != null) { gernotbelger@9028: final InputStreamReader in = new InputStreamReader(this.client.collectionOut(request, getCollection().identifier(), mode), "UTF-8"); gernotbelger@9028: try { gernotbelger@9028: final OutputStreamWriter encOut = new OutputStreamWriter(out, enc); gernotbelger@9028: final char buf[] = new char[4096]; gernotbelger@9028: int c; gernotbelger@9028: while ((c = in.read(buf, 0, buf.length)) >= 0) { gernotbelger@9028: encOut.write(buf, 0, c); gernotbelger@9028: } gernotbelger@9028: encOut.flush(); gernotbelger@9028: encOut.close(); gernotbelger@9028: } finally { gernotbelger@9028: in.close(); gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: catch (final IOException ioe) { gernotbelger@9028: ioe.printStackTrace(); gernotbelger@9028: } gernotbelger@9028: } gernotbelger@9028: gernotbelger@9028: }