comparison 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
comparison
equal deleted inserted replaced
3273:739aa90eb79e 3274:43e42315ce22
1 package de.intevation.flys.artifacts.model;
2
3 import java.io.Serializable;
4
5 import java.text.SimpleDateFormat;
6
7 import java.util.ArrayList;
8 import java.util.Collections;
9 import java.util.Comparator;
10 import java.util.Date;
11 import java.util.List;
12
13 import org.apache.log4j.Logger;
14
15 import org.hibernate.SQLQuery;
16 import org.hibernate.Session;
17
18 import org.hibernate.type.StandardBasicTypes;
19
20 import org.w3c.dom.Document;
21 import org.w3c.dom.Element;
22
23 import de.intevation.flys.utils.KMIndex;
24
25 public class SQOverview
26 implements Serializable
27 {
28
29 /**
30 * Serial version UId.
31 */
32 private static final long serialVersionUID = -8934372438968398508L;
33
34 public interface Filter {
35
36 boolean accept(KMIndex<List<Date>> entry);
37
38 } // interface Filter
39
40
41 public static final Filter ACCEPT = new Filter() {
42 @Override
43 public boolean accept(KMIndex<List<Date>> entry) {
44 return true;
45 }
46 };
47
48 public static class KmFilter implements Filter {
49
50 protected double km;
51
52 public KmFilter (double km) {
53 this.km = km;
54 }
55 @Override
56 public boolean accept(KMIndex<List<Date>> list) {
57 for (KMIndex.Entry<List<Date>> e: list){
58 if (e.getKm() == km) {
59 return true;
60 }
61 }
62 return false;
63 }
64 };
65
66 public static class DateFilter implements Filter {
67
68 protected Date date;
69
70 public DateFilter (Date date) {
71 this.date = date;
72 }
73 @Override
74 public boolean accept(KMIndex<List<Date>> list) {
75 for (KMIndex.Entry<List<Date>> e: list){
76 if (e.getValue().equals(this.date)) {
77 return true;
78 }
79 }
80 return false;
81 }
82 };
83
84 private static Logger log = Logger.getLogger(FixingsOverview.class);
85
86 public static final double EPSILON = 1e-1;
87
88 public static final String DATE_FORMAT = "dd.MM.yyyy";
89
90 public static final String SQL_SQ =
91 "SELECT" +
92 " s.km," +
93 " m.datum " +
94 "FROM messung m " +
95 " JOIN station s" +
96 " on m.stationid = s.stationid " +
97 " JOIN gewaesser g " +
98 " on s.gewaesserid = g.gewaesserid " +
99 "WHERE" +
100 " g.name = :name " +
101 " order by" +
102 " s.km, m.datum";
103
104 protected String riverName;
105
106 protected KMIndex<List<Date>> entries;
107
108 public SQOverview() {
109 entries = new KMIndex<List<Date>>();
110 }
111
112 public SQOverview(String riverName) {
113 this();
114 this.riverName = riverName;
115 }
116
117 protected void loadData(Session session) {
118 SQLQuery query = session.createSQLQuery(SQL_SQ)
119 .addScalar("km", StandardBasicTypes.DOUBLE)
120 .addScalar("datum", StandardBasicTypes.DATE);
121
122 query.setString("name", riverName);
123
124 List<Object []> list = query.list();
125
126 if (list.isEmpty()) {
127 log.warn("No river '" + riverName + "' found.");
128 }
129
130 Double prevKm = -1d;
131 List<Date> dates = new ArrayList<Date>();
132 for (int i = 0; i < list.size(); i++) {
133 Object[] row = list.get(i);
134 Double km = (Double) row[0];
135 Date date = (Date) row[1];
136 if (km.equals(prevKm)) {
137 dates.add(date);
138 }
139 else {
140 entries.add(prevKm, dates);
141 dates = new ArrayList<Date>();
142 dates.add(date);
143 }
144 prevKm = km;
145 }
146 }
147
148 public boolean load(Session session) {
149
150 loadData(session);
151
152 return true;
153 }
154
155
156 public void generateOverview(Document document) {
157 generateOverview(document, ACCEPT);
158 }
159
160 public KMIndex<List<Date>> filter(Filter f) {
161 return entries;
162 }
163
164 public void generateOverview(
165 Document document,
166 Filter filter
167 ) {
168 KMIndex<List<Date>> filtered = filter(ACCEPT);
169
170 Element sqElement = document.createElement("sq");
171
172 Element riverElement = document.createElement("river");
173
174 riverElement.setAttribute("name", riverName);
175
176 sqElement.appendChild(riverElement);
177
178 SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT);
179
180 Element kmE = document.createElement("km");
181
182 for (KMIndex.Entry<List<Date>> e: filtered) {
183
184 List<Date> dates = e.getValue();
185
186 if (!dates.isEmpty()) {
187 Element dEs = document.createElement("dates");
188
189 for (Date d: dates) {
190 Element dE = document.createElement("date");
191
192 dE.setAttribute("value", df.format(d));
193
194 dEs.appendChild(dE);
195 }
196
197 kmE.appendChild(dEs);
198 }
199 }
200
201 sqElement.appendChild(kmE);
202
203 document.appendChild(sqElement);
204 }
205 }
206 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org