Mercurial > dive4elements > river
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 : |