00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 package org.openmobileis.embedded.webserver;
00031
00032 import java.io.DataInputStream;
00033 import java.io.File;
00034 import java.io.FileInputStream;
00035 import java.io.IOException;
00036 import java.io.InputStream;
00037 import java.net.MalformedURLException;
00038 import java.net.ServerSocket;
00039 import java.net.Socket;
00040 import java.net.URL;
00041 import java.util.Enumeration;
00042 import java.util.Hashtable;
00043 import java.util.Properties;
00044 import java.util.StringTokenizer;
00045 import java.util.Vector;
00046
00047 import javax.servlet.RequestDispatcher;
00048 import javax.servlet.Servlet;
00049 import javax.servlet.ServletContext;
00050 import javax.servlet.ServletException;
00051 import javax.servlet.ServletRequest;
00052 import javax.servlet.ServletResponse;
00053
00054 import org.openmobileis.common.context.SessionContextManager;
00055 import org.openmobileis.common.util.PropertiesManager;
00056 import org.openmobileis.common.util.file.FileUtilities;
00057 import org.openmobileis.common.util.log.LogManager;
00058 import org.openmobileis.common.util.log.LogServices;
00059
00060 public class WebServer implements ServletContext, RequestDispatcher {
00061
00062 private final static int DEFAULT_PORT = 8080;
00063
00064 private ServerThreadPool connexionPool;
00065
00066 protected PathTreeDictionary registry;
00067
00068
00069 private Hashtable servlets = new Hashtable();
00070
00071 private Hashtable attributes;
00072
00073 boolean running = true;
00074
00075 private ServerSocket serverSocket;
00076
00077 protected String hostName;
00078
00079 protected int port = DEFAULT_PORT;
00080
00081 private static Properties webserverProps;
00082
00083
00084 public static String servletFile = "";
00085
00086 public static String installPath = "";
00087
00089
00090 public WebServer() {
00091 this(System.getProperty("user.dir"));
00092 }
00093
00094 public WebServer(String pathToConfFile) {
00095 System.setProperty("user.dir", pathToConfFile);
00096 System.out.println("Webserver const userdir:"+pathToConfFile);
00097 try {
00098 if (pathToConfFile != null) {
00099 try {
00100
00101 webserverProps = PropertiesManager.getManager().getPropertiesFromPath("/WEB-INF/conf/properties/webserver.properties");
00102 } catch (Throwable ex) {
00103
00104 webserverProps = PropertiesManager.getManager().getPropertiesFromPath(
00105 pathToConfFile + File.separator + "WEB-INF" + File.separator + "conf" + java.io.File.separator + "properties" + java.io.File.separator
00106 + "webserver.properties");
00107 }
00108 } else {
00109 webserverProps = PropertiesManager.getManager().getPropertiesFromPath("properties" + java.io.File.separator + "webserver.properties");
00110 }
00111
00112 } catch (Exception ex) {
00113 ex.printStackTrace();
00114 System.out.println("Unable to find webserver.properties !!\nexit(1)");
00115 System.exit(1);
00116 }
00117 String strPort = webserverProps.getProperty("port");
00118 if (strPort != null && strPort.length() > 0) {
00119 try {
00120 this.port = Integer.parseInt(strPort);
00121 } catch (NumberFormatException ex) {
00122 this.port = DEFAULT_PORT;
00123 }
00124 }
00125
00126 WebServer.installPath = webserverProps.getProperty("installPath");
00127 servletFile = webserverProps.getProperty("servletFile");
00128 registry = new PathTreeDictionary();
00129 try {
00130 connexionPool = new ServerThreadPool();
00131 } catch (Exception ex) {
00132 LogManager.traceError(LogServices.WEBSERVICE, "can not initialise server connexion pool");
00133 LogManager.traceError(0, ex);
00134 }
00135 attributes = new Hashtable();
00136
00137
00138
00139 SessionContextManager.getManager().createSessionContext("OPENMOBILEISSESSION");
00140 SessionContextManager.getManager().joinSessionContext("OPENMOBILEISSESSION");
00141 }
00142
00143 public void stopServer() {
00144 try {
00145 serverSocket.close();
00146 connexionPool.freeResources();
00147 connexionPool = null;
00148 } catch (Throwable ex) {
00149 LogManager.traceError(0, ex);
00150 }
00151 }
00152
00154
00155
00156
00157 public void addServlet(String urlPat, String className) {
00158 addServlet(urlPat, className, (Hashtable) null);
00159 }
00160
00161 public void addServlet(String urlPat, String className, Hashtable initParams) {
00162
00163 SecurityManager security = System.getSecurityManager();
00164 if (security != null) {
00165 int i = className.lastIndexOf('.');
00166 if (i != -1) {
00167 security.checkPackageAccess(className.substring(0, i));
00168 security.checkPackageDefinition(className.substring(0, i));
00169 }
00170 }
00171
00172
00173 try {
00174 addServlet(urlPat, (Servlet) Class.forName(className).newInstance(), initParams);
00175 return;
00176 } catch (ClassNotFoundException e) {
00177 LogManager.traceError(0, e);
00178 LogManager.traceError(LogServices.WEBSERVICE, "Class not found: " + className);
00179 } catch (ClassCastException e) {
00180 LogManager.traceError(0, e);
00181 LogManager.traceError(LogServices.WEBSERVICE, "Class cast problem: " + e.getMessage());
00182 } catch (InstantiationException e) {
00183 LogManager.traceError(0, e);
00184 LogManager.traceError(LogServices.WEBSERVICE, "Instantiation problem: " + e.getMessage());
00185 } catch (IllegalAccessException e) {
00186 LogManager.traceError(0, e);
00187 LogManager.traceError(LogServices.WEBSERVICE, "Illegal class access: " + e.getMessage());
00188 } catch (Exception e) {
00189 LogManager.traceError(0, e);
00190 LogManager.traceError(LogServices.WEBSERVICE, "Unexpected problem creating servlet: " + e);
00191 LogManager.traceError(LogServices.WEBSERVICE, e);
00192 }
00193 }
00194
00196
00197
00198
00199 public void addServlet(String urlPat, Servlet servlet) {
00200 addServlet(urlPat, servlet, (Hashtable) null);
00201 }
00202
00203 public void addServlet(String urlPat, Servlet servlet, Hashtable initParams) {
00204 try {
00205 servlet.init(new ServeConfig((ServletContext) this, initParams, urlPat));
00206 registry.put(urlPat, servlet);
00207 servlets.put(servlet.getClass().getName(), urlPat);
00208 } catch (ServletException e) {
00209 LogManager.traceError(0, e);
00210 LogManager.traceError(LogServices.WEBSERVICE, "Problem initializing servlet: " + e);
00211 }
00212 }
00213
00214 public Object[] getServletByURLorClassName(String name) {
00215 Object[] servlet = new Object[2];
00216 servlet = registry.get(name);
00217 if (servlet[0] == null) {
00218 String servletUri = (String) servlets.get(name);
00219 if (servletUri != null && servletUri.trim().length() > 0) {
00220 servlet = registry.get(servletUri);
00221 }
00222 }
00223 if (servlet[0] == null) {
00224 String newName = name;
00225 int index = newName.lastIndexOf('/');
00226 while (index != -1) {
00227 newName = newName.substring(0, index);
00228 servlet = registry.get(newName);
00229 if (servlet[0] != null) {
00230 break;
00231 }
00232 index = newName.lastIndexOf('/');
00233 }
00234 }
00235 return servlet;
00236 }
00237
00238
00239 public void serve() throws IOException {
00240
00241
00242 if (LogManager.getInstance() == null) {
00243 LogManager.registerLogManager(null);
00244 }
00245
00246 System.out.println("Webserver server servletFile" + servletFile);
00247 this.readServlets(servletFile);
00248 serverSocket = new ServerSocket(port, 1000);
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 boolean firstError = false;
00286 try {
00287 while (true) {
00288 try {
00289 Socket socket = serverSocket.accept();
00290 firstError = false;
00291 connexionPool.runServerConnexion(this, socket);
00292 } catch (Throwable e) {
00293
00294 LogManager.traceError(0, e);
00295 serverSocket.close();
00296 if (!firstError) serverSocket = new ServerSocket(port, 1000);
00297 else throw new IOException();
00298 firstError = true;
00299 }
00300 }
00301 } finally {
00302 try {
00303 LogManager.traceError(LogServices.WEBSERVICE, "Web server connexion stopped ");
00304 serverSocket.close();
00305 System.exit(1);
00306 } catch (Exception e) {
00307 LogManager.traceError(LogServices.WEBSERVICE, e);
00308 }
00309 }
00310 }
00311
00313 public void destroyAllServlets() {
00314 Enumeration en = registry.elements();
00315 while (en.hasMoreElements()) {
00316 Servlet servlet = (Servlet) en.nextElement();
00317 servlet.destroy();
00318 }
00319 registry = new PathTreeDictionary();
00320
00321 }
00322
00323
00324
00325
00326 public void freeResources() throws Exception {
00327 this.destroyAllServlets();
00328 connexionPool.freeResources();
00329 serverSocket.close();
00330 LogManager.traceInfo(LogServices.WEBSERVICE, "Web server is stopped");
00331
00332 }
00333
00334 private void readServlets(String cfgfile) {
00339 Hashtable servletstbl, parameterstbl;
00340 servletstbl = new Hashtable();
00341 parameterstbl = new Hashtable();
00342 if (cfgfile != null) {
00343 File file = new File(cfgfile);
00344 try {
00345 DataInputStream in = null;
00346 if (file.exists() && file.canRead()) {
00347 in = new DataInputStream(new FileInputStream(file));
00348 } else {
00349 in = new DataInputStream(PropertiesManager.getManager().getRessourceAsStream(cfgfile));
00350 }
00354 do {
00355 String servletdsc = in.readLine();
00356 if (servletdsc == null)
00357 break;
00358 StringTokenizer dsctokenzr = new StringTokenizer(servletdsc, ".=,", false);
00359 if (dsctokenzr.hasMoreTokens()) {
00360 if (!dsctokenzr.nextToken().equalsIgnoreCase("servlet")) {
00361 System.err.println("No leading 'servlet' keyword, the sentence is skipped");
00362 break;
00363 }
00364 if (dsctokenzr.hasMoreTokens()) {
00365 String servletname = dsctokenzr.nextToken();
00366
00367 if (dsctokenzr.hasMoreTokens()) {
00368 String lt = dsctokenzr.nextToken();
00369 if (lt.equalsIgnoreCase("code")) {
00370 if (dsctokenzr.hasMoreTokens())
00371 servletstbl.put(servletname, dsctokenzr.nextToken("="));
00372 } else if (lt.equalsIgnoreCase("initArgs")) {
00373 Hashtable initparams = new Hashtable();
00374 while (dsctokenzr.hasMoreTokens()) {
00375 String key = dsctokenzr.nextToken("=,");
00376 if (dsctokenzr.hasMoreTokens())
00377 initparams.put(key, dsctokenzr.nextToken(",="));
00378 }
00379 parameterstbl.put(servletname, initparams);
00380 } else
00381 System.err.println("Unrecognized token " + lt + " in " + servletdsc + ", the line's skipped");
00382 }
00383 }
00384 }
00385 } while (true);
00386 Enumeration se = servletstbl.keys();
00387 String servletname;
00388 while (se.hasMoreElements()) {
00389 servletname = (String) se.nextElement();
00390 addServlet(servletname, (String) servletstbl.get(servletname), (Hashtable) parameterstbl.get(servletname));
00391 }
00392 } catch (IOException e) {
00393 System.err.println("Problem reading cfg file: " + e);
00394 }
00395
00396 }
00397 }
00398
00399
00400
00401
00403
00404
00405
00406 public Object getAttribute(String name) {
00407
00408 return attributes.get(name);
00409 }
00410
00411 public Enumeration getAttributeNames() {
00412 return attributes.keys();
00413 }
00414
00415 public ServletContext getContext(String uripath) {
00416 return this;
00417 }
00418
00419
00420 public String getInitParameter(String param) {
00421 return null;
00422 }
00423
00424 public Enumeration getInitParameterNames() {
00425 return null;
00426 }
00427
00428 public int getMajorVersion() {
00429 return 2;
00430 }
00431
00433
00434 public String getMimeType(String file) {
00435 file = file.toUpperCase();
00436
00437 if (file.endsWith(".HTML") || file.endsWith(".HTM"))
00438 return "text/html";
00439 if (file.endsWith(".TXT"))
00440 return "text/plain";
00441 if (file.endsWith(".XML"))
00442 return "text/xml";
00443 if (file.endsWith(".CSS"))
00444 return "text/css";
00445 if (file.endsWith(".SGML") || file.endsWith(".SGM"))
00446 return "text/x-sgml";
00447
00448 if (file.endsWith(".GIF"))
00449 return "image/gif";
00450 if (file.endsWith(".JPG") || file.endsWith(".JPEG") || file.endsWith(".JPE"))
00451 return "image/jpeg";
00452 if (file.endsWith(".PNG"))
00453 return "image/png";
00454 if (file.endsWith(".TIF") || file.endsWith(".TIFF"))
00455 return "image/tiff";
00456 if (file.endsWith(".RGB"))
00457 return "image/x-rgb";
00458 if (file.endsWith(".XPM"))
00459 return "image/x-xpixmap";
00460 if (file.endsWith(".XBM"))
00461 return "image/x-xbitmap";
00462 if (file.endsWith(".SVG"))
00463 return "image/svg-xml ";
00464 if (file.endsWith(".SVGZ"))
00465 return "image/svg-xml ";
00466
00467 if (file.endsWith(".AU") || file.endsWith(".SND"))
00468 return "audio/basic";
00469 if (file.endsWith(".MID") || file.endsWith(".MIDI") || file.endsWith(".RMI") || file.endsWith(".KAR"))
00470 return "audio/mid";
00471 if (file.endsWith(".MPGA") || file.endsWith(".MP2") || file.endsWith(".MP3"))
00472 return "audio/mpeg";
00473 if (file.endsWith(".WAV"))
00474 return "audio/wav";
00475 if (file.endsWith(".AIFF") || file.endsWith(".AIFC"))
00476 return "audio/aiff";
00477 if (file.endsWith(".AIF"))
00478 return "audio/x-aiff";
00479 if (file.endsWith(".RA"))
00480 return "audio/x-realaudio";
00481 if (file.endsWith(".RPM"))
00482 return "audio/x-pn-realaudio-plugin";
00483 if (file.endsWith(".RAM"))
00484 return "audio/x-pn-realaudio";
00485 if (file.endsWith(".SD2"))
00486 return "audio/x-sd2";
00487
00488 if (file.endsWith(".BIN") || file.endsWith(".DMS") || file.endsWith(".LHA") || file.endsWith(".LZH") || file.endsWith(".EXE") || file.endsWith(".CLASS"))
00489 return "application/octet-stream";
00490 if (file.endsWith(".HQX"))
00491 return "application/mac-binhex40";
00492 if (file.endsWith(".PS") || file.endsWith(".AI") || file.endsWith(".EPS"))
00493 return "application/postscript";
00494 if (file.endsWith(".PDF"))
00495 return "application/pdf";
00496 if (file.endsWith(".RTF"))
00497 return "application/rtf";
00498 if (file.endsWith(".DOC"))
00499 return "application/msword";
00500 if (file.endsWith(".PPT"))
00501 return "application/powerpoint";
00502 if (file.endsWith(".FIF"))
00503 return "application/fractals";
00504 if (file.endsWith(".P7C"))
00505 return "application/pkcs7-mime";
00506
00507 if (file.endsWith(".JS"))
00508 return "application/x-javascript";
00509 if (file.endsWith(".Z"))
00510 return "application/x-compress";
00511 if (file.endsWith(".GZ"))
00512 return "application/x-gzip";
00513 if (file.endsWith(".TAR"))
00514 return "application/x-tar";
00515 if (file.endsWith(".TGZ"))
00516 return "application/x-compressed";
00517 if (file.endsWith(".ZIP"))
00518 return "application/x-zip-compressed";
00519 if (file.endsWith(".DIR") || file.endsWith(".DCR") || file.endsWith(".DXR"))
00520 return "application/x-director";
00521 if (file.endsWith(".DVI"))
00522 return "application/x-dvi";
00523 if (file.endsWith(".TEX"))
00524 return "application/x-tex";
00525 if (file.endsWith(".LATEX"))
00526 return "application/x-latex";
00527 if (file.endsWith(".TCL"))
00528 return "application/x-tcl";
00529 if (file.endsWith(".CER") || file.endsWith(".CRT") || file.endsWith(".DER"))
00530 return "application/x-x509-ca-cert";
00531
00532 if (file.endsWith(".MPG") || file.endsWith(".MPE") || file.endsWith(".MPEG"))
00533 return "video/mpeg";
00534 if (file.endsWith(".QT") || file.endsWith(".MOV"))
00535 return "video/quicktime";
00536 if (file.endsWith(".AVI"))
00537 return "video/x-msvideo";
00538 if (file.endsWith(".MOVIE"))
00539 return "video/x-sgi-movie";
00540
00541 if (file.endsWith(".PDB") || file.endsWith(".XYZ"))
00542 return "chemical/x-pdb";
00543
00544 if (file.endsWith(".ICE"))
00545 return "x-conference/x-cooltalk";
00546 if (file.endsWith(".WRL") || file.endsWith(".VRML"))
00547 return "x-world/x-vrml";
00548 if (file.endsWith(".WML"))
00549 return "text/vnd.wap.wml";
00550 if (file.endsWith(".WMLC"))
00551 return "application/vnd.wap.wmlc";
00552 if (file.endsWith(".WMLS"))
00553 return "text/vnd.wap.wmlscript";
00554 if (file.endsWith(".WMLSC"))
00555 return "application/vnd.wap.wmlscriptc";
00556 if (file.endsWith(".WBMP"))
00557 return "image/vnd.wap.wbmp";
00558
00559 return null;
00560 }
00561
00562 public int getMinorVersion() {
00563 return 3;
00564 }
00565
00566 public RequestDispatcher getNamedDispatcher(String name) {
00567 return this;
00568 }
00569
00570 public String getRealPath(String path) {
00571 return installPath + FileUtilities.convertFileNameToSystem(path);
00572
00573 }
00574
00575 public RequestDispatcher getRequestDispatcher(String path) {
00576 return this;
00577 }
00578
00579
00580 public URL getResource(String path) throws MalformedURLException {
00581 return new URL("http", hostName, port, path);
00582 }
00583
00584 public InputStream getResourceAsStream(String path) {
00585 return null;
00586 }
00587
00588 public java.util.Set getResourcePaths(java.lang.String path) {
00589
00590 return null;
00591 }
00592
00594
00595
00596 public String getServerInfo() {
00597 return Identification.serverName + " " + Identification.serverVersion + " (" + Identification.serverUrl + ")";
00598 }
00599
00600 public Servlet getServlet(String name) {
00601
00602
00603
00604
00605
00606
00607
00608 return null;
00609 }
00610
00617 public java.lang.String getServletContextName() {
00618 return null;
00619 }
00620
00622
00623
00624 public Enumeration getServletNames() {
00625
00626
00627
00628
00629 return new Vector().elements();
00630 }
00631
00632 public Enumeration getServlets() {
00633
00634
00635
00636
00637 return new Vector().elements();
00638 }
00639
00640 public void log(Exception exception, String msg) {
00641 LogManager.traceWarning(LogServices.WEBSERVICE, msg);
00642 LogManager.traceWarning(LogServices.WEBSERVICE, exception);
00643 }
00644
00645 public void log(String msg) {
00646 LogManager.traceWarning(LogServices.WEBSERVICE, msg);
00647 }
00648
00649 public void log(String message, Throwable throwable) {
00650 LogManager.traceWarning(LogServices.WEBSERVICE, message);
00651 LogManager.traceWarning(LogServices.WEBSERVICE, throwable);
00652 }
00653
00654 public void removeAttribute(String name) {
00655 attributes.remove(name);
00656 }
00657
00658 public void setAttribute(String name, Object object) {
00659 attributes.put(name, object);
00660 }
00661
00662
00663
00664
00665 public void forward(ServletRequest request, ServletResponse response) {
00666 }
00667
00668 public void include(ServletRequest request, ServletResponse response) {
00669 }
00670 }