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 boolean firstError = false;
00253 try {
00254 while (true) {
00255 try {
00256 Socket socket = serverSocket.accept();
00257 firstError = false;
00258 connexionPool.runServerConnexion(this, socket);
00259 } catch (Throwable e) {
00260
00261 LogManager.traceError(0, e);
00262 serverSocket.close();
00263 if (!firstError) serverSocket = new ServerSocket(port, 1000);
00264 else throw new IOException();
00265 firstError = true;
00266 }
00267 }
00268 } finally {
00269 try {
00270 LogManager.traceError(LogServices.WEBSERVICE, "Web server connexion stopped ");
00271 serverSocket.close();
00272 System.exit(1);
00273 } catch (Exception e) {
00274 LogManager.traceError(LogServices.WEBSERVICE, e);
00275 }
00276 }
00277 }
00278
00280 public void destroyAllServlets() {
00281 Enumeration en = registry.elements();
00282 while (en.hasMoreElements()) {
00283 Servlet servlet = (Servlet) en.nextElement();
00284 servlet.destroy();
00285 }
00286 registry = new PathTreeDictionary();
00287
00288 }
00289
00290
00291
00292
00293 public void freeResources() throws Exception {
00294 this.destroyAllServlets();
00295 connexionPool.freeResources();
00296 serverSocket.close();
00297 LogManager.traceInfo(LogServices.WEBSERVICE, "Web server is stopped");
00298
00299 }
00300
00301 private void readServlets(String cfgfile) {
00306 Hashtable servletstbl, parameterstbl;
00307 servletstbl = new Hashtable();
00308 parameterstbl = new Hashtable();
00309 if (cfgfile != null) {
00310 File file = new File(cfgfile);
00311 try {
00312 DataInputStream in = null;
00313 if (file.exists() && file.canRead()) {
00314 in = new DataInputStream(new FileInputStream(file));
00315 } else {
00316 in = new DataInputStream(PropertiesManager.getManager().getRessourceAsStream(cfgfile));
00317 }
00321 do {
00322 String servletdsc = in.readLine();
00323 if (servletdsc == null)
00324 break;
00325 StringTokenizer dsctokenzr = new StringTokenizer(servletdsc, ".=,", false);
00326 if (dsctokenzr.hasMoreTokens()) {
00327 if (!dsctokenzr.nextToken().equalsIgnoreCase("servlet")) {
00328 System.err.println("No leading 'servlet' keyword, the sentence is skipped");
00329 break;
00330 }
00331 if (dsctokenzr.hasMoreTokens()) {
00332 String servletname = dsctokenzr.nextToken();
00333
00334 if (dsctokenzr.hasMoreTokens()) {
00335 String lt = dsctokenzr.nextToken();
00336 if (lt.equalsIgnoreCase("code")) {
00337 if (dsctokenzr.hasMoreTokens())
00338 servletstbl.put(servletname, dsctokenzr.nextToken("="));
00339 } else if (lt.equalsIgnoreCase("initArgs")) {
00340 Hashtable initparams = new Hashtable();
00341 while (dsctokenzr.hasMoreTokens()) {
00342 String key = dsctokenzr.nextToken("=,");
00343 if (dsctokenzr.hasMoreTokens())
00344 initparams.put(key, dsctokenzr.nextToken(",="));
00345 }
00346 parameterstbl.put(servletname, initparams);
00347 } else
00348 System.err.println("Unrecognized token " + lt + " in " + servletdsc + ", the line's skipped");
00349 }
00350 }
00351 }
00352 } while (true);
00353 Enumeration se = servletstbl.keys();
00354 String servletname;
00355 while (se.hasMoreElements()) {
00356 servletname = (String) se.nextElement();
00357 addServlet(servletname, (String) servletstbl.get(servletname), (Hashtable) parameterstbl.get(servletname));
00358 }
00359 } catch (IOException e) {
00360 System.err.println("Problem reading cfg file: " + e);
00361 }
00362
00363 }
00364 }
00365
00366
00367
00368
00370
00371
00372
00373 public Object getAttribute(String name) {
00374
00375 return attributes.get(name);
00376 }
00377
00378 public Enumeration getAttributeNames() {
00379 return attributes.keys();
00380 }
00381
00382 public ServletContext getContext(String uripath) {
00383 return this;
00384 }
00385
00386
00387 public String getInitParameter(String param) {
00388 return null;
00389 }
00390
00391 public Enumeration getInitParameterNames() {
00392 return null;
00393 }
00394
00395 public int getMajorVersion() {
00396 return 2;
00397 }
00398
00400
00401 public String getMimeType(String file) {
00402 file = file.toUpperCase();
00403
00404 if (file.endsWith(".HTML") || file.endsWith(".HTM"))
00405 return "text/html";
00406 if (file.endsWith(".TXT"))
00407 return "text/plain";
00408 if (file.endsWith(".XML"))
00409 return "text/xml";
00410 if (file.endsWith(".CSS"))
00411 return "text/css";
00412 if (file.endsWith(".SGML") || file.endsWith(".SGM"))
00413 return "text/x-sgml";
00414
00415 if (file.endsWith(".GIF"))
00416 return "image/gif";
00417 if (file.endsWith(".JPG") || file.endsWith(".JPEG") || file.endsWith(".JPE"))
00418 return "image/jpeg";
00419 if (file.endsWith(".PNG"))
00420 return "image/png";
00421 if (file.endsWith(".TIF") || file.endsWith(".TIFF"))
00422 return "image/tiff";
00423 if (file.endsWith(".RGB"))
00424 return "image/x-rgb";
00425 if (file.endsWith(".XPM"))
00426 return "image/x-xpixmap";
00427 if (file.endsWith(".XBM"))
00428 return "image/x-xbitmap";
00429 if (file.endsWith(".SVG"))
00430 return "image/svg-xml ";
00431 if (file.endsWith(".SVGZ"))
00432 return "image/svg-xml ";
00433
00434 if (file.endsWith(".AU") || file.endsWith(".SND"))
00435 return "audio/basic";
00436 if (file.endsWith(".MID") || file.endsWith(".MIDI") || file.endsWith(".RMI") || file.endsWith(".KAR"))
00437 return "audio/mid";
00438 if (file.endsWith(".MPGA") || file.endsWith(".MP2") || file.endsWith(".MP3"))
00439 return "audio/mpeg";
00440 if (file.endsWith(".WAV"))
00441 return "audio/wav";
00442 if (file.endsWith(".AIFF") || file.endsWith(".AIFC"))
00443 return "audio/aiff";
00444 if (file.endsWith(".AIF"))
00445 return "audio/x-aiff";
00446 if (file.endsWith(".RA"))
00447 return "audio/x-realaudio";
00448 if (file.endsWith(".RPM"))
00449 return "audio/x-pn-realaudio-plugin";
00450 if (file.endsWith(".RAM"))
00451 return "audio/x-pn-realaudio";
00452 if (file.endsWith(".SD2"))
00453 return "audio/x-sd2";
00454
00455 if (file.endsWith(".BIN") || file.endsWith(".DMS") || file.endsWith(".LHA") || file.endsWith(".LZH") || file.endsWith(".EXE") || file.endsWith(".CLASS"))
00456 return "application/octet-stream";
00457 if (file.endsWith(".HQX"))
00458 return "application/mac-binhex40";
00459 if (file.endsWith(".PS") || file.endsWith(".AI") || file.endsWith(".EPS"))
00460 return "application/postscript";
00461 if (file.endsWith(".PDF"))
00462 return "application/pdf";
00463 if (file.endsWith(".RTF"))
00464 return "application/rtf";
00465 if (file.endsWith(".DOC"))
00466 return "application/msword";
00467 if (file.endsWith(".PPT"))
00468 return "application/powerpoint";
00469 if (file.endsWith(".FIF"))
00470 return "application/fractals";
00471 if (file.endsWith(".P7C"))
00472 return "application/pkcs7-mime";
00473
00474 if (file.endsWith(".JS"))
00475 return "application/x-javascript";
00476 if (file.endsWith(".Z"))
00477 return "application/x-compress";
00478 if (file.endsWith(".GZ"))
00479 return "application/x-gzip";
00480 if (file.endsWith(".TAR"))
00481 return "application/x-tar";
00482 if (file.endsWith(".TGZ"))
00483 return "application/x-compressed";
00484 if (file.endsWith(".ZIP"))
00485 return "application/x-zip-compressed";
00486 if (file.endsWith(".DIR") || file.endsWith(".DCR") || file.endsWith(".DXR"))
00487 return "application/x-director";
00488 if (file.endsWith(".DVI"))
00489 return "application/x-dvi";
00490 if (file.endsWith(".TEX"))
00491 return "application/x-tex";
00492 if (file.endsWith(".LATEX"))
00493 return "application/x-latex";
00494 if (file.endsWith(".TCL"))
00495 return "application/x-tcl";
00496 if (file.endsWith(".CER") || file.endsWith(".CRT") || file.endsWith(".DER"))
00497 return "application/x-x509-ca-cert";
00498
00499 if (file.endsWith(".MPG") || file.endsWith(".MPE") || file.endsWith(".MPEG"))
00500 return "video/mpeg";
00501 if (file.endsWith(".QT") || file.endsWith(".MOV"))
00502 return "video/quicktime";
00503 if (file.endsWith(".AVI"))
00504 return "video/x-msvideo";
00505 if (file.endsWith(".MOVIE"))
00506 return "video/x-sgi-movie";
00507
00508 if (file.endsWith(".PDB") || file.endsWith(".XYZ"))
00509 return "chemical/x-pdb";
00510
00511 if (file.endsWith(".ICE"))
00512 return "x-conference/x-cooltalk";
00513 if (file.endsWith(".WRL") || file.endsWith(".VRML"))
00514 return "x-world/x-vrml";
00515 if (file.endsWith(".WML"))
00516 return "text/vnd.wap.wml";
00517 if (file.endsWith(".WMLC"))
00518 return "application/vnd.wap.wmlc";
00519 if (file.endsWith(".WMLS"))
00520 return "text/vnd.wap.wmlscript";
00521 if (file.endsWith(".WMLSC"))
00522 return "application/vnd.wap.wmlscriptc";
00523 if (file.endsWith(".WBMP"))
00524 return "image/vnd.wap.wbmp";
00525
00526 return null;
00527 }
00528
00529 public int getMinorVersion() {
00530 return 3;
00531 }
00532
00533 public RequestDispatcher getNamedDispatcher(String name) {
00534 return this;
00535 }
00536
00537 public String getRealPath(String path) {
00538 return installPath + FileUtilities.convertFileNameToSystem(path);
00539
00540 }
00541
00542 public RequestDispatcher getRequestDispatcher(String path) {
00543 return this;
00544 }
00545
00546
00547 public URL getResource(String path) throws MalformedURLException {
00548 return new URL("http", hostName, port, path);
00549 }
00550
00551 public InputStream getResourceAsStream(String path) {
00552 return null;
00553 }
00554
00555 public java.util.Set getResourcePaths(java.lang.String path) {
00556
00557 return null;
00558 }
00559
00561
00562
00563 public String getServerInfo() {
00564 return Identification.serverName + " " + Identification.serverVersion + " (" + Identification.serverUrl + ")";
00565 }
00566
00567 public Servlet getServlet(String name) {
00568
00569
00570
00571
00572
00573
00574
00575 return null;
00576 }
00577
00584 public java.lang.String getServletContextName() {
00585 return null;
00586 }
00587
00589
00590
00591 public Enumeration getServletNames() {
00592
00593
00594
00595
00596 return new Vector().elements();
00597 }
00598
00599 public Enumeration getServlets() {
00600
00601
00602
00603
00604 return new Vector().elements();
00605 }
00606
00607 public void log(Exception exception, String msg) {
00608 LogManager.traceWarning(LogServices.WEBSERVICE, msg);
00609 LogManager.traceWarning(LogServices.WEBSERVICE, exception);
00610 }
00611
00612 public void log(String msg) {
00613 LogManager.traceWarning(LogServices.WEBSERVICE, msg);
00614 }
00615
00616 public void log(String message, Throwable throwable) {
00617 LogManager.traceWarning(LogServices.WEBSERVICE, message);
00618 LogManager.traceWarning(LogServices.WEBSERVICE, throwable);
00619 }
00620
00621 public void removeAttribute(String name) {
00622 attributes.remove(name);
00623 }
00624
00625 public void setAttribute(String name, Object object) {
00626 attributes.put(name, object);
00627 }
00628
00629
00630
00631
00632 public void forward(ServletRequest request, ServletResponse response) {
00633 }
00634
00635 public void include(ServletRequest request, ServletResponse response) {
00636 }
00637 }