gernotbelger@9069: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9069: * Software engineering by gernotbelger@9069: * Björnsen Beratende Ingenieure GmbH gernotbelger@9069: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9069: * gernotbelger@9069: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9069: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9069: * documentation coming with Dive4Elements River for details. gernotbelger@9069: */ gernotbelger@9069: gernotbelger@9069: package org.dive4elements.river.artifacts.uinfo.inundationduration; gernotbelger@9069: gernotbelger@9481: import java.io.IOException; gernotbelger@9537: import java.io.UnsupportedEncodingException; gernotbelger@9537: import java.net.URLEncoder; gernotbelger@9481: gernotbelger@9537: import org.dive4elements.artifacts.CallContext; gernotbelger@9069: import org.dive4elements.river.artifacts.access.RangeAccess; gernotbelger@9070: import org.dive4elements.river.artifacts.common.EpochYearAccessHelper; gernotbelger@9481: import org.dive4elements.river.artifacts.resources.Resources; gernotbelger@9481: import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException; gernotbelger@9069: import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; gernotbelger@9069: import org.dive4elements.river.artifacts.uinfo.UinfoCalcMode; gernotbelger@9481: import org.dive4elements.river.artifacts.uinfo.inundationduration.InundationDurationCalculationResult.WmsLayer; gernotbelger@9481: import org.dive4elements.river.artifacts.uinfo.inundationduration.UedauernConfiguration.YearType; gernotbelger@9069: gernotbelger@9069: /** gernotbelger@9069: * Access to the flow depth calculation type specific SInfo artifact data. gernotbelger@9069: * REMARK: this class is NOT intended to be hold in the results (or anywhere else), in order to avoid a permanent gernotbelger@9069: * reference to the artifact instance. gernotbelger@9069: * Hence we do NOT cache any data. gernotbelger@9069: * gernotbelger@9069: * @author Gernot Belger gernotbelger@9069: */ gernotbelger@9069: final class InundationDurationAccess extends RangeAccess { gernotbelger@9069: gernotbelger@9069: // IMMER ABGLEICHEN MIT SuperVegZonesTablePanel.TABLE_CELL_SEPARATOR gernotbelger@9069: public static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR"; gernotbelger@9069: public static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR"; gernotbelger@9070: gernotbelger@9070: private final EpochYearAccessHelper helper; gernotbelger@9069: gernotbelger@9537: public static enum WmsClassification { gernotbelger@9537: asIs { gernotbelger@9537: @Override gernotbelger@9537: public String configureAddress(final String serverAddress, final String url, final String vegetationZoneId) { gernotbelger@9537: return url; gernotbelger@9537: } gernotbelger@9537: }, gernotbelger@9537: vegetationZone { gernotbelger@9537: @Override gernotbelger@9537: public String configureAddress(final String serverAddress, final String url, final String vegetationZoneId) { gernotbelger@9537: gernotbelger@9537: try { gernotbelger@9537: final String urlEncoded = URLEncoder.encode(url, "UTF-8"); gernotbelger@9537: final String vegZoneIdEncoded = URLEncoder.encode(vegetationZoneId, "UTF-8"); gernotbelger@9537: gernotbelger@9537: return String.format("%s/%s/%s/%s", serverAddress, VegetationWmsResource.BASE_PATH, vegZoneIdEncoded, urlEncoded); gernotbelger@9537: } gernotbelger@9537: catch (final UnsupportedEncodingException e) { gernotbelger@9537: /* should never happen */ gernotbelger@9537: e.printStackTrace(); gernotbelger@9537: return null; gernotbelger@9537: } gernotbelger@9537: } gernotbelger@9537: }; gernotbelger@9537: gernotbelger@9537: public abstract String configureAddress(String serverAddress, String url, String vegetationZoneId); gernotbelger@9537: } gernotbelger@9537: gernotbelger@9069: // Fields from state: gernotbelger@9069: // gernotbelger@9069: // calculation_mode (String) gernotbelger@9069: // ld_from, ld_to gernotbelger@9069: // ye_select (String; state.uinfo.totalepoch oder state.uinfo.year) gernotbelger@9481: // year_epoch_select gernotbelger@9069: // totalepoch (String; TODO: minmax totalEpoch herausfinden und setzen (nicht hier.. aber trotzdem die Erinnerung hier)) gernotbelger@9069: // use_scenario boolean (danach kommt kein radioBtn, sondern sedimentheight-Eingabe) gernotbelger@9069: // sedimentheight String gernotbelger@9069: // gernotbelger@9069: // vegzones (String) TODO: MIT VegetationzonesAccess zusammenlegen gernotbelger@9069: gernotbelger@9069: public InundationDurationAccess(final UINFOArtifact uinfo) { gernotbelger@9069: super(uinfo); gernotbelger@9069: /* assert calculation mode */ gernotbelger@9069: final UinfoCalcMode calculationMode = uinfo.getCalculationMode(); gernotbelger@9070: this.helper = new EpochYearAccessHelper(uinfo); gernotbelger@9069: assert (calculationMode == UinfoCalcMode.uinfo_inundation_duration); gernotbelger@9069: } gernotbelger@9069: gernotbelger@9481: public boolean isUseYear() { gernotbelger@9481: if (this.helper.getYearEpoch().equals("state.uinfo.year")) gernotbelger@9481: return true; gernotbelger@9481: return false; gernotbelger@9069: } gernotbelger@9069: gernotbelger@9537: public WmsLayer createWMSLayer(final CallContext context, final String i10nKey, final WmsClassification classification, final String vegZoneId) gernotbelger@9537: throws IOException, TsvReaderException { gernotbelger@9178: gernotbelger@9481: final YearType type = isUseYear() ? YearType.jahre : YearType.mittel; gernotbelger@9481: final String selectedElement = getSelectedLabel(); gernotbelger@9481: gernotbelger@9537: final String layerLabel = Resources.getMsg(context.getMeta(), i10nKey, new Object[] { selectedElement }); gernotbelger@9481: gernotbelger@9537: return createWMSLayer(context, layerLabel, type, selectedElement, classification, vegZoneId); gernotbelger@9069: } gernotbelger@9069: gernotbelger@9537: public WmsLayer createScenarioWMSLayer(final CallContext context, final String i10nKey, final WmsClassification classification, final String vegZoneId) gernotbelger@9537: throws IOException, TsvReaderException { gernotbelger@9481: gernotbelger@9481: // FIXME: use scenario-cm as label, and scenario-type gernotbelger@9481: final YearType type = YearType.jahre; gernotbelger@9481: gernotbelger@9537: final String selectedElement = Integer.toString(getDwspl()); gernotbelger@9537: final String layerLabel = Resources.getMsg(context.getMeta(), i10nKey, new Object[] { selectedElement }); gernotbelger@9481: gernotbelger@9537: return createWMSLayer(context, layerLabel, type, selectedElement, classification, vegZoneId); gernotbelger@9537: } gernotbelger@9481: gernotbelger@9537: private WmsLayer createWMSLayer(final CallContext context, final String layerLabel, final YearType type, final String selectedElement, gernotbelger@9537: final WmsClassification classification, final String vegZoneId) gernotbelger@9537: throws IOException, TsvReaderException { gernotbelger@9537: gernotbelger@9537: final String serverAddress = context.getDatabase().getServerAddress(); gernotbelger@9537: gernotbelger@9537: final UedauernConfiguration config = UedauernConfiguration.getInstance(getRiverName(), type); gernotbelger@9537: final String url = config.getUrl(selectedElement); gernotbelger@9537: final String layer = config.getLayer(selectedElement); gernotbelger@9537: gernotbelger@9537: final String realUrl = classification.configureAddress(serverAddress, url, vegZoneId); gernotbelger@9537: gernotbelger@9537: return new WmsLayer(layerLabel, realUrl, layer, classification == WmsClassification.asIs); gernotbelger@9184: } gernotbelger@9184: gernotbelger@9481: private String getSelectedLabel() { gernotbelger@9481: return this.getString("year_epoch_select"); gernotbelger@9481: } gernotbelger@9481: gernotbelger@9481: private Integer getDwspl() { gernotbelger@9481: if (getIsUseScenario()) gernotbelger@9184: return super.getInteger("sedimentheight"); gernotbelger@9481: gernotbelger@9184: return null; gernotbelger@9184: } gernotbelger@9184: gernotbelger@9070: public String getVegZones() { gernotbelger@9184: // mit VegetationzonesAccess zusammenlegen (eine Zeile sparen...) gernotbelger@9070: return super.getString("vegzones"); gernotbelger@9069: } gernotbelger@9069: gernotbelger@9190: public boolean getIsUseScenario() { gernotbelger@9190: return super.getBoolean("use_scenario"); gernotbelger@9190: } gernotbelger@9069: }