1 package org.molwind.servlet;
2
3 /*
4 * This file is part of Molwind.
5 *
6 * Molwind is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * Molwind is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with Molwind. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20
21 import org.jdom.*;
22 import java.io.File;
23 import java.io.IOException;
24 import java.util.Enumeration;
25 import java.util.HashMap;
26
27 import javax.servlet.ServletConfig;
28 import javax.servlet.ServletException;
29 import javax.servlet.http.HttpServlet;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.servlet.http.HttpServletResponse;
32 import javax.servlet.ServletOutputStream;
33
34
35 import org.molwind.model.LayeredPosition;
36 import org.molwind.util.MolwindLogger;
37 import org.molwind.util.MolwindServerConfiguration;
38 import org.molwind.view.Tiles;
39
40 /**
41 * MolwindServlet serves tiles to a WorldWind client.
42 * <p>
43 *
44 * @author <a href="mailto:oliver.karch@molwind.org">Oliver Karch</a>
45 * @author <a href="mailto:sebastian.bremm@molwind.org">Sebastian Bremm</a>
46 * @version 0.2
47 */
48 public class MolwindServlet extends HttpServlet {
49
50 /**
51 * Name of the parameter, which includes the name of the world.
52 */
53 public static final String PARAM_WORLD = "world";
54
55 /**
56 * Default name of a Molwind world.
57 */
58 public static final String DEFAULT_WORLD = "default";
59
60 /**
61 * Name of the parameter, which includes the name of the called command
62 */
63 public static final String PARAM_COMMAND = "command";
64
65 /**
66 * Default name of a command
67 */
68 public static final String DEFAULT_COMMAND ="defCommand";
69
70 /**
71 * Generated serial id for this class.
72 */
73 private static final long serialVersionUID = 3602039967061325713L;
74
75
76 /**
77 * A HashMap of available commands
78 *
79 */
80 private HashMap<String,Command> commands;
81
82
83
84 /**
85 * Called by the servlet container to indicate that the servlet is being
86 * placed into service.
87 *
88 * @param config
89 * the {@link javax.servlet.ServletConfig} object, contains
90 * configuration information for this servlet
91 * @throws javax.servlet.ServletException
92 * if an exception occurs that interrupts the servlet's normal
93 * operation
94 */
95 public void init(final ServletConfig config)
96 throws ServletException {
97 super.init(config);
98
99 initCommands( config );
100
101 String servletContextPath = config.getServletContext().getRealPath("/");
102
103
104 MolwindLogger.getInstance(getServletContext());
105
106 String configPath = config.getInitParameter("config");
107
108
109
110 MolwindServerConfiguration molwindConfig = null;
111
112 if (configPath != null) {
113 File theFile = new File(configPath);
114 MolwindLogger.info("Trying to read config from " + theFile);
115
116 if (theFile.isAbsolute() && theFile.exists()) {
117 molwindConfig = MolwindServerConfiguration.getInstance(
118 theFile.getPath());
119 } else {
120 molwindConfig = MolwindServerConfiguration.getInstance(
121 (new File(servletContextPath, configPath)).getPath());
122 }
123 } else {
124 molwindConfig = MolwindServerConfiguration.getInstance();
125 }
126
127 molwindConfig.addWorldPath(servletContextPath);
128 molwindConfig.setServletContext(getServletContext());
129
130 String uploadPath = config.getInitParameter("upload");
131 if (uploadPath != null) {
132 molwindConfig.addWorldPath(uploadPath);
133 }
134 }
135
136
137
138
139
140
141
142
143 private void initCommands( final ServletConfig config ) {
144
145 MolwindLogger.debug("Initialising Command-list:...");
146 commands = new HashMap<String,Command>();
147 Enumeration e = config.getInitParameterNames();
148 while( e.hasMoreElements() ) {
149 String pName = (String)e.nextElement();
150
151 if( pName.startsWith( PARAM_COMMAND ) ) {
152
153 String cmdClass = config.getInitParameter( pName );
154
155 String[] pNames;
156 pNames = pName.split( ":" );
157
158 try {
159 Class clazz = Class.forName(cmdClass);
160 Command cmd = (Command) clazz.newInstance();
161
162 if( pNames.length > 0 ){
163 addCommand( pNames[1], cmd );}
164
165
166 } catch (ClassNotFoundException cnfe) {
167 MolwindLogger.warn("Cannot find command "
168 + cmdClass, cnfe);
169 } catch (InstantiationException iex) {
170 MolwindLogger.warn("Cannot instantiate "
171 + cmdClass, iex);
172 } catch (IllegalAccessException iax) {
173 MolwindLogger.warn("Cannot instantiate "
174 + cmdClass, iax);
175 }
176 }
177 }
178 }
179
180 /**
181 * Called by the server (via the service method) to allow a servlet to
182 * handle a GET request.
183 *
184 * @param request
185 * an {@link javax.servlet.http.HttpServletRequest} object, contains
186 * the request the client has made of the servlet
187 * @param response
188 * an {@link javax.servlet.http.HttpServletResponse} object, contains
189 * the response the servlet sends to the client
190 * @throws javax.servlet.ServletException
191 * if an exception occurs that interrupts the servlet's normal
192 * operation
193 * @throws java.io.IOException
194 * is thrown upon i/o error
195 */
196 public void doGet(final HttpServletRequest request,
197 final HttpServletResponse response)
198 throws ServletException, IOException,NullPointerException {
199 MolwindLogger.debug("Parsing command: " + request);
200 Command command = parseCommand(request);
201
202 if(command != null){
203 command.execute(request,response);
204 }
205
206
207
208 }
209
210
211
212 /**
213 * Tries to read integer values from the request object.
214 *
215 * @param request
216 * an {@link javax.servlet.http.HttpServletRequest} object, contains
217 * the request the client has made of the servlet
218 * @param paramName
219 * the name of the parameter
220 * @param defaultValue
221 * the default value
222 * @return
223 * the parsed integer
224 */
225 private int parseInt(final HttpServletRequest request,
226 final String paramName, final int defaultValue) {
227 int x = defaultValue;
228 String paramString = request.getParameter(paramName);
229
230 if (paramString != null) {
231 try {
232 x = Integer.parseInt(paramString);
233 } catch (NumberFormatException nfe) {
234 MolwindLogger.warn("Request parameter "
235 + paramName + " is invalid");
236 x = defaultValue;
237 }
238 }
239
240 return x;
241 }
242
243 /**
244 * Tries to read the command from the request object.
245 *
246 * @param request
247 * an {@link javax.servlet.http.HttpServletRequest} object, contains
248 * the request the client has made of the servlet
249 * @return
250 * the parsed command
251 */
252 private Command parseCommand(final HttpServletRequest request){
253 String commandName = request.getParameter(PARAM_COMMAND);
254
255 if (commandName == null){
256 return null;
257 }else{
258 return commands.get(commandName);
259 }
260
261 }
262
263 /**
264 * Tries to read the world name from the request object.
265 *
266 * @param request
267 * an {@link javax.servlet.http.HttpServletRequest} object, contains
268 * the request the client has made of the servlet
269 * @return
270 * the parsed world name
271 */
272 private String parseWorldName(final HttpServletRequest request) {
273 String worldName = request.getParameter(PARAM_WORLD);
274
275 if (worldName == null) {
276 return DEFAULT_WORLD;
277 } else {
278 return worldName;
279 }
280 }
281
282 /**
283 * Reads the requested position from the request object.
284 *
285 * @param request
286 * an {@link javax.servlet.http.HttpServletRequest} object, contains
287 * the request the client has made of the servlet
288 * @return
289 * the parsed position
290 */
291 private LayeredPosition parsePosition(final HttpServletRequest request) {
292 int x = parseInt(request, "X", 0);
293 int y = parseInt(request, "Y", 0);
294 int l = parseInt(request, "L", 0);
295 return new LayeredPosition(x, y, l);
296 }
297
298 /**
299 * Places a Command to the HashMap
300 *
301 * @param key
302 * a String used as for the HashMap
303 *
304 * @param
305 * an Command to be set in the HashMap
306 *
307 */
308 private void addCommand(String key,Command com){
309
310 commands.put(key,com);
311 }
312
313 /**
314 * Returns a Command by the given key
315 *
316 * @param
317 * a String for looking up the Hashtable
318 *
319 * @return
320 * the searched Command
321 */
322 private Command getCommand(String key){
323 return commands.get(key);
324 }
325
326
327
328
329
330 // public void doGet(HttpServletRequest req, HttpServletResponse res)
331 // throws ServletException, IOException {
332 // Enumeration<String> enume = req.getParameterNames();
333 // int i1=0;
334 // while(enume.hasMoreElements()){
335 // sa_req[i1]=enume.nextElement();
336 // if (sa_req[i1].contains("T")){
337 // T=(String)req.getParameter(sa_req[i1]);
338 // }
339 // i1++;
340 // }
341 // if (req.getParameter("path")!=null){
342 // Install inst=new Install();
343 // confPath=req.getParameter("path");
344 // inst.changeWebXml(confPath, path);
345 // }
346 // if (start==0){
347 // Install inst=new Install();
348 // if (inst.exitsConfig(confPath)){
349 // start=1;
350 // crt.initialise(confPath, path);
351 // PrintWriter out = res.getWriter();
352 // Welcome welc=new Welcome();
353 // for (int i2=0; i2<welc.getPage().size(); i2++){
354 // for (int i3=0; i3<welc.getPage().get(i2).size(); i3++){
355 // out.println(welc.getPage().get(i2).get(i3));
356 // }
357 // }
358 // out.close();
359 // }
360 // else{
361 // PrintWriter out = res.getWriter();
362 // for (int i2=0; i2<inst.getPage(
363 // confPath,path).size();i2++){
364 // for (int i3=0;i3<inst.getPage(confPath,path).get(
365 // i2).size(); i3++){
366 // out.println(inst.getPage(confPath,path).get(
367 // i2).get(i3));
368 // }
369 // }
370 // }
371 // }
372 // else if (req.getParameter("updateServer")!=null){
373 // crt.updateServer();
374 // PrintWriter out = res.getWriter();
375 // out.println("Names of the existing datesets:");
376 // for(int i=0; i<Config.getWorldCount(); i++){
377 // out.println(Config.getWorldName(i)+" <br>");
378 // }
379 // out.println("Please start the calculation of a dataset by "
380 // + "calling the servlet with the parameter: "
381 // + "start=\"name of the dataset\"");
382 // out.close();
383 // }
384 // else if (req.getParameter("OUTPUTFORMAT")!=null){
385 // String re=req.getQueryString();
386 // String name=req.getParameter("TypeName");
387 // int a=re.indexOf("name-");
388 // int b=re.indexOf("-lev-");
389 // String name=re.substring(a+5,b);
390 // a=re.indexOf("lev-");
391 // String lev=re.substring(a+4, a+5);
392 // ServletContext con = getServletContext();
393 // RequestDispatcher rq = con.getRequestDispatcher("/data/"
394 // + name+"/pln-"+lev+".gz");
395 // rq.forward( req, res );
396 // }
397 // else if (req.getParameter("start")!=null){
398 // crt.start((String)req.getParameter("start"));
399 // PrintWriter out = res.getWriter();
400 // Welcome welc=new Welcome();
401 // for (int i2=0; i2<welc.getPage().size(); i2++){
402 // for (int i3=0; i3<welc.getPage().get(i2).size(); i3++){
403 // out.println(welc.getPage().get(i2).get(i3));
404 // }
405 // }
406 // out.close();
407 // }
408 // else if (req.getParameter("load")!=null){
409 // PrintWriter out = res.getWriter();
410 // if (crt.load((String)req.getParameter("load"))){
411 // out.write("World "+(String)req.getParameter("load")
412 // +" has been reloaded");
413 // }
414 // else{
415 // out.write("World "+(String)req.getParameter("load")
416 // +" could not be reloaded");
417 // }
418 // out.close();
419 // }
420 // else if (req.getParameter("restart")!=null){
421 // crt.restart((String)req.getParameter("restart"));
422 // PrintWriter out = res.getWriter();
423 // out.write("World "+(String)req.getParameter("restart")
424 // +" has been restarted");
425 // out.close();
426 // }
427 // else if (req.getParameter("log")!=null){
428 // PrintWriter out = res.getWriter();
429 // out.close();
430 // }
431 // else if (req.getParameter("xml")!=null){
432 // if (req.getParameter("xml").equals("images")){
433 // ServletContext con = getServletContext();
434 // RequestDispatcher rq = con.getRequestDispatcher( "data/"
435 // +T+"/xml/@images.xml" );
436 // rq.forward( req, res );
437 // }
438 // if (req.getParameter("xml").equals("placenames")){
439 // ServletContext con = getServletContext();
440 // RequestDispatcher rq = con.getRequestDispatcher( "data/"
441 // +T+"/xml/^placenames.xml" );
442 // rq.forward( req, res );
443 // }
444 // }
445 // else if (req.getParameter("names")!=null){
446 // ServletContext con = getServletContext();
447 // RequestDispatcher rq = con.getRequestDispatcher( "data/"
448 // +T+"/names/names.gz" );
449 // rq.forward( req, res );
450 // }
451 // else if (req.getParameter("X")!=null){
452 // res.setContentType("image/jpg");
453 // int x = Integer.parseInt(req.getParameter("X"));
454 // int y = Integer.parseInt(req.getParameter("Y"));
455 // int l = Integer.parseInt(req.getParameter("L"));
456 // if (crt.exists(x, y, l, T)){
457 // String key= Integer.toString(x)+"-"+Integer.toString(y)
458 // +"-"+Integer.toString(l);
459 // ServletContext con = getServletContext();
460 // RequestDispatcher rq = con.getRequestDispatcher( "data/"
461 // +T+"/images/"+key+".jpg" );
462 // rq.forward( req, res );
463 // }
464 // else{
465 // ImageIO.write(crt.getImage(x, y, l, T),
466 // "jpg", res.getOutputStream());
467 // }
468 // }
469 // else{
470 // PrintWriter out = res.getWriter();
471 // Welcome welc=new Welcome();
472 // for (int i2=0; i2<welc.getPage().size(); i2++){
473 // for (int i3=0; i3<welc.getPage().get(i2).size(); i3++){
474 // out.println(welc.getPage().get(i2).get(i3));
475 // }
476 // }
477 // out.close();
478 // }
479 // }
480
481 }