Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/SQOverview.java @ 3274:43e42315ce22
Added service for an overview chart of measuring points in sq relation.
flys-artifacts/trunk@4918 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Tue, 10 Jul 2012 16:37:48 +0000 |
parents | |
children | 3570abdf7daa |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/SQOverview.java Tue Jul 10 16:37:48 2012 +0000 @@ -0,0 +1,206 @@ +package de.intevation.flys.artifacts.model; + +import java.io.Serializable; + +import java.text.SimpleDateFormat; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; + +import org.apache.log4j.Logger; + +import org.hibernate.SQLQuery; +import org.hibernate.Session; + +import org.hibernate.type.StandardBasicTypes; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import de.intevation.flys.utils.KMIndex; + +public class SQOverview +implements Serializable +{ + + /** + * Serial version UId. + */ + private static final long serialVersionUID = -8934372438968398508L; + + public interface Filter { + + boolean accept(KMIndex<List<Date>> entry); + + } // interface Filter + + + public static final Filter ACCEPT = new Filter() { + @Override + public boolean accept(KMIndex<List<Date>> entry) { + return true; + } + }; + + public static class KmFilter implements Filter { + + protected double km; + + public KmFilter (double km) { + this.km = km; + } + @Override + public boolean accept(KMIndex<List<Date>> list) { + for (KMIndex.Entry<List<Date>> e: list){ + if (e.getKm() == km) { + return true; + } + } + return false; + } + }; + + public static class DateFilter implements Filter { + + protected Date date; + + public DateFilter (Date date) { + this.date = date; + } + @Override + public boolean accept(KMIndex<List<Date>> list) { + for (KMIndex.Entry<List<Date>> e: list){ + if (e.getValue().equals(this.date)) { + return true; + } + } + return false; + } + }; + + private static Logger log = Logger.getLogger(FixingsOverview.class); + + public static final double EPSILON = 1e-1; + + public static final String DATE_FORMAT = "dd.MM.yyyy"; + + public static final String SQL_SQ = + "SELECT" + + " s.km," + + " m.datum " + + "FROM messung m " + + " JOIN station s" + + " on m.stationid = s.stationid " + + " JOIN gewaesser g " + + " on s.gewaesserid = g.gewaesserid " + + "WHERE" + + " g.name = :name " + + " order by" + + " s.km, m.datum"; + + protected String riverName; + + protected KMIndex<List<Date>> entries; + + public SQOverview() { + entries = new KMIndex<List<Date>>(); + } + + public SQOverview(String riverName) { + this(); + this.riverName = riverName; + } + + protected void loadData(Session session) { + SQLQuery query = session.createSQLQuery(SQL_SQ) + .addScalar("km", StandardBasicTypes.DOUBLE) + .addScalar("datum", StandardBasicTypes.DATE); + + query.setString("name", riverName); + + List<Object []> list = query.list(); + + if (list.isEmpty()) { + log.warn("No river '" + riverName + "' found."); + } + + Double prevKm = -1d; + List<Date> dates = new ArrayList<Date>(); + for (int i = 0; i < list.size(); i++) { + Object[] row = list.get(i); + Double km = (Double) row[0]; + Date date = (Date) row[1]; + if (km.equals(prevKm)) { + dates.add(date); + } + else { + entries.add(prevKm, dates); + dates = new ArrayList<Date>(); + dates.add(date); + } + prevKm = km; + } + } + + public boolean load(Session session) { + + loadData(session); + + return true; + } + + + public void generateOverview(Document document) { + generateOverview(document, ACCEPT); + } + + public KMIndex<List<Date>> filter(Filter f) { + return entries; + } + + public void generateOverview( + Document document, + Filter filter + ) { + KMIndex<List<Date>> filtered = filter(ACCEPT); + + Element sqElement = document.createElement("sq"); + + Element riverElement = document.createElement("river"); + + riverElement.setAttribute("name", riverName); + + sqElement.appendChild(riverElement); + + SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT); + + Element kmE = document.createElement("km"); + + for (KMIndex.Entry<List<Date>> e: filtered) { + + List<Date> dates = e.getValue(); + + if (!dates.isEmpty()) { + Element dEs = document.createElement("dates"); + + for (Date d: dates) { + Element dE = document.createElement("date"); + + dE.setAttribute("value", df.format(d)); + + dEs.appendChild(dE); + } + + kmE.appendChild(dEs); + } + } + + sqElement.appendChild(kmE); + + document.appendChild(sqElement); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : \ No newline at end of file