mschaefer@9016: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9016: * Software engineering by mschaefer@9016: * Björnsen Beratende Ingenieure GmbH mschaefer@9016: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9016: * mschaefer@9016: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9016: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9016: * documentation coming with Dive4Elements River for details. mschaefer@9016: */ mschaefer@9016: mschaefer@9016: package org.dive4elements.river.artifacts.sinfo.predefinedtkh; mschaefer@9016: mschaefer@9016: import java.util.ArrayList; mschaefer@9016: import java.util.Collection; mschaefer@9016: import java.util.List; mschaefer@9016: mschaefer@9016: import org.dive4elements.artifacts.Artifact; mschaefer@9016: import org.dive4elements.artifacts.CallContext; mschaefer@9016: import org.dive4elements.river.artifacts.D4EArtifact; mschaefer@9016: import org.dive4elements.river.artifacts.common.GeneralResultType; mschaefer@9016: import org.dive4elements.river.artifacts.common.ResultRow; mschaefer@9016: import org.dive4elements.river.artifacts.model.BlackboardDataFacet; mschaefer@9016: import org.dive4elements.river.artifacts.model.Calculation; mschaefer@9016: import org.dive4elements.river.artifacts.model.FacetTypes; mschaefer@9016: import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; mschaefer@9016: import org.dive4elements.river.artifacts.sinfo.tkhcalculation.SoilKind; mschaefer@9016: import org.dive4elements.river.artifacts.sinfo.tkhcalculation.SoilKindKmValueFinder; mschaefer@9016: import org.dive4elements.river.model.sinfo.TkhColumn; mschaefer@9016: import org.dive4elements.river.model.sinfo.TkhValue; mschaefer@9016: mschaefer@9016: /** mschaefer@9016: * Facet for a tkh value series loaded from the database mschaefer@9016: * mschaefer@9016: * @author Matthias Schäfer mschaefer@9016: */ mschaefer@9016: public class PredefinedTkhFacet extends BlackboardDataFacet implements FacetTypes { mschaefer@9016: mschaefer@9016: private static final long serialVersionUID = 5508868967789155306L; mschaefer@9016: mschaefer@9016: public PredefinedTkhFacet(final String name, final String description) { mschaefer@9016: super(0, name, description); mschaefer@9016: mschaefer@9016: this.metaData.put("X", "chart.longitudinal.section.xaxis.label"); mschaefer@9016: this.metaData.put("Y", "chart.tkh.section.yaxis.label"); mschaefer@9016: } mschaefer@9016: mschaefer@9016: /** mschaefer@9016: * Returns the data this facet requires. mschaefer@9016: * mschaefer@9016: * @param artifact mschaefer@9016: * the owner artifact. mschaefer@9016: * @param context mschaefer@9016: * the CallContext (ignored). mschaefer@9016: * mschaefer@9016: * @return mschaefer@9016: * the data as PredefinedTkhQueryCalculationResult mschaefer@9016: */ mschaefer@9016: @Override mschaefer@9016: public Object getData(final Artifact artifact, final CallContext context) { mschaefer@9016: mschaefer@9016: final PredefinedTkhColumnAccess access = new PredefinedTkhColumnAccess((D4EArtifact) artifact); mschaefer@9016: final TkhColumn series = TkhColumn.getTkhColumnById(access.getColumnId()); mschaefer@9016: final List tkhValues = TkhValue.getTkhValues(series, access.getFrom(true), access.getTo(true)); mschaefer@9016: final Calculation problems = new Calculation(); mschaefer@9016: final SoilKindKmValueFinder soilKindFinder = SoilKindKmValueFinder.loadValues(problems, access.getRiver(), access.getRange()); mschaefer@9016: mschaefer@9016: final Collection rows = new ArrayList<>(); mschaefer@9016: SoilKind bedMobility = SoilKind.mobil; mschaefer@9016: for (final TkhValue tkhValue : tkhValues) { mschaefer@9016: final ResultRow row = ResultRow.create(); mschaefer@9016: row.putValue(GeneralResultType.station, tkhValue.getStation().doubleValue()); mschaefer@9016: if (soilKindFinder != null) mschaefer@9016: bedMobility = soilKindFinder.findSoilKind(tkhValue.getStation().doubleValue()); mschaefer@9016: row.putValue(SInfoResultType.soilkind, bedMobility); mschaefer@9016: final double tkh = tkhValue(tkhValue.getTkheight()) * 100; mschaefer@9016: row.putValue(SInfoResultType.tkh, tkh); mschaefer@9016: switch (bedMobility) { mschaefer@9016: case starr: mschaefer@9016: row.putValue(SInfoResultType.tkhup, tkh); mschaefer@9016: row.putValue(SInfoResultType.tkhdown, 0.0); mschaefer@9016: break; mschaefer@9016: case mobil: mschaefer@9016: default: mschaefer@9016: row.putValue(SInfoResultType.tkhup, tkh / 2); mschaefer@9016: row.putValue(SInfoResultType.tkhdown, -tkh / 2); mschaefer@9016: break; mschaefer@9016: } mschaefer@9016: rows.add(row); mschaefer@9016: } mschaefer@9016: return new PredefinedTkhQueryCalculationResult(series.getName(), rows); mschaefer@9016: } mschaefer@9016: mschaefer@9016: private double tkhValue(final Double value) { mschaefer@9016: if (value != null) mschaefer@9016: return value.doubleValue(); mschaefer@9016: else mschaefer@9016: return Double.NaN; mschaefer@9016: } mschaefer@9016: mschaefer@9016: /** mschaefer@9016: * Create a deep copy of this Facet. mschaefer@9016: * mschaefer@9016: * @return a deep copy. mschaefer@9016: */ mschaefer@9016: @Override mschaefer@9016: public PredefinedTkhFacet deepCopy() { mschaefer@9016: final PredefinedTkhFacet copy = new PredefinedTkhFacet(this.name, this.description); mschaefer@9016: copy.set(this); mschaefer@9016: return copy; mschaefer@9016: } mschaefer@9016: }