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; ingo@3466: import java.util.List; ingo@3466: gernotbelger@9415: import org.apache.commons.lang.math.DoubleRange; 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.FixRealizingCalculation; teichmann@5831: import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult; teichmann@7525: import org.dive4elements.river.artifacts.model.fixings.FixReferenceEventsFacet; gernotbelger@9415: import org.dive4elements.river.artifacts.model.fixings.FixResultColumn; gernotbelger@9415: import org.dive4elements.river.artifacts.model.fixings.FixResultColumns; 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; 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: gernotbelger@9415: private static final long serialVersionUID = 1L; gernotbelger@9415: 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: 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@9425: final String stateId = 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@9425: facets.add(new FixWaterlevelFacet(i, FIX_WQ_LS, nameW, ComputeType.ADVANCE, hash, stateId)); gernotbelger@9425: facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, hash, stateId)); gernotbelger@9425: facets.add(new FixWaterlevelFacet(i, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, hash, stateId)); gernotbelger@9425: facets.add(new CrossSectionWaterLineFacet(i, nameW, ComputeType.ADVANCE, hash, stateId, Integer.valueOf(i))); 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]"); gernotbelger@9360: facets.add(new FixWaterlevelFacet(i, DISCHARGE_LONGITUDINAL_C, nameC)); ingo@3460: } sascha@3414: } sascha@3414: gernotbelger@9415: int facetIndex = 0; teichmann@7525: gernotbelger@9415: if (fixRes != null && wqkms.length > 0) { felix@5730: gernotbelger@9415: final DateFormat df = Formatter.getDateFormatter(context.getMeta(), "dd.MM.yyyy"); gernotbelger@9415: final UniqueDateFormatter cf = new UniqueDateFormatter(df); gernotbelger@9415: gernotbelger@9415: final FixResultColumns columns = fixRes.getFixResultColumns(); gernotbelger@9415: final Collection fixEvents = columns.getSortedColumns(); gernotbelger@9415: for (final FixResultColumn event : fixEvents) { gernotbelger@9415: gernotbelger@9415: final String facetDescription = cf.format(event.getDate()); gernotbelger@9415: final DoubleRange stationRange = event.getStationRange(); gernotbelger@9415: gernotbelger@9415: facets.add(new FixReferenceEventsFacet(facetIndex++, event.getColumnId(), FIX_EVENTS, facetDescription, stationRange)); tom@8703: } tom@8703: gernotbelger@9425: facets.add(new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, hash, stateId)); gernotbelger@9425: facets.add(new DataFacet(WST, "WST data", ComputeType.ADVANCE, hash, stateId)); gernotbelger@9425: facets.add(new DataFacet(PDF, "PDF data", ComputeType.ADVANCE, hash, stateId)); ingo@3460: } felix@3459: gernotbelger@9425: facets.add(new DataFacet(AT, "AT data", ComputeType.ADVANCE, hash, stateId)); rrenkert@5055: gernotbelger@9342: if (fixRes != null) gernotbelger@9342: facets.add(new FixWQCurveFacet(0, Resources.getMsg(meta, I18N_WQ_CURVE, I18N_WQ_CURVE) + " (" + access.getFunction() + ")")); ingo@3466: sascha@3414: return res; sascha@3414: } gernotbelger@9342: }