comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/SQOverview.java @ 5831:bd047b71ab37

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

http://dive4elements.wald.intevation.org