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.states.fixation;
sascha@3413:
teichmann@7525: import java.text.DateFormat;
teichmann@7525: import java.util.Collection;
teichmann@7525: import java.util.Date;
ingo@3466: import java.util.List;
ingo@3466:
ingo@3466: import org.apache.log4j.Logger;
teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet;
teichmann@5831: import org.dive4elements.artifacts.CallContext;
teichmann@5831: import org.dive4elements.artifacts.CallMeta;
teichmann@5867: import org.dive4elements.river.artifacts.D4EArtifact;
teichmann@5831: import org.dive4elements.river.artifacts.access.FixRealizingAccess;
teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult;
teichmann@5831: import org.dive4elements.river.artifacts.model.CrossSectionWaterLineFacet;
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.ReportFacet;
teichmann@5831: import org.dive4elements.river.artifacts.model.WQCKms;
teichmann@5831: import org.dive4elements.river.artifacts.model.WQKms;
teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.FixOutlierFacet;
teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.FixRealizingCalculation;
teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult;
teichmann@7525: import org.dive4elements.river.artifacts.model.fixings.FixReferenceEventsFacet;
teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.FixWQCurveFacet;
teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.FixWaterlevelFacet;
teichmann@5831: import org.dive4elements.river.artifacts.resources.Resources;
teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState;
teichmann@7525: import org.dive4elements.river.utils.Formatter;
teichmann@7525: import org.dive4elements.river.utils.UniqueDateFormatter;
ingo@3460:
sascha@3413: /**
felix@5646: * State to compute the fixation realizing (vollmer) results.
felix@5646: *
sascha@3413: * @author Raimund Renkert
sascha@3413: */
felix@3457: public class FixRealizingCompute extends DefaultState implements FacetTypes {
sascha@3413:
teichmann@8202: /** The log used in this class. */
teichmann@8202: private static Logger log = Logger.getLogger(FixRealizingCompute.class);
sascha@3413:
ingo@3466: public static final String I18N_WQ_CURVE = "fix.vollmer.wq.curve";
ingo@3466:
ingo@3466: public static final String I18N_WQ_OUTLIER = "fix.vollmer.wq.outliers";
ingo@3466:
sascha@3413: /**
sascha@3413: * The default constructor that initializes an empty State object.
sascha@3413: */
sascha@3413: public FixRealizingCompute() {
sascha@3413: }
sascha@3414:
sascha@3414: @Override
gernotbelger@9082: public Object computeAdvance(final D4EArtifact artifact, final String hash, final CallContext context, final List facets, final Object old) {
teichmann@8202: log.debug("FixRealizingCompute.computeAdvance");
sascha@3414:
sascha@3414: CalculationResult res;
sascha@3414:
gernotbelger@9082: final FixRealizingAccess access = new FixRealizingAccess(artifact);
sascha@3414:
sascha@3414: if (old instanceof CalculationResult) {
felix@5646: res = (CalculationResult) old;
gernotbelger@9082: } else {
gernotbelger@9082: final FixRealizingCalculation calc = new FixRealizingCalculation(access);
sascha@3414: res = calc.calculate();
sascha@3414: }
sascha@3414:
sascha@3414: if (facets == null) {
sascha@3414: return res;
sascha@3414: }
sascha@3414:
sascha@3461: if (res.getReport().hasProblems()) {
sascha@3461: facets.add(new ReportFacet());
sascha@3461: }
sascha@3461:
gernotbelger@9082: final String id = getID();
gernotbelger@9082: final CallMeta meta = context.getMeta();
sascha@3775:
gernotbelger@9082: final FixRealizingResult fixRes = (FixRealizingResult) res.getData();
gernotbelger@9082: final WQKms[] wqkms = fixRes != null ? fixRes.getWQKms() : new WQKms[0];
ingo@3460:
ingo@3460: for (int i = 0; i < wqkms.length; i++) {
ingo@3460: String nameW = null;
ingo@3460: String nameQ = null;
ingo@3460:
ingo@3460: if (access.isQ()) {
ingo@3460: nameQ = wqkms[i].getName();
ingo@3460: nameW = "W(" + nameQ + ")";
gernotbelger@9082: } else {
ingo@3460: nameW = wqkms[i].getName();
ingo@3460: nameQ = "Q(" + nameW + ")";
ingo@3460: }
ingo@3460:
gernotbelger@9082: final Facet wq = new FixWaterlevelFacet(i, FIX_WQ_LS, nameW, ComputeType.ADVANCE, hash, id);
felix@6493:
gernotbelger@9082: final Facet w = new FixWaterlevelFacet(i, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, hash, id);
ingo@3460:
gernotbelger@9082: final Facet q = new FixWaterlevelFacet(i, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, hash, id);
gernotbelger@9082: final Facet csFacet = new CrossSectionWaterLineFacet(i, nameW);
ingo@3460:
felix@6493: facets.add(wq);
ingo@3460: facets.add(w);
ingo@3460: facets.add(q);
felix@4509: facets.add(csFacet);
ingo@3460:
teichmann@7525: // XXX: THIS CAN NOT HAPPEN! REMOVE IT!
ingo@3460: if (wqkms[i] instanceof WQCKms) {
gernotbelger@9082: final String nameC = nameW.replace("benutzerdefiniert", "benutzerdefiniert [korrigiert]");
ingo@3460:
gernotbelger@9082: final Facet c = new FixWaterlevelFacet(i, DISCHARGE_LONGITUDINAL_C, nameC);
ingo@3460:
ingo@3460: facets.add(c);
ingo@3460: }
sascha@3414: }
sascha@3414:
tom@8703: if (wqkms.length > 0) {
gernotbelger@9082: final DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy");
gernotbelger@9082: final DateFormat lf = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy'T'HH:mm");
teichmann@7525:
gernotbelger@9082: final Collection reds = fixRes.getReferenceEventsDates();
gernotbelger@9082: final UniqueDateFormatter cf = new UniqueDateFormatter(df, lf, reds);
felix@5730:
tom@8703: int i = 0;
gernotbelger@9082: for (final Date d : reds) {
gernotbelger@9082: facets.add(new FixReferenceEventsFacet((1 << 9) | i, FIX_EVENTS, cf.format(d)));
tom@8703: i++;
tom@8703: }
tom@8703:
gernotbelger@9082: facets.add(new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, hash, id));
ingo@3466:
gernotbelger@9082: facets.add(new DataFacet(WST, "WST data", ComputeType.ADVANCE, hash, id));
ingo@3466:
gernotbelger@9082: facets.add(new DataFacet(PDF, "PDF data", ComputeType.ADVANCE, hash, id));
ingo@3460: }
felix@3459:
gernotbelger@9082: facets.add(new DataFacet(AT, "AT data", ComputeType.ADVANCE, hash, id));
rrenkert@5055:
gernotbelger@9082: facets.add(new FixWQCurveFacet(0, Resources.getMsg(meta, I18N_WQ_CURVE, I18N_WQ_CURVE) + " (" + access.getFunction() + ")"));
ingo@3466:
felix@5849: if (access.getPreprocessing()) {
gernotbelger@9082: facets.add(new FixOutlierFacet(0, FIX_OUTLIER, Resources.getMsg(meta, I18N_WQ_OUTLIER, I18N_WQ_OUTLIER)));
felix@5849: }
ingo@3466:
sascha@3414: return res;
sascha@3414: }
sascha@3413: }