annotate flys-client/src/main/java/de/intevation/flys/client/server/FixingsKMChartServiceImpl.java @ 2488:88d44cae592e

Added new proxy servlet to bridge the fixing km chart requests to the artefact server. flys-client/trunk@4275 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 19 Apr 2012 11:00:18 +0000
parents
children f905c936ffff
rev   line source
2488
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package de.intevation.flys.client.server;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import de.intevation.artifacts.common.utils.XMLUtils;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 import de.intevation.artifacts.httpclient.http.HttpClient;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import de.intevation.artifacts.httpclient.http.HttpClientImpl;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 import de.intevation.artifacts.httpclient.http.response.StreamResponseHandler;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 import java.io.IOException;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import java.io.InputStream;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 import java.io.OutputStream;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import javax.servlet.http.HttpServlet;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 import javax.servlet.http.HttpServletRequest;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 import javax.servlet.http.HttpServletResponse;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 import org.apache.log4j.Logger;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 import org.w3c.dom.Document;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 import org.w3c.dom.Element;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 import org.w3c.dom.NodeList;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 public class FixingsKMChartServiceImpl
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 extends HttpServlet
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 private static final Logger log =
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 Logger.getLogger(FixingsKMChartServiceImpl.class);
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 public static final String SERVICE_NAME = "fixings-km-chart";
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 public FixingsKMChartServiceImpl() {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 public void doGet(HttpServletRequest req, HttpServletResponse resp) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 log.info("FixingsKMChartServiceImpl.doGet");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 String url = getServletContext().getInitParameter("server-url");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 String locale = req.getParameter("locale");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 String filter = req.getParameter("filter");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 if (filter == null || filter.length() == 0) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 log.warn("Missing 'filter' parameter.");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 return;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 if (locale == null || locale.length() == 0) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 locale = "de";
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 Document filterDoc = XMLUtils.jsonToXML(filter);
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 if (filterDoc == null) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 log.warn("Creating filter document failed.");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 return;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 HttpClient client;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 client = new HttpClientImpl(url, locale);
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 resp.setHeader("Content-Type", guessMIMEType(filterDoc));
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 InputStream in;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 try {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 in = (InputStream)client.callService(
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 url, // XXX: Why? The URL is passed by construction already.
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 SERVICE_NAME,
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 filterDoc,
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 new StreamResponseHandler());
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 catch (ConnectionException ce) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 log.error(ce);
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 return;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 try {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 OutputStream out = resp.getOutputStream();
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84 byte [] buf = new byte[4096];
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 int i = -1;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
86 while ((i = in.read(buf)) >= 0) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
87 out.write(buf, 0, i);
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 out.flush();
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
90 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91 catch (IOException ioe) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92 log.error(ioe);
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
93 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
94 finally {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
95 try { in.close(); }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
96 catch (IOException ioe) { /* ignored */ }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
100 protected static String guessMIMEType(Document document) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102 NodeList formats = document.getElementsByTagName("format");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104 String format = "png";
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 if (formats.getLength() > 0) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107 String type = ((Element)formats.item(0)).getAttribute("type");
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 if (type.length() > 0) {
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109 format = type;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
111 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 return "image/" + format;
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
115 }
88d44cae592e Added new proxy servlet to bridge the fixing km chart requests to the artefact server.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org