Mercurial > dive4elements > http-client
comparison src/main/java/de/intevation/artifacts/httpclient/ConsoleClient.java @ 0:a1db30b33f43
Moved the experimental branch 'work-on-gwt' of the console-client to an own module 'http-client' and removed the console-client.
http-client/trunk@1323 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Thu, 17 Feb 2011 10:31:40 +0000 |
parents | |
children | c9ac6642973c |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a1db30b33f43 |
---|---|
1 /* | |
2 * Copyright (c) 2010 by Intevation GmbH | |
3 * | |
4 * This program is free software under the LGPL (>=v2.1) | |
5 * Read the file LGPL.txt coming with the software for details | |
6 * or visit http://www.gnu.org/licenses/ if it does not exist. | |
7 */ | |
8 | |
9 package de.intevation.artifacts.httpclient; | |
10 | |
11 import java.io.IOException; | |
12 import java.io.File; | |
13 import java.io.FileOutputStream; | |
14 import java.io.OutputStream; | |
15 | |
16 import java.net.MalformedURLException; | |
17 | |
18 import java.util.Arrays; | |
19 import java.util.ArrayList; | |
20 import java.util.HashMap; | |
21 import java.util.List; | |
22 import java.util.Map; | |
23 | |
24 import javax.xml.xpath.XPathConstants; | |
25 | |
26 import org.w3c.dom.Document; | |
27 import org.w3c.dom.Node; | |
28 import org.w3c.dom.NodeList; | |
29 | |
30 import org.apache.log4j.Logger; | |
31 import org.apache.log4j.PropertyConfigurator; | |
32 | |
33 import de.intevation.artifacts.httpclient.http.GNVClient; | |
34 import de.intevation.artifacts.httpclient.http.GNVClientImpl; | |
35 import de.intevation.artifacts.httpclient.http.response.DocumentResponseHandler; | |
36 | |
37 import de.intevation.artifacts.httpclient.exceptions.ConnectionException; | |
38 import de.intevation.artifacts.httpclient.exceptions.NoSuchOptionException; | |
39 import de.intevation.artifacts.httpclient.objects.Artifact; | |
40 import de.intevation.artifacts.httpclient.utils.ArtifactProtocolUtils; | |
41 import de.intevation.artifacts.httpclient.utils.Configuration; | |
42 import de.intevation.artifacts.httpclient.utils.XFormNamespaceContext; | |
43 import de.intevation.artifacts.httpclient.utils.XMLUtils; | |
44 | |
45 /** | |
46 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | |
47 */ | |
48 public class ConsoleClient | |
49 { | |
50 /** | |
51 * The logging is done via Log4j. To configure the logging | |
52 * a file 'log4j.properties' is search in the configuration directory. | |
53 */ | |
54 public static final String LOG4J_PROPERTIES = "log4j.properties"; | |
55 | |
56 | |
57 /** | |
58 * The path of the configuration directory. | |
59 */ | |
60 public static final String CONFIG_PATH = System.getProperty("config.dir", | |
61 "conf"); | |
62 | |
63 public static final String CONFIG = System.getProperty("config.file", | |
64 "use_case1.conf"); | |
65 | |
66 | |
67 public static final String XPATH_DYNAMIC = "/art:result/art:ui/art:dynamic"; | |
68 | |
69 /** | |
70 * The logger used in this class. | |
71 */ | |
72 private static Logger logger; | |
73 | |
74 | |
75 static { | |
76 configureLogging(); | |
77 | |
78 logger = Logger.getLogger(ConsoleClient.class); | |
79 } | |
80 | |
81 | |
82 /** | |
83 * Trys to load the Log4j configuration from ${config.dir}/log4j.properties. | |
84 */ | |
85 public static final void configureLogging() { | |
86 File configDir = new File(CONFIG_PATH); | |
87 File propFile = new File(configDir, LOG4J_PROPERTIES); | |
88 | |
89 if (propFile.isFile() && propFile.canRead()) { | |
90 try { | |
91 PropertyConfigurator.configure(propFile.toURI().toURL()); | |
92 } | |
93 catch (MalformedURLException mue) { | |
94 mue.printStackTrace(System.err); | |
95 } | |
96 } | |
97 } | |
98 | |
99 | |
100 public static final Configuration readConfiguration() { | |
101 File configDir = new File(CONFIG_PATH); | |
102 File configFile = new File(configDir, CONFIG); | |
103 | |
104 logger.debug("Configuration file: " + configFile.getAbsolutePath()); | |
105 | |
106 if (configFile.isFile() && configFile.canRead()) { | |
107 try { | |
108 Configuration conf = new Configuration(configFile); | |
109 conf.initialize(); | |
110 | |
111 return conf; | |
112 } | |
113 catch (IOException ioe) { | |
114 logger.error("Error while reading configuration."); | |
115 } | |
116 } | |
117 | |
118 return null; | |
119 } | |
120 | |
121 | |
122 public static void main( String[] args ) | |
123 { | |
124 logger.info("Starting GNV console client."); | |
125 | |
126 Configuration conf = readConfiguration(); | |
127 | |
128 String serverHost = (String) conf.getServerSettings("host"); | |
129 String serverPort = (String) conf.getServerSettings("port"); | |
130 GNVClient client = new GNVClientImpl(serverHost + ":" + serverPort); | |
131 | |
132 try { | |
133 Document create = ArtifactProtocolUtils.createCreateDocument( | |
134 (String) conf.getArtifactSettings("fis")); | |
135 Artifact artifact = client.create(create); | |
136 | |
137 Map attr = new HashMap(); | |
138 String product = (String) conf.getArtifactSettings("product"); | |
139 String[] products = extractOptions(client, artifact, product); | |
140 attr.put("product", products[0]); | |
141 | |
142 feedAndGo(client, artifact, attr, "timeSeries"); | |
143 | |
144 attr.clear(); | |
145 String area = (String) conf.getArtifactSettings("areaid"); | |
146 String[] areas = extractOptions(client, artifact, area); | |
147 attr.put("areaid", areas[0]); | |
148 feedAndGo(client, artifact, attr, "timeseries_without_geom"); | |
149 | |
150 attr.clear(); | |
151 String feature = (String) conf.getArtifactSettings("featureid"); | |
152 String[] features = extractOptions(client, artifact, feature); | |
153 attr.put("featureid", features[0]); | |
154 feedAndGo(client, artifact, attr, "timeseries_vector_scalar"); | |
155 | |
156 attr.clear(); | |
157 String vector = (String) conf.getArtifactSettings("vectorscalar"); | |
158 String[] vectors = extractOptions(client, artifact, vector); | |
159 attr.put("vectorscalar", vectors[0]); | |
160 feedAndGo(client, artifact, attr, "timeseries_parameter"); | |
161 | |
162 attr.clear(); | |
163 String parameter = (String) conf.getArtifactSettings("parameterid"); | |
164 String[] parameters = extractOptions(client, artifact, parameter); | |
165 attr.put("parameterid", parameters); | |
166 feedAndGo(client, artifact, attr, "timeseries_depth_height"); | |
167 | |
168 attr.clear(); | |
169 String measure = (String) conf.getArtifactSettings("measurementid"); | |
170 String[] measures = extractMeasurements(client, artifact, measure); | |
171 attr.put("measurementid", measures); | |
172 feedAndGo(client, artifact, attr, "timeseries_interval"); | |
173 | |
174 attr.clear(); | |
175 String min = (String) conf.getArtifactSettings("minvalue"); | |
176 String max = (String) conf.getArtifactSettings("maxvalue"); | |
177 attr.put("minvalue", min); | |
178 attr.put("maxvalue", max); | |
179 feedAndGo(client, artifact, attr, "timeseries_calculate_results"); | |
180 | |
181 try { | |
182 Map opts = new HashMap(); | |
183 opts.put("mime-type", conf.getOutputSettings("mime-type")); | |
184 opts.put("width", conf.getOutputSettings("width")); | |
185 opts.put("height", conf.getOutputSettings("height")); | |
186 opts.put("points", conf.getOutputSettings("points")); | |
187 | |
188 Document chart = | |
189 ArtifactProtocolUtils.createChartDocument(artifact, opts); | |
190 | |
191 String dir = (String) conf.getOutputSettings("directory"); | |
192 | |
193 File outDir = new File(dir); | |
194 File output = new File(outDir, "output.png"); | |
195 OutputStream os = new FileOutputStream(output); | |
196 | |
197 client.out(artifact, chart, "chart", os); | |
198 } | |
199 catch (IOException ioe) { | |
200 logger.error( | |
201 "IO error while writing the output: " + ioe.getMessage()); | |
202 } | |
203 | |
204 logger.debug("Finished GNV console client."); | |
205 } | |
206 catch (ConnectionException ce) { | |
207 logger.error(ce.getMessage()); | |
208 } | |
209 catch (NoSuchOptionException nsoe) { | |
210 logger.error( | |
211 "No such option found: " + nsoe.getMessage()); | |
212 } | |
213 } | |
214 | |
215 | |
216 public static void feedAndGo( | |
217 GNVClient client, | |
218 Artifact artifact, | |
219 Map attr, | |
220 String target) | |
221 throws ConnectionException | |
222 { | |
223 Document feed = ArtifactProtocolUtils.createFeedDocument(artifact, attr); | |
224 client.feed(artifact, feed, new DocumentResponseHandler()); | |
225 | |
226 Document advance = ArtifactProtocolUtils.createAdvanceDocument( | |
227 artifact, | |
228 target); | |
229 | |
230 client.advance(artifact, advance, new DocumentResponseHandler()); | |
231 } | |
232 | |
233 | |
234 /** | |
235 * XXX I think, this method should be implemented somewhere else to be able | |
236 * to re-use this implementation. But this method needs more work to be more | |
237 * abstract, so it needs to be reimplemented later, I think. | |
238 */ | |
239 public static String[] extractOptions( | |
240 GNVClient client, | |
241 Artifact artifact, | |
242 String text) | |
243 throws NoSuchOptionException, ConnectionException | |
244 { | |
245 Document describe = ArtifactProtocolUtils.createDescribeDocument( | |
246 artifact, true); | |
247 | |
248 Document description = (Document) client.describe( | |
249 artifact, describe, new DocumentResponseHandler()); | |
250 | |
251 List pieces = Arrays.asList(text.split(",")); | |
252 List options = new ArrayList(pieces.size()); | |
253 | |
254 Node dynamic = XMLUtils.getNodeXPath(description, XPATH_DYNAMIC); | |
255 | |
256 // TODO We should handle these cases better!! | |
257 NodeList items = (NodeList) XMLUtils.getXPath( | |
258 dynamic, "xform:select1/xform:choices/xform:item", | |
259 XPathConstants.NODESET, XFormNamespaceContext.INSTANCE); | |
260 | |
261 if (items == null || items.getLength() == 0) { | |
262 items = (NodeList) XMLUtils.getXPath( | |
263 dynamic, "xform:select/xform:choices/xform:item", | |
264 XPathConstants.NODESET, XFormNamespaceContext.INSTANCE); | |
265 } | |
266 | |
267 if (items == null || items.getLength() == 0) { | |
268 items = (NodeList) XMLUtils.getXPath( | |
269 dynamic, "xform:group/xform:select/xform:item", | |
270 XPathConstants.NODESET, XFormNamespaceContext.INSTANCE); | |
271 } | |
272 | |
273 | |
274 for (int i = 0; i < items.getLength(); i++) { | |
275 Node item = items.item(i); | |
276 Node label = (Node) XMLUtils.getXPath( | |
277 item, "xform:label", XPathConstants.NODE, | |
278 XFormNamespaceContext.INSTANCE); | |
279 | |
280 Node value = (Node) XMLUtils.getXPath( | |
281 item, "xform:value", XPathConstants.NODE, | |
282 XFormNamespaceContext.INSTANCE); | |
283 | |
284 if (pieces.indexOf(label.getTextContent()) >= 0) | |
285 options.add(value.getTextContent()); | |
286 } | |
287 | |
288 if (options.isEmpty()) | |
289 throw new NoSuchOptionException(text); | |
290 | |
291 return (String[]) options.toArray(new String[options.size()]); | |
292 } | |
293 | |
294 | |
295 /** | |
296 * XXX This method extracts the measurement ids depending on the user | |
297 * configuration from describe document. Currently, this is a special case | |
298 * that should be handled the same way as all the other options in the | |
299 * describe document. | |
300 */ | |
301 public static String[] extractMeasurements( | |
302 GNVClient client, | |
303 Artifact artifact, | |
304 String text) | |
305 throws NoSuchOptionException, ConnectionException | |
306 { | |
307 Document describe = ArtifactProtocolUtils.createDescribeDocument( | |
308 artifact, true); | |
309 | |
310 Document description = (Document) client.describe( | |
311 artifact, describe, new DocumentResponseHandler()); | |
312 | |
313 List pieces = Arrays.asList(text.split(",")); | |
314 List options = new ArrayList(pieces.size()); | |
315 | |
316 Node dynamic = XMLUtils.getNodeXPath(description, XPATH_DYNAMIC); | |
317 | |
318 NodeList params = (NodeList) XMLUtils.getXPath( | |
319 dynamic, "xform:group/xform:select", | |
320 XPathConstants.NODESET, XFormNamespaceContext.INSTANCE); | |
321 | |
322 for (int i = 0; i < params.getLength(); i++) { | |
323 Node param = params.item(i); | |
324 | |
325 NodeList items = (NodeList) XMLUtils.getXPath( | |
326 param, "xform:item[@disabled='false']", XPathConstants.NODESET, | |
327 XFormNamespaceContext.INSTANCE); | |
328 | |
329 for (int j = 0; j < items.getLength(); j++) { | |
330 Node item = items.item(j); | |
331 | |
332 Node label = (Node) XMLUtils.getXPath( | |
333 item, "xform:label", XPathConstants.NODE, | |
334 XFormNamespaceContext.INSTANCE); | |
335 | |
336 if (pieces.indexOf(label.getTextContent()) < 0) { | |
337 continue; | |
338 } | |
339 | |
340 Node value = (Node) XMLUtils.getXPath( | |
341 item, "xform:value", XPathConstants.NODE, | |
342 XFormNamespaceContext.INSTANCE); | |
343 | |
344 options.add(value.getTextContent()); | |
345 } | |
346 } | |
347 | |
348 if (options.isEmpty()) | |
349 throw new NoSuchOptionException(text); | |
350 | |
351 return (String[]) options.toArray(new String[options.size()]); | |
352 } | |
353 } | |
354 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: |