Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/org/dive4elements/river/artifacts/states/HistoricalDischargeComputeState.java @ 5831:bd047b71ab37
Repaired internal references
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:06:39 +0200 |
parents | flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/HistoricalDischargeComputeState.java@1b73b731f7bd |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/org/dive4elements/river/artifacts/states/HistoricalDischargeComputeState.java Thu Apr 25 12:06:39 2013 +0200 @@ -0,0 +1,207 @@ +package org.dive4elements.river.artifacts.states; + +import java.text.NumberFormat; + +import java.util.List; + +import org.apache.log4j.Logger; +import org.w3c.dom.Element; + +import org.dive4elements.artifactdatabase.state.Facet; +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; +import org.dive4elements.river.artifacts.FLYSArtifact; +import org.dive4elements.river.artifacts.WINFOArtifact; +import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess; +import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess.EvaluationMode; +import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.DataFacet; +import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.HistoricalDischargeCurveFacet; +import org.dive4elements.river.artifacts.model.HistoricalDischargeData; +import org.dive4elements.river.artifacts.model.HistoricalDischargeDifferenceFacet; +import org.dive4elements.river.artifacts.model.HistoricalDischargeFacet; +import org.dive4elements.river.artifacts.model.HistoricalDischargeWQFacet; +import org.dive4elements.river.artifacts.model.HistoricalWQKms; +import org.dive4elements.river.artifacts.model.HistoricalWQTimerange; +import org.dive4elements.river.artifacts.model.ReportFacet; +import org.dive4elements.river.artifacts.model.WQKms; +import org.dive4elements.river.artifacts.model.WQTimerange; +import org.dive4elements.river.artifacts.resources.Resources; +import org.dive4elements.river.model.TimeInterval; + + +/** + * State to calculate historical discharge curves. + * + * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> + */ +public class HistoricalDischargeComputeState +extends DefaultState +implements FacetTypes { + + private static final Logger logger = Logger + .getLogger(HistoricalDischargeComputeState.class); + + public static final String DEFAULT_UNIT = "cm"; + public static final String I18N_WQ_CURVE_FACET_RANGE = "historical_discharge.wq.curve_range"; + public static final String I18N_WQ_CURVE_FACET_SINCE = "historical_discharge.wq.curve_since"; + + @Override + protected void appendItems(Artifact artifact, ElementCreator creator, + String name, CallContext context, Element select) { + // TODO IMPLEMENT ME + } + + @Override + public Object computeAdvance(FLYSArtifact artifact, String hash, + CallContext context, List<Facet> facets, Object old) { + logger.debug("HistoricalDischargeComputeState.computeAdvance"); + + WINFOArtifact winfo = (WINFOArtifact) artifact; + + CalculationResult res = old instanceof CalculationResult ? (CalculationResult) old + : winfo.getHistoricalDischargeData(); + + if (facets == null) { + return res; + } + + if (res.getReport().hasProblems()) { + facets.add(new ReportFacet(ComputeType.ADVANCE, hash, id)); + } + + HistoricalDischargeData data = (HistoricalDischargeData) res.getData(); + HistoricalDischargeAccess access = new HistoricalDischargeAccess( + artifact); + + WQTimerange[] wqts = (WQTimerange[]) data.getWQTimeranges(); + if (wqts != null && wqts.length > 0) { + facets.add(new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, + hash, id)); + + facets.add(new DataFacet(PDF, "PDF data", ComputeType.ADVANCE, + hash, id)); + + prepareFacets(facets, wqts, access); + } + + WQKms[] wqs = (WQKms[]) data.getWQs(); + if (wqs != null && wqs.length > 0) { + prepareWQFacets(context, facets, wqs, access, hash); + } + + return res; + } + + protected void prepareFacets(List<Facet> facets, WQTimerange[] wqts, + HistoricalDischargeAccess access) { + int i = 0; + + for (WQTimerange wqt : wqts) { + logger.debug("Prepare facet for: " + wqt.getName()); + + EvaluationMode evalMode = access.getEvaluationMode(); + if (evalMode == EvaluationMode.W) { + facets.add(new HistoricalDischargeFacet(i, + HISTORICAL_DISCHARGE_Q, createFacetTitle(wqt))); + + if (wqt instanceof HistoricalWQTimerange) { + logger + .debug("Create another facet for historical differences."); + + // TODO CREATE BETTER TITLE FOR FACETS (issue1180) + facets.add(new HistoricalDischargeDifferenceFacet(i, + HISTORICAL_DISCHARGE_Q_DIFF, "DIFF: " + wqt.getName())); + } + } + else { + facets.add(new HistoricalDischargeFacet(i, + HISTORICAL_DISCHARGE_W, createFacetTitle(wqt))); + + if (wqt instanceof HistoricalWQTimerange) { + logger + .debug("Create another facet for historical differences."); + + // TODO CREATE BETTER TITLE FOR FACETS + facets.add(new HistoricalDischargeDifferenceFacet(i, + HISTORICAL_DISCHARGE_W_DIFF, "DIFF: " + wqt.getName())); + } + } + + i++; + } + } + + protected void prepareWQFacets(CallContext cc, List<Facet> facets, + WQKms[] wqs, HistoricalDischargeAccess access, String hash) { + double[] ws = access.getWs(); + double[] qs = access.getQs(); + + NumberFormat format = NumberFormat.getInstance( + Resources.getLocale(cc.getMeta())); + for (int k = 0; k < ws.length; k++) { + facets.add(new HistoricalDischargeWQFacet(k, + HISTORICAL_DISCHARGE_WQ_W, "W=" + format.format(ws[k]), ComputeType.ADVANCE, + hash, getID(), ws[k])); + } + + for (int k = 0; k < qs.length; k++) { + facets.add(new HistoricalDischargeWQFacet(k, + HISTORICAL_DISCHARGE_WQ_Q, "Q=" + format.format(qs[k]), ComputeType.ADVANCE, + hash, getID(), qs[k])); + } + + int idx = 0; + for (WQKms wqkms : wqs) { + String title = null; + if (wqkms instanceof HistoricalWQKms) { + title = createDischargeCurveTitle(cc, (HistoricalWQKms) wqkms); + } + else { + title = wqkms.getName(); + } + + facets.add(new HistoricalDischargeCurveFacet(idx, + HISTORICAL_DISCHARGE_WQ_CURVE, title, ComputeType.ADVANCE, + getID(), hash)); + idx++; + } + } + + /** Create title for a Discharge-curve, including date. */ + protected String createDischargeCurveTitle(CallContext cc, + HistoricalWQKms wqkms) { + TimeInterval timeInterval = wqkms.getTimeInterval(); + + if (timeInterval.getStopTime() != null) { + return Resources.format(cc.getMeta(), I18N_WQ_CURVE_FACET_RANGE, + I18N_WQ_CURVE_FACET_RANGE, timeInterval.getStartTime(), + timeInterval.getStopTime()); + } + else { + return Resources.format(cc.getMeta(), I18N_WQ_CURVE_FACET_SINCE, + I18N_WQ_CURVE_FACET_SINCE, timeInterval.getStartTime()); + } + } + + + /** Create string for facets name/description. */ + protected String createFacetTitle(WQTimerange wqt) { + String name = wqt.getName(); + + return name != null && name.indexOf("W") >= 0 ? createFacetTitleW(wqt) + : createFacetTitleQ(wqt); + } + + protected String createFacetTitleW(WQTimerange wqt) { + String name = wqt.getName(); + return name + " " + DEFAULT_UNIT; + } + + protected String createFacetTitleQ(WQTimerange wqt) { + return wqt.getName(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :