gernotbelger@9031: package test; gernotbelger@9031: gernotbelger@9031: import java.io.IOException; gernotbelger@9031: import java.util.ArrayList; gernotbelger@9031: import java.util.List; gernotbelger@9031: gernotbelger@9031: import org.dive4elements.artifacts.common.ArtifactNamespaceContext; gernotbelger@9031: import org.dive4elements.artifacts.common.utils.ClientProtocolUtils; gernotbelger@9031: import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; gernotbelger@9031: import org.dive4elements.artifacts.httpclient.http.HttpClient; gernotbelger@9031: import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; gernotbelger@9031: import org.dive4elements.artifacts.httpclient.http.response.DocumentResponseHandler; gernotbelger@9031: import org.dive4elements.artifacts.httpclient.utils.XMLUtils; gernotbelger@9031: import org.dive4elements.river.client.server.AdvanceServiceImpl; gernotbelger@9031: import org.dive4elements.river.client.server.ArtifactHelper; gernotbelger@9031: import org.dive4elements.river.client.server.CollectionHelper; gernotbelger@9031: import org.dive4elements.river.client.server.CreateCollectionServiceImpl; gernotbelger@9031: import org.dive4elements.river.client.server.FLYSArtifactCreator; gernotbelger@9031: import org.dive4elements.river.client.server.FeedServiceImpl; gernotbelger@9031: import org.dive4elements.river.client.server.auth.DefaultUser; gernotbelger@9031: import org.dive4elements.river.client.server.auth.User; gernotbelger@9031: import org.dive4elements.river.client.server.auth.UserClient; gernotbelger@9031: import org.dive4elements.river.client.shared.exceptions.ServerException; gernotbelger@9031: import org.dive4elements.river.client.shared.model.Artifact; gernotbelger@9031: import org.dive4elements.river.client.shared.model.Collection; gernotbelger@9031: import org.dive4elements.river.client.shared.model.Data; gernotbelger@9031: import org.dive4elements.river.client.shared.model.DataItem; gernotbelger@9031: import org.dive4elements.river.client.shared.model.DefaultCollection; gernotbelger@9567: import org.dive4elements.river.client.shared.model.DefaultData; gernotbelger@9031: import org.dive4elements.river.client.shared.model.DefaultDataItem; gernotbelger@9127: import org.dive4elements.river.client.shared.model.OutputMode; gernotbelger@9031: import org.dive4elements.river.client.shared.model.StringOptionsData; gernotbelger@9031: import org.junit.Assert; gernotbelger@9031: import org.w3c.dom.Document; gernotbelger@9031: import org.w3c.dom.Element; gernotbelger@9031: gernotbelger@9422: import test.AbstractBerechnungsartenTester.River; gernotbelger@9127: gernotbelger@9031: /** gernotbelger@9031: * @author Domenico Nardi Tironi gernotbelger@9031: * gernotbelger@9031: */ gernotbelger@9148: public abstract class AbstractModuleRunner { gernotbelger@9127: gernotbelger@9127: public enum Infotype { gernotbelger@9422: sinfo, uinfo, bundu gernotbelger@9127: } gernotbelger@9031: gernotbelger@9422: private final static String USERNAME = "belger"; gernotbelger@9422: gernotbelger@9422: private final static String PASSWORD = "belger"; gernotbelger@9422: gernotbelger@9031: private final String serverUrl = "http://localhost:8181"; gernotbelger@9031: private final String locale = "de"; gernotbelger@9031: private final HttpClient client; gernotbelger@9031: gernotbelger@9127: private final Infotype infotype; gernotbelger@9424: private static String userUuid; gernotbelger@9031: private Collection collection; gernotbelger@9031: private Artifact artifact; gernotbelger@9127: gernotbelger@9127: // common attributes gernotbelger@9422: private final ICalcMode iCalcMode; gernotbelger@9127: private final double from; gernotbelger@9127: private final double to; gernotbelger@9127: private final River river; gernotbelger@9567: private final List outputList; gernotbelger@9031: gernotbelger@9567: public AbstractModuleRunner(final Infotype infotype, final ICalcMode calcmode, final double from, final double to, final River beispielfluss) gernotbelger@9567: throws ConnectionException, ServerException { gernotbelger@9127: // common attributes (evtl. doch in subklassen, evtl. Zwischenhierarchiestufe einführen gernotbelger@9567: this.outputList = new ArrayList(); gernotbelger@9422: this.iCalcMode = calcmode; gernotbelger@9127: this.river = beispielfluss; gernotbelger@9127: this.from = from; gernotbelger@9127: this.to = to; gernotbelger@9127: gernotbelger@9031: this.infotype = infotype; gernotbelger@9031: gernotbelger@9031: // init gernotbelger@9031: this.client = new HttpClientImpl(this.serverUrl, this.locale); gernotbelger@9424: if (AbstractModuleRunner.userUuid == null) gernotbelger@9424: AbstractModuleRunner.userUuid = makeUserUuid(this.serverUrl); gernotbelger@9031: this.collection = getCollection(); gernotbelger@9031: this.artifact = getArtifact(); gernotbelger@9031: } gernotbelger@9031: gernotbelger@9424: private static String makeUserUuid(final String serverUrl) throws ConnectionException { gernotbelger@9497: final User user = new DefaultUser(USERNAME, PASSWORD, null, false, new ArrayList(), new ArrayList(), null); gernotbelger@9424: final UserClient userClient = new UserClient(serverUrl); gernotbelger@9031: Element userElement; gernotbelger@9031: gernotbelger@9031: userElement = userClient.findUser(user); gernotbelger@9031: return userElement.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "uuid"); gernotbelger@9031: gernotbelger@9031: } gernotbelger@9031: gernotbelger@9031: protected final Artifact getArtifact() throws ServerException, ConnectionException { gernotbelger@9031: if (this.artifact == null) { gernotbelger@9127: this.artifact = ArtifactHelper.createArtifact(this.serverUrl, this.locale, this.infotype.name(), null); gernotbelger@9031: setCollection(CollectionHelper.addArtifact(getCollection(), this.artifact, this.serverUrl, this.locale)); // wichtig; sorgt für Persistenz gernotbelger@9031: } gernotbelger@9031: return this.artifact; gernotbelger@9031: } gernotbelger@9031: gernotbelger@9148: protected Collection getCollection() throws ConnectionException { gernotbelger@9031: gernotbelger@9031: if (this.collection == null) { gernotbelger@9031: // lazy-Loading gernotbelger@9031: final Document create = ClientProtocolUtils.newCreateCollectionDocument(null); gernotbelger@9424: final Document doc = (Document) this.client.createCollection(create, userUuid, new DocumentResponseHandler()); gernotbelger@9031: final String uuid = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_UUID, ArtifactNamespaceContext.INSTANCE); gernotbelger@9031: final String ttlStr = XMLUtils.xpathString(doc, CreateCollectionServiceImpl.XPATH_COLLECTION_TTL, ArtifactNamespaceContext.INSTANCE); gernotbelger@9031: this.collection = new DefaultCollection(uuid, Long.valueOf(ttlStr), uuid); gernotbelger@9031: } gernotbelger@9031: return this.collection; gernotbelger@9031: gernotbelger@9031: } gernotbelger@9031: gernotbelger@9127: private final void setCollection(final Collection collection) { gernotbelger@9031: this.collection = collection; gernotbelger@9031: } gernotbelger@9031: gernotbelger@9127: private final void setArtifact(final Artifact artifact) { gernotbelger@9031: this.artifact = artifact; gernotbelger@9031: } gernotbelger@9031: gernotbelger@9567: public abstract void runTest() throws ConnectionException, ServerException, IOException; gernotbelger@9031: gernotbelger@9031: protected final void describeCollection() throws ConnectionException { gernotbelger@9031: gernotbelger@9031: final String uuid = getCollection().identifier(); gernotbelger@9031: final Document describe = ClientProtocolUtils.newDescribeCollectionDocument(uuid); gernotbelger@9031: final Document response = (Document) this.client.doCollectionAction(describe, uuid, new DocumentResponseHandler()); gernotbelger@9031: final Collection c = CollectionHelper.parseCollection(response); gernotbelger@9031: setCollection(c); gernotbelger@9031: gernotbelger@9031: } gernotbelger@9031: gernotbelger@9031: protected final void feedAndGo(final Data[] data, final int reachableStateIndex) throws ConnectionException, ServerException { gernotbelger@9031: feed(data); gernotbelger@9127: advance(getReachableStateByIndex(getArtifact(), reachableStateIndex)); // reachablestate könnte auch String sein. gernotbelger@9031: } gernotbelger@9031: gernotbelger@9567: protected final String getReachableStateByIndex(final Artifact artifact, final int index) { gernotbelger@9031: gernotbelger@9031: final String[] states = artifact.getArtifactDescription().getReachableStates(); gernotbelger@9031: if (states != null) { gernotbelger@9210: gernotbelger@9210: if (states.length > index) gernotbelger@9031: return states[index]; gernotbelger@9210: gernotbelger@9210: return states[0]; gernotbelger@9031: } gernotbelger@9210: gernotbelger@9210: return ""; gernotbelger@9031: } gernotbelger@9031: gernotbelger@9226: protected final void feed(final Data[] data) throws ServerException, ConnectionException { gernotbelger@9031: final Document feed = ClientProtocolUtils.newFeedDocument(getArtifact().getUuid(), getArtifact().getHash(), createKVP(data)); gernotbelger@9031: final Document description = (Document) this.client.feed( gernotbelger@9031: new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), feed, gernotbelger@9031: new DocumentResponseHandler()); gernotbelger@9031: gernotbelger@9031: final String result = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); gernotbelger@9031: gernotbelger@9031: if (result == null || !result.equals(FeedServiceImpl.OPERATION_FAILURE)) { gernotbelger@9031: setArtifact((Artifact) new FLYSArtifactCreator().create(description)); gernotbelger@9031: } else if (result != null && result.equals(FeedServiceImpl.OPERATION_FAILURE)) { gernotbelger@9031: final String msg = XMLUtils.xpathString(description, FeedServiceImpl.XPATH_RESULT_MSG, ArtifactNamespaceContext.INSTANCE); gernotbelger@9031: throw new ServerException(msg); gernotbelger@9031: } gernotbelger@9031: } gernotbelger@9031: gernotbelger@9148: protected final Data[] extractPairData(final List pairIds, final String dataName) { gernotbelger@9228: final DataItem[] items = new DataItem[pairIds.size()]; gernotbelger@9148: int i = 0; gernotbelger@9228: final StringBuilder builder = new StringBuilder(); gernotbelger@9148: for (final String pairId : pairIds) { gernotbelger@9228: builder.append(pairId).append("#"); gernotbelger@9148: i++; gernotbelger@9148: } gernotbelger@9228: final String allPairIds = builder.delete(builder.length() - 1, builder.length()).toString(); // letztes Gatter entfernen gernotbelger@9228: final DataItem[] item = new DataItem[] { new DefaultDataItem(allPairIds, allPairIds, allPairIds) }; gernotbelger@9228: return new Data[] { new StringOptionsData(dataName, dataName, item) }; gernotbelger@9148: } gernotbelger@9148: gernotbelger@9127: private final String[][] createKVP(final Data[] data) { gernotbelger@9031: if (data != null) { gernotbelger@9031: final String[][] kvp = new String[data.length][]; gernotbelger@9031: gernotbelger@9031: int i = 0; gernotbelger@9031: gernotbelger@9031: for (final Data d : data) { gernotbelger@9031: final String key = d.getLabel(); gernotbelger@9031: final String value = d.getStringValue(); gernotbelger@9031: gernotbelger@9031: kvp[i++] = new String[] { key, value }; gernotbelger@9031: } gernotbelger@9031: gernotbelger@9031: return kvp; gernotbelger@9031: } gernotbelger@9031: return null; gernotbelger@9031: } gernotbelger@9031: gernotbelger@9567: protected final void advance(final String target) throws ConnectionException, ServerException { gernotbelger@9031: final Document advance = ClientProtocolUtils.newAdvanceDocument(getArtifact().getUuid(), getArtifact().getHash(), target); gernotbelger@9031: final Document description = (Document) this.client.advance( gernotbelger@9031: new org.dive4elements.artifacts.httpclient.objects.Artifact(getArtifact().getUuid(), getArtifact().getHash()), advance, gernotbelger@9031: new DocumentResponseHandler()); gernotbelger@9031: gernotbelger@9031: if (description == null) { gernotbelger@9031: throw new ServerException(AdvanceServiceImpl.ERROR_ADVANCE_ARTIFACT); gernotbelger@9031: } gernotbelger@9031: gernotbelger@9031: final String result = XMLUtils.xpathString(description, AdvanceServiceImpl.XPATH_RESULT, ArtifactNamespaceContext.INSTANCE); gernotbelger@9031: gernotbelger@9031: if (result == null || !result.equals(AdvanceServiceImpl.OPERATION_FAILURE)) { gernotbelger@9031: setArtifact((Artifact) new FLYSArtifactCreator().create(description)); gernotbelger@9031: } gernotbelger@9031: } gernotbelger@9031: gernotbelger@9031: /// ExportServiceImpl gernotbelger@9031: gernotbelger@9127: protected final void selectCalcMode() throws ConnectionException, ServerException { gernotbelger@9127: gernotbelger@9422: /* Select ICalcMode */ gernotbelger@9422: final String calcmodeStr = this.iCalcMode.toString(); gernotbelger@9127: final Data dataCalcMode = new StringOptionsData("calculation_mode", "calculation_mode", gernotbelger@9127: new DataItem[] { new DefaultDataItem(calcmodeStr, calcmodeStr, calcmodeStr) }); gernotbelger@9127: feedAndGo(new Data[] { dataCalcMode }, 0); gernotbelger@9127: } gernotbelger@9127: gernotbelger@9127: protected final void selectRange() throws ConnectionException, ServerException { gernotbelger@9567: makeKmRange(this.getFrom(), this.getTo(), "ld_from", "ld_to"); gernotbelger@9424: gernotbelger@9424: } gernotbelger@9424: gernotbelger@9424: protected final void makeKmRange(final double from, final double to, final String from_key, final String to_key) gernotbelger@9424: throws ConnectionException, ServerException { gernotbelger@9567: feedAndGo(makeFromToData(from_key, to_key, from, to), 0); gernotbelger@9441: } gernotbelger@9441: gernotbelger@9567: protected final Data[] makeFromToData(final String from_key, final String to_key, final double _from, final double _to) { gernotbelger@9567: final String fromStr = String.valueOf(_from); gernotbelger@9567: final String toStr = String.valueOf(_to); gernotbelger@9424: final Data dataFrom = new StringOptionsData(from_key, from_key, new DataItem[] { new DefaultDataItem(fromStr, fromStr, fromStr) }); gernotbelger@9424: final Data dataTo = new StringOptionsData(to_key, to_key, new DataItem[] { new DefaultDataItem(toStr, toStr, toStr) }); gernotbelger@9441: return new Data[] { dataFrom, dataTo }; gernotbelger@9127: } gernotbelger@9127: gernotbelger@9127: protected final void selectRiver() throws ConnectionException, ServerException { gernotbelger@9127: final String riverStr = this.river.name(); gernotbelger@9127: final Data data = new StringOptionsData("river", "river", new DataItem[] { new DefaultDataItem(riverStr, riverStr, riverStr) }); gernotbelger@9127: feedAndGo(new Data[] { data }, 0); gernotbelger@9127: } gernotbelger@9127: gernotbelger@9567: public final void runTests() throws IOException, ServerException { gernotbelger@9567: for (final ModuleRunnerOutput output : this.outputList) { gernotbelger@9567: final String name = output.getOutputModename(); gernotbelger@9567: if (!stateHasRequiredOutputMode(name)) { gernotbelger@9567: Assert.fail("Unbekannter outputmode " + name); gernotbelger@9567: } gernotbelger@9567: output.assertAndWriteToFile(this.client, this.collection.identifier()); gernotbelger@9567: } gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: private final boolean stateHasRequiredOutputMode(final String outputMode) throws ConnectionException, ServerException { gernotbelger@9148: final OutputMode[] modes = getArtifact().getArtifactDescription().getOutputModes(); gernotbelger@9127: if (modes != null) { gernotbelger@9148: for (final OutputMode mode : modes) { gernotbelger@9567: if (mode.getName().toLowerCase().equals(outputMode)) gernotbelger@9567: return true; gernotbelger@9148: } gernotbelger@9127: } gernotbelger@9567: return false; gernotbelger@9127: } gernotbelger@9127: gernotbelger@9148: protected final String getRecommendationPairString(final SimpleRecommendation rec1, final SimpleRecommendation rec2) gernotbelger@9148: throws ConnectionException, ServerException { gernotbelger@9148: gernotbelger@9148: return rec1.getRecommendationPairString(rec2, getCollection(), this.serverUrl, this.locale); gernotbelger@9148: } gernotbelger@9424: gernotbelger@9441: protected final void feedAndGoData(final Data[] data) throws ConnectionException, ServerException { gernotbelger@9441: feedAndGo(data, 0); gernotbelger@9441: } gernotbelger@9441: gernotbelger@9441: protected final void feedAndGoSimpleTextInput(final String key, final String value) throws ConnectionException, ServerException { gernotbelger@9441: feedAndGo(new Data[] { getSimpleTextInput(key, value) }, 0); gernotbelger@9441: } gernotbelger@9441: gernotbelger@9441: protected Data getSimpleTextInput(final String key, final String value) throws ConnectionException, ServerException { gernotbelger@9567: return new DefaultData(key, key, key, new DataItem[] { new DefaultDataItem(value, value, value) }); gernotbelger@9441: } gernotbelger@9441: gernotbelger@9441: protected final Data[] addItemToExistingData(final Data[] existing, final Data add) { gernotbelger@9441: final Data[] data = new Data[existing.length + 1]; gernotbelger@9441: for (int i = 0; i < existing.length; i++) { gernotbelger@9441: data[i] = existing[i]; gernotbelger@9441: } gernotbelger@9441: data[existing.length] = add; gernotbelger@9441: return data; gernotbelger@9424: } gernotbelger@9424: gernotbelger@9567: public double getTo() { gernotbelger@9567: return this.to; gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: public double getFrom() { gernotbelger@9567: return this.from; gernotbelger@9567: } gernotbelger@9567: gernotbelger@9567: public final AbstractModuleRunner addOutputTest(final FilenameSupplier filename, final String outputModeName, final String currentKm) gernotbelger@9567: throws ConnectionException { gernotbelger@9567: this.outputList.add(new ModuleRunnerOutput(filename, outputModeName, currentKm)); gernotbelger@9567: return this; gernotbelger@9567: } gernotbelger@9567: gernotbelger@9210: }