comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedOverview.java @ 5838:5aa05a7a34b7

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

http://dive4elements.wald.intevation.org