sascha@3419: package de.intevation.flys.artifacts.model.fixings; sascha@3419: sascha@3419: import de.intevation.flys.artifacts.access.FixAccess; sascha@3419: sascha@3419: import de.intevation.flys.artifacts.model.Calculation; sascha@3434: import de.intevation.flys.artifacts.model.FixingsColumn; sascha@3434: import de.intevation.flys.artifacts.model.FixingsColumnFactory; sascha@3434: sascha@3434: import de.intevation.flys.artifacts.model.FixingsOverview.Fixing.Filter; sascha@3434: sascha@3434: import de.intevation.flys.artifacts.model.FixingsOverview.Fixing; sascha@3434: import de.intevation.flys.artifacts.model.FixingsOverview.IdsFilter; sascha@3434: sascha@3434: import de.intevation.flys.artifacts.model.FixingsOverview; sascha@3434: sascha@3434: import java.util.ArrayList; sascha@3434: import java.util.Date; sascha@3434: import java.util.HashMap; sascha@3434: import java.util.List; sascha@3434: import java.util.Map; sascha@3419: sascha@3419: import org.apache.log4j.Logger; sascha@3419: sascha@3419: public class FixCalculation sascha@3419: extends Calculation sascha@3419: { sascha@3419: private static Logger log = Logger.getLogger(FixCalculation.class); sascha@3419: sascha@3434: /** Helper class to bundle the meta information of a column sascha@3434: * and the real data. sascha@3434: */ sascha@3434: protected static class Column { sascha@3434: sascha@3434: protected Fixing.Column meta; sascha@3434: protected FixingsColumn data; sascha@3434: sascha@3434: public Column() { sascha@3434: } sascha@3434: sascha@3434: public Column(Fixing.Column meta, FixingsColumn data) { sascha@3434: this.meta = meta; sascha@3434: this.data = data; sascha@3434: } sascha@3434: sascha@3434: public Date getDate() { sascha@3434: return meta.getStartTime(); sascha@3434: } sascha@3434: sascha@3434: public String getDescription() { sascha@3434: return meta.getDescription(); sascha@3434: } sascha@3434: sascha@3434: public boolean getQW( sascha@3434: double km, sascha@3434: double [] qs, sascha@3434: double [] ws, sascha@3434: int index sascha@3434: ) { sascha@3434: qs[index] = data.getQ(km); sascha@3434: return data.getW(km, ws, index); sascha@3434: } sascha@3434: sascha@3434: public boolean getQW(double km, double [] wq) { sascha@3434: data.getW(km, wq, 0); sascha@3434: if (Double.isNaN(wq[0])) return false; sascha@3434: wq[1] = data.getQ(km); sascha@3434: return !Double.isNaN(wq[1]); sascha@3434: } sascha@3434: } // class Column sascha@3434: sascha@3434: /** sascha@3434: * Helper class to find the data belonging to meta info more quickly. sascha@3434: */ sascha@3434: protected static class ColumnCache { sascha@3434: sascha@3434: protected Map columns; sascha@3434: sascha@3434: public ColumnCache() { sascha@3434: columns = new HashMap(); sascha@3434: } sascha@3434: sascha@3434: public Column getColumn(Fixing.Column meta) { sascha@3434: Integer key = meta.getId(); sascha@3434: Column column = columns.get(key); sascha@3434: if (column == null) { sascha@3434: FixingsColumn data = FixingsColumnFactory sascha@3434: .getInstance() sascha@3434: .getColumnData(meta); sascha@3434: if (data != null) { sascha@3434: column = new Column(meta, data); sascha@3434: columns.put(key, column); sascha@3434: } sascha@3434: } sascha@3434: return column; sascha@3434: } sascha@3434: } // class ColumnCache sascha@3434: sascha@3434: sascha@3419: protected String river; sascha@3419: protected double from; sascha@3419: protected double to; sascha@3419: protected double step; sascha@3419: protected boolean preprocessing; sascha@3419: protected String function; sascha@3419: protected int [] events; sascha@3419: protected int qSectorStart; sascha@3419: protected int qSectorEnd; sascha@3419: sascha@3419: public FixCalculation() { sascha@3419: } sascha@3419: sascha@3419: public FixCalculation(FixAccess access) { sascha@3419: String river = access.getRiver(); sascha@3419: Double from = access.getFrom(); sascha@3419: Double to = access.getTo(); sascha@3419: Double step = access.getStep(); sascha@3419: String function = access.getFunction(); sascha@3419: int [] events = access.getEvents(); sascha@3419: Integer qSectorStart = access.getQSectorStart(); sascha@3419: Integer qSectorEnd = access.getQSectorEnd(); sascha@3419: Boolean preprocessing = access.getPreprocessing(); sascha@3419: sascha@3419: if (river == null) { sascha@3419: addProblem("fix.missing.river"); sascha@3419: } sascha@3419: sascha@3419: if (from == null) { sascha@3419: addProblem("fix.missing.from"); sascha@3419: } sascha@3419: sascha@3419: if (to == null) { sascha@3419: addProblem("fix.missing.to"); sascha@3419: } sascha@3419: sascha@3419: if (step == null) { sascha@3419: addProblem("fix.missing.step"); sascha@3419: } sascha@3419: sascha@3419: if (function == null) { sascha@3419: addProblem("fix.missing.function"); sascha@3419: } sascha@3419: sascha@3419: if (events == null || events.length < 1) { sascha@3419: addProblem("fix.missing.events"); sascha@3419: } sascha@3419: sascha@3419: if (qSectorStart == null) { sascha@3419: addProblem("fix.missing.qstart.sector"); sascha@3419: } sascha@3419: sascha@3419: if (qSectorEnd == null) { sascha@3419: addProblem("fix.missing.qend.sector"); sascha@3419: } sascha@3419: sascha@3419: if (preprocessing == null) { sascha@3419: addProblem("fix.missing.preprocessing"); sascha@3419: } sascha@3419: sascha@3419: if (!hasProblems()) { sascha@3419: this.river = river; sascha@3419: this.from = from; sascha@3419: this.to = to; sascha@3419: this.step = step; sascha@3419: this.function = function; sascha@3419: this.events = events; sascha@3419: this.qSectorStart = qSectorStart; sascha@3419: this.qSectorEnd = qSectorEnd; sascha@3419: this.preprocessing = preprocessing; sascha@3419: } sascha@3434: } sascha@3419: sascha@3434: protected static String toString( sascha@3434: String [] parameterNames, sascha@3434: double [] values sascha@3434: ) { sascha@3434: StringBuilder sb = new StringBuilder(); sascha@3434: for (int i = 0; i < parameterNames.length; ++i) { sascha@3434: if (i > 0) sb.append(", "); sascha@3434: sb.append(parameterNames[i]).append(": ").append(values[i]); sascha@3434: } sascha@3434: return sb.toString(); sascha@3434: } sascha@3434: sascha@3434: protected Filter createFilter() { sascha@3434: return new IdsFilter(events); sascha@3434: } sascha@3434: sascha@3434: protected List getEventColumns(FixingsOverview overview) { sascha@3434: sascha@3434: FixingsColumnFactory fcf = FixingsColumnFactory.getInstance(); sascha@3434: sascha@3434: Filter filter = createFilter(); sascha@3434: sascha@3434: List metas = overview.filter(null, filter); sascha@3434: sascha@3434: List columns = new ArrayList(metas.size()); sascha@3434: sascha@3434: for (Fixing.Column meta: metas) { sascha@3434: sascha@3434: FixingsColumn data = fcf.getColumnData(meta); sascha@3434: if (data == null) { sascha@3434: addProblem("fix.cannot.load.data"); sascha@3434: } sascha@3434: else { sascha@3434: columns.add(new Column(meta, data)); sascha@3434: } sascha@3434: } sascha@3434: sascha@3434: return columns; sascha@3419: } sascha@3419: } sascha@3419: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :