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.model.fixings; raimund@3028: teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; sascha@3203: teichmann@5831: import org.dive4elements.river.artifacts.FLYSArtifact; felix@3467: teichmann@5831: import org.dive4elements.river.artifacts.access.FixAnalysisAccess; raimund@3028: teichmann@5831: import org.dive4elements.river.artifacts.model.CalculationResult; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: teichmann@5831: import org.dive4elements.river.artifacts.model.QWDDateRange; teichmann@5831: teichmann@5831: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; teichmann@5831: teichmann@5831: import org.dive4elements.river.utils.KMIndex; raimund@3028: sascha@3203: import org.apache.log4j.Logger; raimund@3028: raimund@3028: raimund@3028: /** raimund@3028: * Facet to show average W values for Q sectors. raimund@3028: * raimund@3028: * @author Raimund Renkert raimund@3028: */ raimund@3028: public class FixAvSectorFacet bjoern@4442: extends FixingsFacet raimund@3028: implements FacetTypes { raimund@3028: raimund@3028: /** House logger. */ raimund@3028: private static Logger logger = Logger.getLogger(FixAvSectorFacet.class); raimund@3028: raimund@3028: /** Trivial Constructor. */ raimund@3028: public FixAvSectorFacet() { raimund@3028: } raimund@3028: raimund@3028: raimund@3043: public FixAvSectorFacet(int ndx, String name, String description) { raimund@3028: super( raimund@3028: ndx, raimund@3043: name, raimund@3028: description, raimund@3028: ComputeType.ADVANCE, raimund@3028: null, raimund@3028: null); raimund@3028: } raimund@3028: raimund@3028: raimund@3028: /** raimund@3028: * Returns the data this facet requires. raimund@3028: * raimund@3028: * @param artifact the owner artifact. raimund@3028: * @param context the CallContext. raimund@3028: * raimund@3028: * @return the data as QWD array (QWD[]). raimund@3028: */ raimund@3028: @Override raimund@3028: public Object getData(Artifact artifact, CallContext context) { raimund@3028: logger.debug("FixAvSectorFacet.getData"); raimund@3028: raimund@3028: if (artifact instanceof FLYSArtifact) { raimund@3028: FLYSArtifact flys = (FLYSArtifact)artifact; rrenkert@4866: FixAnalysisAccess access = new FixAnalysisAccess(flys, context); raimund@3028: raimund@3028: CalculationResult res = raimund@3028: (CalculationResult) flys.compute(context, raimund@3028: ComputeType.ADVANCE, raimund@3028: false); raimund@3028: sascha@3415: FixAnalysisResult result = (FixAnalysisResult) res.getData(); raimund@3028: bjoern@4442: double currentKm = getCurrentKm(context); raimund@3028: KMIndex kmPeriods = result.getAnalysisPeriods(); christian@3062: KMIndex.Entry kmPeriodsEntry = raimund@3080: kmPeriods.binarySearch(currentKm); christian@3062: christian@3062: if (kmPeriodsEntry == null) { raimund@3080: logger.warn("No analysis periods found for km '" + currentKm + "'"); christian@3062: return null; christian@3062: } christian@3062: christian@3062: AnalysisPeriod[] periods = kmPeriodsEntry.getValue(); raimund@3028: raimund@3028: if (periods == null) { ingo@3066: logger.warn("No analysis periods specified!"); raimund@3028: return null; raimund@3028: } ingo@3066: christian@3067: QWD[] qwdData = null; raimund@3131: int sectorNdx = index & 3; raimund@3131: int periodNdx = index >> 2; raimund@3131: raimund@3131: if (periodNdx < periods.length) { raimund@3131: qwdData = periods[periodNdx].getQSectorAverages(); christian@3067: } ingo@3066: ingo@3066: if (logger.isDebugEnabled()) { ingo@3066: int resSize = qwdData != null ? qwdData.length : -1; ingo@3066: logger.debug("Found " + resSize + " result elements."); ingo@3066: } ingo@3066: raimund@3131: if (qwdData == null) { raimund@3131: return null; raimund@3131: } felix@3467: return new QWDDateRange(qwdData[sectorNdx], periods[periodNdx].getDateRange()); raimund@3028: } raimund@3028: else { ingo@3066: logger.warn("Artifact is no instance of FLYSArtifact."); raimund@3028: return null; raimund@3028: } raimund@3028: } raimund@3028: raimund@3028: raimund@3028: /** raimund@3028: * Create a deep copy of this Facet. raimund@3028: * @return a deep copy. raimund@3028: */ raimund@3028: @Override raimund@3028: public FixAvSectorFacet deepCopy() { raimund@3028: FixAvSectorFacet copy = new FixAvSectorFacet(); raimund@3028: copy.set(this); raimund@3028: return copy; raimund@3028: } raimund@3028: } raimund@3028: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :