comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/BedloadOverview.java @ 3751:ae598cf50682

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

http://dive4elements.wald.intevation.org