raimund@2651: package de.intevation.flys.artifacts.states.fixation;
raimund@2651:
sascha@2784: import de.intevation.artifactdatabase.state.Facet;
sascha@2784:
sascha@2784: import de.intevation.artifacts.CallContext;
sascha@2784:
sascha@2784: import de.intevation.flys.artifacts.FLYSArtifact;
sascha@3203:
sascha@3203: import de.intevation.flys.artifacts.access.FixationArtifactAccess;
sascha@2784:
sascha@2784: import de.intevation.flys.artifacts.model.CalculationResult;
sascha@2992: import de.intevation.flys.artifacts.model.DataFacet;
sascha@3210: import de.intevation.flys.artifacts.model.DateRange;
sascha@2992: import de.intevation.flys.artifacts.model.FacetTypes;
sascha@2784: import de.intevation.flys.artifacts.model.ReportFacet;
sascha@2784:
raimund@3035: import de.intevation.flys.artifacts.model.fixings.FixAnalysisEventsFacet;
raimund@3043: import de.intevation.flys.artifacts.model.fixings.FixAnalysisPeriodsFacet;
sascha@3203: import de.intevation.flys.artifacts.model.fixings.FixAvSectorFacet;
sascha@3203: import de.intevation.flys.artifacts.model.fixings.FixCalculation;
raimund@3043: import de.intevation.flys.artifacts.model.fixings.FixDerivateFacet;
raimund@3131: import de.intevation.flys.artifacts.model.fixings.FixDeviationFacet;
raimund@3169: import de.intevation.flys.artifacts.model.fixings.FixLongitudinalAnalysisFacet;
raimund@3169: import de.intevation.flys.artifacts.model.fixings.FixLongitudinalDeviationFacet;
raimund@3169: import de.intevation.flys.artifacts.model.fixings.FixLongitudinalReferenceFacet;
sascha@3203: import de.intevation.flys.artifacts.model.fixings.FixOutlierFacet;
sascha@3203: import de.intevation.flys.artifacts.model.fixings.FixReferenceEventsFacet;
sascha@3204: import de.intevation.flys.artifacts.model.fixings.FixResult;
sascha@3203: import de.intevation.flys.artifacts.model.fixings.FixWQCurveFacet;
raimund@3028:
sascha@3203: import de.intevation.flys.artifacts.resources.Resources;
raimund@3028:
raimund@2651: import de.intevation.flys.artifacts.states.DefaultState;
raimund@2651:
sascha@3203: import java.text.DateFormat;
raimund@3049:
sascha@2784: import java.util.List;
sascha@2784:
sascha@2784: import org.apache.log4j.Logger;
sascha@2784:
raimund@2651: /**
raimund@2651: * @author Raimund Renkert
raimund@2651: */
sascha@2992: public class FixationCompute
sascha@2992: extends DefaultState
sascha@2992: implements FacetTypes
sascha@2992: {
raimund@2651:
sascha@2784: /** The log used in this class. */
sascha@2784: private static Logger log = Logger.getLogger(FixationCompute.class);
raimund@2651:
raimund@3135: private static final String I18N_REFERENCEPERIOD = "fix.reference.period.events";
raimund@3049:
raimund@3049: private static final String I18N_ANALYSISPERIODS = "fix.analysis.periods";
raimund@3049:
raimund@3049: private static final String I18N_DERIVATIVE = "fix.derivative";
raimund@3049:
raimund@3049: private static final String I18N_OUTLIER = "fix.outlier";
raimund@2651:
raimund@3135: private static final String I18N_ANALYSIS = "fix.analysis";
raimund@3135:
raimund@3135: private static final String I18N_DEVIATION = "fix.deviation";
raimund@3135:
raimund@3169: private static final String I18N_REFERENCEDEVIATION = "fix.reference.deviation";
raimund@3169:
christian@3192: public static class IdGenerator {
christian@3192: private int id;
christian@3192:
christian@3192: public IdGenerator() {
christian@3192: }
christian@3192:
christian@3192: public IdGenerator(int id) {
christian@3192: this.id = id;
christian@3192: }
christian@3192:
christian@3192: public int next() {
christian@3192: return id++;
christian@3192: }
christian@3192:
christian@3192: public int next(int s) {
christian@3192: return id += s;
christian@3192: }
christian@3192: }
christian@3192:
raimund@2651: /**
raimund@2651: * The default constructor that initializes an empty State object.
raimund@2651: */
raimund@2651: public FixationCompute() {
raimund@2651: }
raimund@2651:
sascha@2784: @Override
sascha@2784: public Object computeAdvance(
sascha@2784: FLYSArtifact artifact,
sascha@2784: String hash,
sascha@2784: CallContext context,
sascha@2784: List facets,
sascha@2784: Object old
sascha@2784: ) {
sascha@2784: log.debug("FixationCompute.computeAdvance");
sascha@2784:
sascha@3203:
sascha@2784: CalculationResult res;
sascha@2784:
raimund@3028: FixationArtifactAccess access =
raimund@3028: new FixationArtifactAccess(artifact);
raimund@3028:
sascha@2784: if (old instanceof CalculationResult) {
sascha@2784: res = (CalculationResult)old;
sascha@2784: }
sascha@2784: else {
sascha@3204: FixCalculation calc = new FixCalculation(access);
sascha@2784: res = calc.calculate();
sascha@2784: }
sascha@2784:
sascha@2784: if (facets == null) {
sascha@2784: return res;
sascha@2784: }
sascha@2784:
sascha@2784: if (res.getReport().hasProblems()) {
sascha@2784: facets.add(new ReportFacet(ComputeType.ADVANCE, hash, id));
sascha@2784: }
sascha@3204:
sascha@3204: FixResult fr = (FixResult)res.getData();
sascha@3204:
sascha@3204: if (fr == null) {
sascha@3204: return res;
sascha@3204: }
sascha@3204:
sascha@2992: facets.add(
sascha@2992: new DataFacet(CSV, "CSV data", ComputeType.ADVANCE, hash, id));
sascha@2784:
sascha@3203: int maxId = -100;
sascha@3186:
raimund@3028: int count = access.getAnalysisPeriods().length;
christian@3192:
sascha@3204: int sectorMask = fr.getUsedSectorsInAnalysisPeriods();
sascha@3204:
raimund@3028: for (int i = 0; i < count; i++) {
raimund@3028: DateRange period = access.getAnalysisPeriods()[i];
raimund@3135: DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
raimund@3135: String startDate = df.format(period.getFrom());
raimund@3135: String endDate = df.format(period.getTo());
raimund@3135:
raimund@3028: for (int j = access.getQSectorStart().intValue();
raimund@3043: j <= access.getQSectorEnd().intValue();
raimund@3028: j++) {
raimund@3048:
sascha@3204: // Only emit facet for sectors that really have data.
sascha@3204: if ((sectorMask & (1 << j)) == 0) {
sascha@3204: continue;
sascha@3204: }
sascha@3204:
raimund@3048: String sector = "";
raimund@3048: switch (j) {
raimund@3048: case 0: sector = "[0 - (MNQ+MQ)/2)"; break;
raimund@3048: case 1: sector = "[(MNQ+MQ)/2 - (MQ+MHQ)/2)"; break;
raimund@3048: case 2: sector = "[(MQ+MHQ)/2 - HQ5)"; break;
raimund@3048: case 3: sector = "[HQ5 - \u221e)"; break;
raimund@3048: }
raimund@3048: String description = sector + ": " +
raimund@3048: startDate + " - " +
raimund@3048: endDate;
raimund@3131:
raimund@3131: int sectorNdx = j - access.getQSectorStart().intValue();
raimund@3131: int facetNdx = i << 2;
raimund@3131: facetNdx = facetNdx | j;
raimund@3131:
christian@3205: if (facetNdx > maxId)
christian@3205: maxId = facetNdx;
christian@3192:
raimund@3028: facets.add(
raimund@3131: new FixAvSectorFacet(facetNdx,
raimund@3131: FIX_SECTOR_AVERAGE_DWT + "_" + sectorNdx,
raimund@3028: description));
raimund@3043: facets.add(
raimund@3169: new FixLongitudinalAnalysisFacet(facetNdx,
raimund@3169: FIX_SECTOR_AVERAGE_LS + "_" + sectorNdx,
raimund@3043: description));
sascha@3204: // TODO: i18n
raimund@3169: String dev = "Abweichung: " + description;
raimund@3169: facets.add(
raimund@3169: new FixLongitudinalAnalysisFacet(facetNdx,
raimund@3169: FIX_SECTOR_AVERAGE_LS_DEVIATION + "_" + sectorNdx,
raimund@3169: dev));
raimund@3043: facets.add(
raimund@3131: new FixAvSectorFacet(facetNdx,
christian@3133: FIX_SECTOR_AVERAGE_WQ + "_" + sectorNdx,
raimund@3043: description));
raimund@3043:
raimund@3028: }
christian@3192:
raimund@3135: String eventDesc =
raimund@3135: Resources.getMsg(context.getMeta(),
raimund@3135: I18N_ANALYSIS,
raimund@3135: I18N_ANALYSIS) +
raimund@3135: ": " + startDate + " - " + endDate;
raimund@3043: facets.add(new FixAnalysisEventsFacet(i,
raimund@3043: FIX_ANALYSIS_EVENTS_DWT,
raimund@3043: eventDesc));
raimund@3169: facets.add(new FixLongitudinalAnalysisFacet(i,
raimund@3043: FIX_ANALYSIS_EVENTS_LS,
raimund@3043: eventDesc));
raimund@3043: facets.add(new FixAnalysisEventsFacet(i,
raimund@3043: FIX_ANALYSIS_EVENTS_WQ,
raimund@3043: eventDesc));
raimund@3028: }
raimund@3049:
christian@3205: IdGenerator idg = new IdGenerator(maxId + 1);
christian@3192:
raimund@3049: String i18n_ref = Resources.getMsg(context.getMeta(),
raimund@3049: I18N_REFERENCEPERIOD,
raimund@3049: I18N_REFERENCEPERIOD);
raimund@3169: String i18n_dev = Resources.getMsg(context.getMeta(),
raimund@3169: I18N_REFERENCEDEVIATION,
raimund@3169: I18N_REFERENCEDEVIATION);
raimund@3169:
raimund@3049:
christian@3192: facets.add(new FixReferenceEventsFacet(idg.next(),
raimund@3043: FIX_REFERENCE_EVENTS_DWT,
raimund@3049: i18n_ref));
christian@3192: facets.add(new FixLongitudinalReferenceFacet(idg.next(),
raimund@3043: FIX_REFERENCE_EVENTS_LS,
raimund@3049: i18n_ref));
christian@3192: facets.add(new FixReferenceEventsFacet(idg.next(),
raimund@3043: FIX_REFERENCE_EVENTS_WQ,
raimund@3049: i18n_ref));
raimund@3043:
christian@3192: facets.add(new FixLongitudinalDeviationFacet(idg.next(),
raimund@3169: FIX_DEVIATION_LS,
raimund@3169: i18n_dev));
raimund@3169:
raimund@3049: String i18n_ana = Resources.getMsg(context.getMeta(),
raimund@3049: I18N_ANALYSISPERIODS,
raimund@3049: I18N_ANALYSISPERIODS);
christian@3192: facets.add(new FixAnalysisPeriodsFacet(idg.next(),
raimund@3043: FIX_ANALYSIS_PERIODS_DWT,
raimund@3049: i18n_ana));
christian@3192: facets.add(new FixAnalysisPeriodsFacet(idg.next(),
raimund@3043: FIX_ANALYSIS_PERIODS_LS,
raimund@3049: i18n_ana));
christian@3192: facets.add(new FixAnalysisPeriodsFacet(idg.next(),
raimund@3043: FIX_ANALYSIS_PERIODS_WQ,
raimund@3049: i18n_ana));
raimund@3043:
christian@3192:
christian@3192: facets.add(new FixWQCurveFacet(idg.next(), "W/Q"));
sascha@3186:
sascha@3186: Boolean preprocessing = access.getPreprocessing();
sascha@3186:
sascha@3186: if (preprocessing != null && preprocessing) {
christian@3192: facets.add(new FixOutlierFacet(idg.next(), FIX_OUTLIER,
sascha@3186: Resources.getMsg(context.getMeta(), I18N_OUTLIER, I18N_OUTLIER)));
sascha@3186: }
sascha@3186:
christian@3192: facets.add(new FixDerivateFacet(
christian@3192: idg.next(),
christian@3192: FIX_DERIVATE,
raimund@3049: Resources.getMsg(context.getMeta(),
raimund@3049: I18N_DERIVATIVE,
raimund@3049: I18N_DERIVATIVE)));
raimund@3028:
christian@3192: facets.add(new FixDeviationFacet(
christian@3192: idg.next(),
christian@3192: FIX_DEVIATION_DWT,
raimund@3135: Resources.getMsg(context.getMeta(),
raimund@3135: I18N_DEVIATION,
raimund@3135: I18N_DEVIATION)));
sascha@2784: return res;
sascha@2784: }
raimund@2651: }
raimund@2651: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :