teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
teichmann@5863: * Software engineering by Intevation GmbH
teichmann@5863: *
teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3)
teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the
teichmann@5994: * documentation coming with Dive4Elements River for details.
teichmann@5863: */
teichmann@5863:
teichmann@5831: package org.dive4elements.river.artifacts.model;
bjoern@3936:
bjoern@3936: import java.util.Arrays;
bjoern@3936: import java.util.Map;
bjoern@3936:
teichmann@5831: import org.dive4elements.artifacts.Artifact;
teichmann@5831: import org.dive4elements.artifacts.CallContext;
bjoern@3936:
teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet;
bjoern@3936:
teichmann@5867: import org.dive4elements.river.artifacts.D4EArtifact;
rrenkert@8386: import org.dive4elements.river.artifacts.access.RangeAccess;
teichmann@5831: import org.dive4elements.river.model.Gauge;
bjoern@3936:
teichmann@5865: import org.dive4elements.river.utils.RiverUtils;
teichmann@3986:
teichmann@3986: import org.apache.log4j.Logger;
teichmann@3986:
rrenkert@8326: import static org.dive4elements.river.exports.injector.InjectorConstants.PNP;
rrenkert@8326:
bjoern@3936: /**
bjoern@3936: * A Facet that returns discharge curve data at a gauge
bjoern@3936: *
bjoern@3936: * @author Björn Ricks
bjoern@3936: */
bjoern@3936: public class GaugeDischargeCurveFacet
rrenkert@8302: extends DataFacet
bjoern@4032: implements FacetTypes
bjoern@3936: {
teichmann@3986: private static final Logger log =
teichmann@3986: Logger.getLogger(GaugeDischargeCurveFacet.class);
bjoern@3936:
rrenkert@8302: public GaugeDischargeCurveFacet() {
rrenkert@8302: }
rrenkert@8302:
bjoern@4187: public GaugeDischargeCurveFacet(String name, String description) {
rrenkert@8302: super(name, description);
bjoern@3936: }
bjoern@3936:
bjoern@3936: @Override
bjoern@3936: public Object getData(Artifact art, CallContext context) {
bjoern@4583: return getWQKms(art, context);
bjoern@4583: }
bjoern@3936:
bjoern@4583: protected WQKms getWQKms(Artifact art, CallContext context) {
teichmann@5867: if (!(art instanceof D4EArtifact)) {
teichmann@3986: log.warn("Invalid artifact type");
teichmann@3986: return null;
teichmann@3986: }
teichmann@3986:
teichmann@5867: D4EArtifact flys = (D4EArtifact)art;
teichmann@3986:
teichmann@3986: String river = flys.getDataAsString("river");
teichmann@3986:
teichmann@5865: Gauge gauge = RiverUtils.getReferenceGauge(flys);
teichmann@3986:
teichmann@3986: if (river == null || gauge == null) {
teichmann@3986: log.warn("Unknown river or gauge");
teichmann@3986: return null;
teichmann@3986: }
teichmann@3986:
teichmann@3986: String name = gauge.getName();
teichmann@3986:
teichmann@3986: DischargeTables dt = new DischargeTables(river, name);
bjoern@3936:
aheinecke@6301: Map map = dt.getValues();
bjoern@3936:
bjoern@3936: double [][] values = map.get(name);
bjoern@3936: if (values == null) {
bjoern@3936: return null;
bjoern@3936: }
bjoern@3936: double [] kms = new double[values[0].length];
bjoern@3936: Arrays.fill(kms, gauge.getStation().doubleValue());
rrenkert@8326:
rrenkert@8326: Object pnpObject = context.getContextValue(PNP);
rrenkert@8326: if (!(pnpObject instanceof Number)) {
rrenkert@8386: RangeAccess access = new RangeAccess(flys);
rrenkert@8386: double km = Double.NaN;
rrenkert@8386: if (access.getLocations() != null &&
rrenkert@8386: access.getLocations().length > 0) {
rrenkert@8386: km = access.getLocations()[0];
rrenkert@8386: }
tom@8724: Gauge g = access.getRiver().determineGaugeAtStation(km);
rrenkert@8386: if (g != null) {
rrenkert@8386: return new WQKms(
rrenkert@8386: kms,
rrenkert@8386: values[0],
rrenkert@8386: transformToM(values[1], g.getDatum().doubleValue()));
rrenkert@8386: }
tom@8362: return new WQKms(kms, values[0], values[1], name);
rrenkert@8326: }
tom@8856: double[] ws = transformToM(
tom@8856: values[1], ((Number)pnpObject).doubleValue());
rrenkert@8326:
rrenkert@8326: return new WQKms(kms, values[0], ws, name);
rrenkert@8326: }
rrenkert@8326:
rrenkert@8326: private double[] transformToM(double[] ws, double pnp) {
rrenkert@8326: double[] retVals = new double[ws.length];
rrenkert@8326: for (int i = 0; i < ws.length; i++) {
rrenkert@8326: retVals[i] = ws[i]/100 + pnp;
rrenkert@8326: }
rrenkert@8326: return retVals;
bjoern@3936: }
bjoern@3936:
bjoern@3936: @Override
bjoern@3936: public Facet deepCopy() {
bjoern@4032: GaugeDischargeCurveFacet copy = new GaugeDischargeCurveFacet(
bjoern@4187: this.name,
bjoern@4032: this.description);
bjoern@3936: copy.set(this);
bjoern@3936: return copy;
bjoern@3936: }
bjoern@3936: }