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