ingo@2191: package de.intevation.flys.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:
ingo@4232: import de.intevation.artifactdatabase.state.Facet;
ingo@2191: import de.intevation.artifacts.Artifact;
ingo@2191: import de.intevation.artifacts.CallContext;
ingo@2191: import de.intevation.artifacts.common.utils.XMLUtils.ElementCreator;
ingo@2215: import de.intevation.flys.artifacts.FLYSArtifact;
ingo@2215: import de.intevation.flys.artifacts.WINFOArtifact;
ingo@4232: import de.intevation.flys.artifacts.access.HistoricalDischargeAccess;
ingo@4232: import de.intevation.flys.artifacts.access.HistoricalDischargeAccess.EvaluationMode;
ingo@2215: import de.intevation.flys.artifacts.model.CalculationResult;
ingo@2258: import de.intevation.flys.artifacts.model.DataFacet;
ingo@2215: import de.intevation.flys.artifacts.model.FacetTypes;
ingo@4241: import de.intevation.flys.artifacts.model.HistoricalDischargeCurveFacet;
ingo@4241: import de.intevation.flys.artifacts.model.HistoricalDischargeData;
ingo@4232: import de.intevation.flys.artifacts.model.HistoricalDischargeDifferenceFacet;
ingo@2215: import de.intevation.flys.artifacts.model.HistoricalDischargeFacet;
ingo@4241: import de.intevation.flys.artifacts.model.HistoricalDischargeWQFacet;
ingo@4241: import de.intevation.flys.artifacts.model.HistoricalWQKms;
ingo@2311: import de.intevation.flys.artifacts.model.HistoricalWQTimerange;
ingo@2244: import de.intevation.flys.artifacts.model.ReportFacet;
ingo@4241: import de.intevation.flys.artifacts.model.WQKms;
ingo@2228: import de.intevation.flys.artifacts.model.WQTimerange;
ingo@4241: import de.intevation.flys.artifacts.resources.Resources;
ingo@4241: import de.intevation.flys.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:
ingo@4232: // TODO CREATE BETTER TITLE FOR FACETS
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:
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:
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 :