gernotbelger@9062: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9062: * Software engineering by gernotbelger@9062: * Björnsen Beratende Ingenieure GmbH gernotbelger@9062: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9062: * gernotbelger@9062: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9062: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9062: * documentation coming with Dive4Elements River for details. gernotbelger@9062: */ gernotbelger@9062: gernotbelger@9062: package org.dive4elements.river.artifacts.uinfo.salix; gernotbelger@9062: gernotbelger@9391: import org.dive4elements.river.artifacts.access.BedHeightAccess; gernotbelger@9062: import org.dive4elements.river.artifacts.access.RangeAccess; gernotbelger@9062: import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; gernotbelger@9062: import org.dive4elements.river.artifacts.uinfo.UinfoCalcMode; gernotbelger@9391: import org.dive4elements.river.model.BedHeight; gernotbelger@9062: gernotbelger@9062: /** gernotbelger@9062: * Access to the flow depth calculation type specific SInfo artifact data. gernotbelger@9062: * REMARK: this class is NOT intended to be hold in the results (or anywhere else), in order to avoid a permanent gernotbelger@9062: * reference to the artifact instance. gernotbelger@9062: * Hence we do NOT cache any data. gernotbelger@9062: * gernotbelger@9062: * @author Gernot Belger gernotbelger@9062: */ gernotbelger@9062: final class SalixLineAccess extends RangeAccess { gernotbelger@9062: mschaefer@9309: /** mschaefer@9309: * Type of a salix line scenario with key property used by the client mschaefer@9309: */ mschaefer@9309: public enum ScenarioType { mschaefer@9309: NONE(""), // mschaefer@9309: REGIONAL("scenarioType.option1"), // mschaefer@9309: SUPRAREGIONAL("scenarioType.option2"), // mschaefer@9309: HISTORICAL("scenarioType.option3"); mschaefer@9309: mschaefer@9309: private String key; mschaefer@9309: mschaefer@9309: private ScenarioType(final String key) { mschaefer@9309: this.key = key; mschaefer@9309: } mschaefer@9309: mschaefer@9309: public static ScenarioType forKey(final String key) { mschaefer@9309: for (final ScenarioType st : ScenarioType.values()) { mschaefer@9309: if (st.getKey().equals(key)) mschaefer@9309: return st; mschaefer@9309: } mschaefer@9309: return NONE; mschaefer@9309: } mschaefer@9309: mschaefer@9309: public String getKey() { mschaefer@9309: return this.key; mschaefer@9309: } mschaefer@9309: } mschaefer@9309: gernotbelger@9062: public SalixLineAccess(final UINFOArtifact artifact) { gernotbelger@9062: super(artifact); gernotbelger@9062: gernotbelger@9062: /* assert calculation mode */ gernotbelger@9062: final UinfoCalcMode calculationMode = artifact.getCalculationMode(); gernotbelger@9062: assert (calculationMode == UinfoCalcMode.uinfo_salix_line); gernotbelger@9062: } gernotbelger@9062: gernotbelger@9321: private boolean getUseScenario() { gernotbelger@9068: return super.getBoolean("use_scenario"); gernotbelger@9068: } gernotbelger@9068: mschaefer@9309: public ScenarioType getScenario() { mschaefer@9309: if (getUseScenario()) mschaefer@9309: return ScenarioType.forKey(getString("scenario_selection")); gernotbelger@9321: gernotbelger@9321: return ScenarioType.NONE; gernotbelger@9068: } gernotbelger@9068: gernotbelger@9222: public Double getFromPart() { gernotbelger@9222: return getDouble("ld_from_part"); gernotbelger@9068: } gernotbelger@9068: gernotbelger@9222: public Double getToPart() { gernotbelger@9222: return getDouble("ld_to_part"); gernotbelger@9068: } gernotbelger@9243: gernotbelger@9243: public int[] getRegionalScenarioIntegers() { gernotbelger@9243: // super.getIntArray("sedimentheight"); DOES NOT WORK! gernotbelger@9243: final String ints = super.getString("sedimentheight"); gernotbelger@9243: if (ints != null) { gernotbelger@9243: final String[] intsSplit = ints.split(" "); gernotbelger@9243: final int[] values = new int[intsSplit.length]; gernotbelger@9243: for (int i = 0; i < intsSplit.length; i++) { gernotbelger@9243: values[i] = Integer.valueOf(intsSplit[i]); gernotbelger@9243: } gernotbelger@9243: return values; gernotbelger@9243: } gernotbelger@9243: return null; gernotbelger@9243: } gernotbelger@9243: gernotbelger@9243: public String getSupraRegionalString() { gernotbelger@9243: return super.getString("supraregional_table"); gernotbelger@9243: } gernotbelger@9246: mschaefer@9394: /** mschaefer@9394: * Database id of the selected sounding, or 0 mschaefer@9394: */ mschaefer@9394: public int getBedHeightId() { mschaefer@9394: final BedHeightAccess access = new BedHeightAccess(this.artifact); mschaefer@9394: final int[] ids = access.getBedHeightIDs(); mschaefer@9394: if ((ids != null) && (ids.length > 0)) { mschaefer@9394: return ids[0]; mschaefer@9394: } mschaefer@9394: return 0; mschaefer@9394: } mschaefer@9394: gernotbelger@9391: public BedHeight getBedHeight() { // TODO: make lazy? Aber achtung, falls der user zurückgeht und ne andere Peilung auswählt... gernotbelger@9391: final BedHeightAccess access = new BedHeightAccess(this.artifact); gernotbelger@9391: final int[] ids = access.getBedHeightIDs(); gernotbelger@9391: if (ids != null && ids.length > 0) { gernotbelger@9391: return BedHeight.getBedHeightById(ids[0]); // es nur eine bedheight ausgewählt werden; ist aber noch nicht implementiert... gernotbelger@9246: } gernotbelger@9246: return null; gernotbelger@9246: } gernotbelger@9246: gernotbelger@9391: public Integer getYearEpoch() { // TODO: make lazy? gernotbelger@9391: final BedHeight bh = this.getBedHeight(); gernotbelger@9391: if (bh != null) { gernotbelger@9391: return bh.getYear(); gernotbelger@9246: } gernotbelger@9246: return null; gernotbelger@9246: } gernotbelger@9391: gernotbelger@9062: }