raimund@3028: package de.intevation.flys.artifacts.model.fixings;
raimund@3028:
raimund@3028: import de.intevation.artifacts.Artifact;
raimund@3028: import de.intevation.artifacts.CallContext;
raimund@3028:
raimund@3028: import de.intevation.flys.artifacts.FLYSArtifact;
raimund@3028:
sascha@3408: import de.intevation.flys.artifacts.access.FixAnalysisAccess;
sascha@3203:
sascha@3203: import de.intevation.flys.artifacts.model.CalculationResult;
sascha@3203: import de.intevation.flys.artifacts.model.DataFacet;
raimund@3028: import de.intevation.flys.artifacts.model.FacetTypes;
sascha@3203:
felix@3467: import de.intevation.flys.artifacts.model.QWDDateRange;
felix@3467:
sascha@3203: import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
raimund@3028:
raimund@3028: import de.intevation.flys.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
raimund@3028: extends DataFacet
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;
sascha@3408: FixAnalysisAccess access = new FixAnalysisAccess(flys);
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:
raimund@3088: double currentKm =
raimund@3088: ((Double)context.getContextValue("currentKm")).doubleValue();
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 :