raimund@3751: package de.intevation.flys.artifacts.model.minfo; raimund@3751: raimund@3751: import java.io.Serializable; raimund@3751: import java.text.SimpleDateFormat; raimund@3751: import java.util.ArrayList; raimund@3751: import java.util.Date; raimund@3751: import java.util.List; raimund@3751: raimund@3751: import org.apache.log4j.Logger; raimund@3751: import org.hibernate.SQLQuery; raimund@3751: import org.hibernate.Session; raimund@3751: import org.hibernate.type.StandardBasicTypes; raimund@3751: import org.w3c.dom.Document; raimund@3751: import org.w3c.dom.Element; raimund@3751: raimund@3751: import de.intevation.flys.utils.KMIndex; raimund@3751: raimund@3751: public class BedloadOverview implements Serializable { raimund@3751: sascha@3778: private static Logger log = Logger.getLogger(BedloadOverview.class); sascha@3778: raimund@3751: /** raimund@3751: * Serial version UId. raimund@3751: */ raimund@3751: private static final long serialVersionUID = -7607668985959407096L; raimund@3751: raimund@3751: public interface Filter { raimund@3751: boolean accept(KMIndex> entry); raimund@3751: raimund@3751: } // interface Filter raimund@3751: raimund@3751: raimund@3751: public static final Filter ACCEPT = new Filter() { raimund@3751: public boolean accept(KMIndex> entry) { raimund@3751: return true; raimund@3751: } raimund@3751: }; raimund@3751: raimund@3751: public static class KmFilter implements Filter { raimund@3751: raimund@3751: protected double km; raimund@3751: raimund@3751: public KmFilter (double km) { raimund@3751: this.km = km; raimund@3751: } raimund@3751: public boolean accept(KMIndex> list) { raimund@3751: for (KMIndex.Entry> e: list){ raimund@3751: if (e.getKm() == km) { raimund@3751: return true; raimund@3751: } raimund@3751: } raimund@3751: return false; raimund@3751: } raimund@3751: }; raimund@3751: raimund@3751: public static class DateFilter implements Filter { raimund@3751: raimund@3751: protected Date date; raimund@3751: raimund@3751: public DateFilter (Date date) { raimund@3751: this.date = date; raimund@3751: } raimund@3751: raimund@3751: public boolean accept(KMIndex> list) { raimund@3751: for (KMIndex.Entry> e: list){ raimund@3751: if (e.getValue().equals(this.date)) { raimund@3751: return true; raimund@3751: } raimund@3751: } raimund@3751: return false; raimund@3751: } raimund@3751: }; raimund@3751: raimund@3751: public static final double EPSILON = 1e-4; raimund@3751: raimund@3751: public static final String DATE_FORMAT = "dd.MM.yyyy"; raimund@3751: raimund@3751: public static final String SQL_SQ = raimund@3751: "SELECT" + raimund@3751: " m.km AS km," + raimund@3751: " m.datum AS datum " + raimund@3751: "FROM messung m " + raimund@3751: " JOIN station s" + raimund@3751: " ON m.stationid = s.stationid " + raimund@3751: " JOIN gewaesser g " + raimund@3751: " ON s.gewaesserid = g.gewaesserid " + raimund@3751: "WHERE" + raimund@3914: " g.name = :name AND " + raimund@3914: " m.km IS NOT NULL " + raimund@3751: "ORDER by" + raimund@3751: " m.km, m.datum"; raimund@3751: raimund@3751: protected String riverName; raimund@3751: raimund@3751: protected KMIndex> entries; raimund@3751: raimund@3751: public BedloadOverview() { raimund@3751: entries = new KMIndex>(); raimund@3751: } raimund@3751: raimund@3751: public BedloadOverview(String riverName) { raimund@3751: this(); raimund@3751: this.riverName = riverName; raimund@3751: } raimund@3751: raimund@3751: private static final boolean epsilonEquals(double a, double b) { raimund@3751: return Math.abs(a - b) < EPSILON; raimund@3751: } raimund@3751: raimund@3751: protected void loadData(Session session) { raimund@3751: SQLQuery query = session.createSQLQuery(SQL_SQ) raimund@3751: .addScalar("km", StandardBasicTypes.DOUBLE) raimund@3751: .addScalar("datum", StandardBasicTypes.DATE); raimund@3751: raimund@3751: query.setString("name", riverName); raimund@3751: raimund@3751: List list = query.list(); raimund@3751: raimund@3751: if (list.isEmpty()) { raimund@3751: log.warn("No river '" + riverName + "' found."); raimund@3751: } raimund@3751: raimund@3751: Double prevKm = -Double.MAX_VALUE; raimund@3751: List dates = new ArrayList(); raimund@3751: raimund@3751: for (Object [] row: list) { raimund@3751: Double km = (Double)row[0]; raimund@3751: if (!epsilonEquals(km, prevKm) && !dates.isEmpty()) { raimund@3751: entries.add(prevKm, dates); raimund@3751: dates = new ArrayList(); raimund@3751: } raimund@3751: dates.add((Date)row[1]); raimund@3751: prevKm = km; raimund@3751: } raimund@3751: raimund@3751: if (!dates.isEmpty()) { raimund@3751: entries.add(prevKm, dates); raimund@3751: } raimund@3751: } raimund@3751: raimund@3751: public boolean load(Session session) { raimund@3751: raimund@3751: loadData(session); raimund@3751: raimund@3751: return true; raimund@3751: } raimund@3751: raimund@3751: raimund@3751: public void generateOverview(Document document) { raimund@3751: generateOverview(document, ACCEPT); raimund@3751: } raimund@3751: raimund@3751: public KMIndex> filter(Filter f) { raimund@3751: // TODO: Apply filter raimund@3751: return entries; raimund@3751: } raimund@3751: raimund@3751: public void generateOverview( raimund@3751: Document document, raimund@3751: Filter filter raimund@3751: ) { raimund@3751: KMIndex> filtered = filter(ACCEPT); raimund@3751: raimund@3751: Element sqElement = document.createElement("bedload"); raimund@3751: raimund@3751: Element riverElement = document.createElement("river"); raimund@3751: raimund@3751: riverElement.setAttribute("name", riverName); raimund@3751: raimund@3751: sqElement.appendChild(riverElement); raimund@3751: raimund@3751: SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); raimund@3751: raimund@3751: Element kmE = document.createElement("km"); raimund@3751: raimund@3751: for (KMIndex.Entry> e: filtered) { raimund@3751: raimund@3751: List dates = e.getValue(); raimund@3751: raimund@3751: if (!dates.isEmpty()) { raimund@3751: Element dEs = document.createElement("dates"); raimund@3751: raimund@3751: for (Date d: dates) { raimund@3751: Element dE = document.createElement("date"); raimund@3751: raimund@3751: dE.setAttribute("value", df.format(d)); raimund@3751: raimund@3751: dEs.appendChild(dE); raimund@3751: } raimund@3751: raimund@3751: kmE.appendChild(dEs); raimund@3751: } raimund@3751: } raimund@3751: raimund@3751: sqElement.appendChild(kmE); raimund@3751: raimund@3751: document.appendChild(sqElement); raimund@3751: } raimund@3751: }