teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.states; ingo@2191: felix@4928: import java.text.NumberFormat; felix@4928: ingo@2215: import java.util.List; ingo@2191: ingo@4232: import org.apache.log4j.Logger; ingo@2191: import org.w3c.dom.Element; ingo@2191: teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; teichmann@5831: import org.dive4elements.river.artifacts.FLYSArtifact; teichmann@5831: import org.dive4elements.river.artifacts.WINFOArtifact; teichmann@5831: import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess; teichmann@5831: import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess.EvaluationMode; teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult; teichmann@5831: import org.dive4elements.river.artifacts.model.DataFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.model.HistoricalDischargeCurveFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.HistoricalDischargeData; teichmann@5831: import org.dive4elements.river.artifacts.model.HistoricalDischargeDifferenceFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.HistoricalDischargeFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.HistoricalDischargeWQFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.HistoricalWQKms; teichmann@5831: import org.dive4elements.river.artifacts.model.HistoricalWQTimerange; teichmann@5831: import org.dive4elements.river.artifacts.model.ReportFacet; teichmann@5831: import org.dive4elements.river.artifacts.model.WQKms; teichmann@5831: import org.dive4elements.river.artifacts.model.WQTimerange; teichmann@5831: import org.dive4elements.river.artifacts.resources.Resources; teichmann@5831: import org.dive4elements.river.model.TimeInterval; ingo@2191: ingo@2191: ingo@2191: /** felix@3047: * State to calculate historical discharge curves. teichmann@4736: * ingo@2191: * @author Ingo Weinzierl ingo@2191: */ felix@4927: public class HistoricalDischargeComputeState felix@4927: extends DefaultState felix@4927: implements FacetTypes { ingo@2215: ingo@4232: private static final Logger logger = Logger ingo@4232: .getLogger(HistoricalDischargeComputeState.class); ingo@2215: ingo@4144: public static final String DEFAULT_UNIT = "cm"; ingo@4241: public static final String I18N_WQ_CURVE_FACET_RANGE = "historical_discharge.wq.curve_range"; ingo@4241: public static final String I18N_WQ_CURVE_FACET_SINCE = "historical_discharge.wq.curve_since"; ingo@4144: ingo@2191: @Override ingo@4232: protected void appendItems(Artifact artifact, ElementCreator creator, ingo@4232: String name, CallContext context, Element select) { ingo@2191: // TODO IMPLEMENT ME ingo@2191: } ingo@2215: ingo@2215: @Override ingo@4232: public Object computeAdvance(FLYSArtifact artifact, String hash, ingo@4232: CallContext context, List facets, Object old) { ingo@2215: logger.debug("HistoricalDischargeComputeState.computeAdvance"); ingo@2215: ingo@2215: WINFOArtifact winfo = (WINFOArtifact) artifact; ingo@2215: ingo@4232: CalculationResult res = old instanceof CalculationResult ? (CalculationResult) old ingo@2215: : winfo.getHistoricalDischargeData(); ingo@2215: ingo@2215: if (facets == null) { ingo@2215: return res; ingo@2215: } ingo@2215: ingo@2250: if (res.getReport().hasProblems()) { ingo@2250: facets.add(new ReportFacet(ComputeType.ADVANCE, hash, id)); ingo@2250: } ingo@2250: ingo@4241: HistoricalDischargeData data = (HistoricalDischargeData) res.getData(); ingo@4241: HistoricalDischargeAccess access = new HistoricalDischargeAccess( ingo@4241: artifact); ingo@4241: ingo@4241: WQTimerange[] wqts = (WQTimerange[]) data.getWQTimeranges(); ingo@4241: if (wqts != null && wqts.length > 0) { ingo@4241: facets.add(new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, ingo@4241: hash, id)); ingo@4241: ingo@4241: facets.add(new DataFacet(PDF, "PDF data", ComputeType.ADVANCE, ingo@4241: hash, id)); ingo@4241: ingo@4241: prepareFacets(facets, wqts, access); ingo@2228: } ingo@2215: ingo@4241: WQKms[] wqs = (WQKms[]) data.getWQs(); ingo@4241: if (wqs != null && wqs.length > 0) { ingo@4241: prepareWQFacets(context, facets, wqs, access, hash); ingo@4241: } ingo@2215: ingo@2215: return res; ingo@2215: } ingo@2228: ingo@4232: protected void prepareFacets(List facets, WQTimerange[] wqts, ingo@4232: HistoricalDischargeAccess access) { ingo@2228: int i = 0; ingo@2228: ingo@4232: for (WQTimerange wqt : wqts) { ingo@2228: logger.debug("Prepare facet for: " + wqt.getName()); ingo@2228: ingo@4232: EvaluationMode evalMode = access.getEvaluationMode(); ingo@4232: if (evalMode == EvaluationMode.W) { ingo@4232: facets.add(new HistoricalDischargeFacet(i, ingo@4232: HISTORICAL_DISCHARGE_Q, createFacetTitle(wqt))); ingo@2311: ingo@4232: if (wqt instanceof HistoricalWQTimerange) { ingo@4232: logger ingo@4232: .debug("Create another facet for historical differences."); ingo@2311: felix@5335: // TODO CREATE BETTER TITLE FOR FACETS (issue1180) ingo@4232: facets.add(new HistoricalDischargeDifferenceFacet(i, ingo@4232: HISTORICAL_DISCHARGE_Q_DIFF, "DIFF: " + wqt.getName())); ingo@4232: } ingo@4232: } ingo@4232: else { ingo@4232: facets.add(new HistoricalDischargeFacet(i, ingo@4232: HISTORICAL_DISCHARGE_W, createFacetTitle(wqt))); ingo@4232: ingo@4232: if (wqt instanceof HistoricalWQTimerange) { ingo@4232: logger ingo@4232: .debug("Create another facet for historical differences."); ingo@4232: ingo@4232: // TODO CREATE BETTER TITLE FOR FACETS ingo@4232: facets.add(new HistoricalDischargeDifferenceFacet(i, ingo@4232: HISTORICAL_DISCHARGE_W_DIFF, "DIFF: " + wqt.getName())); ingo@4232: } ingo@2311: } ingo@2311: ingo@2311: i++; ingo@2228: } ingo@2228: } ingo@4144: ingo@4241: protected void prepareWQFacets(CallContext cc, List facets, ingo@4241: WQKms[] wqs, HistoricalDischargeAccess access, String hash) { ingo@4241: double[] ws = access.getWs(); ingo@4241: double[] qs = access.getQs(); ingo@4241: felix@4928: NumberFormat format = NumberFormat.getInstance( felix@4928: Resources.getLocale(cc.getMeta())); ingo@4241: for (int k = 0; k < ws.length; k++) { ingo@4260: facets.add(new HistoricalDischargeWQFacet(k, felix@4928: HISTORICAL_DISCHARGE_WQ_W, "W=" + format.format(ws[k]), ComputeType.ADVANCE, ingo@4260: hash, getID(), ws[k])); ingo@4241: } ingo@4241: ingo@4241: for (int k = 0; k < qs.length; k++) { ingo@4260: facets.add(new HistoricalDischargeWQFacet(k, felix@4928: HISTORICAL_DISCHARGE_WQ_Q, "Q=" + format.format(qs[k]), ComputeType.ADVANCE, ingo@4260: hash, getID(), qs[k])); ingo@4241: } ingo@4241: ingo@4241: int idx = 0; ingo@4241: for (WQKms wqkms : wqs) { ingo@4241: String title = null; ingo@4241: if (wqkms instanceof HistoricalWQKms) { ingo@4241: title = createDischargeCurveTitle(cc, (HistoricalWQKms) wqkms); ingo@4241: } ingo@4241: else { ingo@4241: title = wqkms.getName(); ingo@4241: } ingo@4241: ingo@4241: facets.add(new HistoricalDischargeCurveFacet(idx, ingo@4241: HISTORICAL_DISCHARGE_WQ_CURVE, title, ComputeType.ADVANCE, ingo@4241: getID(), hash)); ingo@4241: idx++; ingo@4241: } ingo@4241: } ingo@4241: felix@5339: /** Create title for a Discharge-curve, including date. */ ingo@4241: protected String createDischargeCurveTitle(CallContext cc, ingo@4241: HistoricalWQKms wqkms) { ingo@4241: TimeInterval timeInterval = wqkms.getTimeInterval(); ingo@4241: ingo@4241: if (timeInterval.getStopTime() != null) { ingo@4241: return Resources.format(cc.getMeta(), I18N_WQ_CURVE_FACET_RANGE, ingo@4241: I18N_WQ_CURVE_FACET_RANGE, timeInterval.getStartTime(), ingo@4241: timeInterval.getStopTime()); ingo@4241: } ingo@4241: else { ingo@4241: return Resources.format(cc.getMeta(), I18N_WQ_CURVE_FACET_SINCE, ingo@4241: I18N_WQ_CURVE_FACET_SINCE, timeInterval.getStartTime()); ingo@4241: } ingo@4241: } ingo@4241: felix@5339: felix@5339: /** Create string for facets name/description. */ ingo@4144: protected String createFacetTitle(WQTimerange wqt) { ingo@4144: String name = wqt.getName(); ingo@4144: ingo@4232: return name != null && name.indexOf("W") >= 0 ? createFacetTitleW(wqt) ingo@4144: : createFacetTitleQ(wqt); ingo@4144: } ingo@4144: ingo@4144: protected String createFacetTitleW(WQTimerange wqt) { ingo@4144: String name = wqt.getName(); ingo@4144: return name + " " + DEFAULT_UNIT; ingo@4144: } ingo@4144: ingo@4144: protected String createFacetTitleQ(WQTimerange wqt) { ingo@4144: return wqt.getName(); ingo@4144: } ingo@2191: } ingo@2191: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :