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@3218: import de.intevation.flys.utils.IdGenerator;
sascha@3218:
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: {
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:
sascha@3217: public static final String [] SECTOR_LABELS = {
sascha@3217: "[0 - (MNQ+MQ)/2)",
sascha@3217: "[(MNQ+MQ)/2 - (MQ+MHQ)/2)",
sascha@3217: "[(MQ+MHQ)/2 - HQ5)",
sascha@3217: "[HQ5 - \u221e)"
sascha@3217: };
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@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@3217: facets.add(
sascha@3217: new DataFacet(
sascha@3217: FIX_PARAMETERS, "parameters", ComputeType.ADVANCE, hash, id));
sascha@2784:
sascha@3203: int maxId = -100;
sascha@3186:
sascha@3204: int sectorMask = fr.getUsedSectorsInAnalysisPeriods();
sascha@3204:
sascha@3217: int qsS = access.getQSectorStart();
sascha@3217: int qsE = access.getQSectorEnd();
sascha@3217:
sascha@3217: // TODO: i18n
sascha@3217: DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
sascha@3217:
sascha@3217: DateRange [] periods = access.getAnalysisPeriods();
sascha@3217:
sascha@3217: for (int i = 0; i < periods.length; i++) {
sascha@3217: DateRange period = periods[i];
raimund@3135: String startDate = df.format(period.getFrom());
raimund@3135: String endDate = df.format(period.getTo());
raimund@3135:
sascha@3217: for (int j = qsS; j <= qsE; j++) {
raimund@3048:
sascha@3217: // Only emit facets for sectors that really have data.
sascha@3204: if ((sectorMask & (1 << j)) == 0) {
sascha@3204: continue;
sascha@3204: }
sascha@3204:
sascha@3217: String sector = SECTOR_LABELS[j];
raimund@3048: String description = sector + ": " +
raimund@3048: startDate + " - " +
raimund@3048: endDate;
raimund@3131:
sascha@3217: int sectorNdx = j - qsS;
raimund@3131: int facetNdx = i << 2;
raimund@3131: facetNdx = facetNdx | j;
raimund@3131:
sascha@3217: if (facetNdx > maxId) {
sascha@3217: maxId = facetNdx;
sascha@3217: }
christian@3192:
raimund@3028: facets.add(
sascha@3217: new FixAvSectorFacet(
sascha@3217: facetNdx,
sascha@3217: FIX_SECTOR_AVERAGE_DWT + "_" + sectorNdx,
sascha@3217: description));
raimund@3043: facets.add(
sascha@3217: new FixLongitudinalAnalysisFacet(
sascha@3217: facetNdx,
sascha@3217: FIX_SECTOR_AVERAGE_LS + "_" + sectorNdx,
sascha@3217: description));
sascha@3204: // TODO: i18n
raimund@3169: String dev = "Abweichung: " + description;
raimund@3169: facets.add(
sascha@3217: new FixLongitudinalAnalysisFacet(
sascha@3217: facetNdx,
sascha@3217: FIX_SECTOR_AVERAGE_LS_DEVIATION + "_" + sectorNdx,
sascha@3217: dev));
raimund@3043: facets.add(
sascha@3217: new FixAvSectorFacet(
sascha@3217: facetNdx,
sascha@3217: FIX_SECTOR_AVERAGE_WQ + "_" + sectorNdx,
sascha@3217: 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:
sascha@3217: 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) {
sascha@3217: facets.add(new FixOutlierFacet(
sascha@3217: idg.next(),
sascha@3217: FIX_OUTLIER,
sascha@3217: Resources.getMsg(
sascha@3217: context.getMeta(), I18N_OUTLIER, I18N_OUTLIER)));
sascha@3186: }
sascha@3186:
christian@3192: facets.add(new FixDerivateFacet(
sascha@3217: idg.next(),
sascha@3217: FIX_DERIVATE,
sascha@3217: Resources.getMsg(
sascha@3217: context.getMeta(),
raimund@3049: I18N_DERIVATIVE,
raimund@3049: I18N_DERIVATIVE)));
raimund@3028:
christian@3192: facets.add(new FixDeviationFacet(
sascha@3217: idg.next(),
sascha@3217: 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 :