home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / bitmechanic / gsp / GspServlet.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-02-03  |  14.0 KB  |  498 lines

  1. package com.bitmechanic.gsp;
  2.  
  3. import com.bitmechanic.smtp.Mailer;
  4. import com.bitmechanic.util.Scheduler;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.io.OutputStream;
  9. import java.io.PrintWriter;
  10. import java.util.Date;
  11. import java.util.Enumeration;
  12. import java.util.Hashtable;
  13. import java.util.Properties;
  14. import java.util.StringTokenizer;
  15. import javax.servlet.ServletConfig;
  16. import javax.servlet.ServletContext;
  17. import javax.servlet.ServletOutputStream;
  18. import javax.servlet.http.HttpServlet;
  19. import javax.servlet.http.HttpServletRequest;
  20. import javax.servlet.http.HttpServletResponse;
  21.  
  22. public class GspServlet extends HttpServlet {
  23.    private ServletConfig config;
  24.    private ServletContext context;
  25.    private Properties properties;
  26.    private Logger logger;
  27.    private Mailer mailer;
  28.    private TemplateFactory factory;
  29.    private ApplicationManager appManager;
  30.    private Scheduler scheduler;
  31.    private Hashtable templateHash;
  32.    private Hashtable globalHash;
  33.    private static boolean debug;
  34.    private boolean started = false;
  35.    private boolean bench = false;
  36.    private boolean alwaysRegister = false;
  37.    private boolean keepUploadFile = false;
  38.    private boolean checkProperties = false;
  39.    private String uploadDir;
  40.    private String errorMessage;
  41.    private String indexPage;
  42.    private String propFile;
  43.    private long maxFileSize;
  44.    private long requestCount;
  45.    private long statInterval;
  46.    private Date startTime;
  47.    private long propLastMod;
  48.    private long recheckProp;
  49.  
  50.    public synchronized void init(ServletConfig var1) {
  51.       if (!this.started) {
  52.          this.config = var1;
  53.          this.context = var1.getServletContext();
  54.          this.startTime = new Date();
  55.          this.globalHash = new Hashtable();
  56.          this.templateHash = new Hashtable();
  57.          this.requestCount = 0L;
  58.          this.scheduler = new Scheduler();
  59.          this.propFile = var1.getInitParameter("propfile");
  60.          if (this.propFile == null) {
  61.             this.errorMessage = "GspServlet: missing init parameter 'propfile'.\n\n     Please add an initArgs attribute 'propfile' for this servlet that points to the gsp.properties file.";
  62.             this.context.log(this.errorMessage);
  63.          } else {
  64.             this.properties = new Properties();
  65.  
  66.             try {
  67.                File var2 = new File(this.propFile);
  68.                this.properties.load(new FileInputStream(var2));
  69.                this.propLastMod = var2.lastModified();
  70.             } catch (IOException var16) {
  71.                this.errorMessage = "GspServlet: cannot load properties for: " + this.propFile + "\n" + Logger.exceptionToString(var16);
  72.                this.context.log(this.errorMessage);
  73.                return;
  74.             }
  75.  
  76.             String var18 = this.properties.getProperty("mailer.smtphost");
  77.             if (var18 == null) {
  78.                var18 = "localhost";
  79.             }
  80.  
  81.             this.mailer = new GspMailer(var18, this);
  82.             String var3 = this.properties.getProperty("class.logger");
  83.             if (var3 != null) {
  84.                try {
  85.                   Class var4 = Class.forName(var3);
  86.                   this.logger = (Logger)var4.newInstance();
  87.                   this.context.log("GspServlet: using custom logger " + var3);
  88.                } catch (Exception var15) {
  89.                   this.errorMessage = "GspServlet: cannot instantiate class.logger: " + var3 + "\n" + Logger.exceptionToString(var15);
  90.                   this.context.log(this.errorMessage);
  91.                   return;
  92.                }
  93.             } else {
  94.                this.logger = new Logger();
  95.             }
  96.  
  97.             try {
  98.                this.logger.init(this);
  99.             } catch (Exception var14) {
  100.                this.errorMessage = "GspServlet: cannot init() class.logger: " + var3 + "\n" + Logger.exceptionToString(var14);
  101.                this.context.log(this.errorMessage);
  102.                return;
  103.             }
  104.  
  105.             try {
  106.                String var19 = this.properties.getProperty("parser.statinterval.seconds");
  107.                this.statInterval = Long.parseLong(var19) * 1000L;
  108.             } catch (Exception var13) {
  109.                this.statInterval = 5000L;
  110.             }
  111.  
  112.             this.recheckProp = System.currentTimeMillis() + this.statInterval;
  113.             this.checkProperties = this.properties.getProperty("parser.checkproperties") != null;
  114.  
  115.             try {
  116.                String var20 = this.properties.getProperty("class.factory");
  117.                if (var20 != null) {
  118.                   try {
  119.                      Class var5 = Class.forName(var20);
  120.                      this.factory = (TemplateFactory)var5.newInstance();
  121.                      this.context.log("GspServlet: using custom factory " + var20);
  122.                   } catch (Exception var12) {
  123.                      this.errorMessage = "GspServlet: error creating factory: " + var20 + " -- " + Logger.exceptionToString(var12);
  124.                      this.context.log(this.errorMessage);
  125.                      this.factory = new TemplateFactory();
  126.                   }
  127.                } else {
  128.                   this.factory = new TemplateFactory();
  129.                }
  130.  
  131.                this.factory.init(this);
  132.                this.appManager = new ApplicationManager(this);
  133.                String var21 = this.properties.getProperty("class.applications");
  134.                if (var21 != null) {
  135.                   StringTokenizer var6 = new StringTokenizer(var21);
  136.  
  137.                   while(var6.hasMoreTokens()) {
  138.                      try {
  139.                         String var7 = var6.nextToken();
  140.                         Class var8 = Class.forName(var7);
  141.                         Application var9 = (Application)var8.newInstance();
  142.                         this.appManager.addApplication(var9);
  143.                         this.context.log("GspServlet: adding custom Application " + var7);
  144.                      } catch (Exception var11) {
  145.                         this.errorMessage = "GspServlet: error creating custom Application\n" + Logger.exceptionToString(var11);
  146.                         this.context.log(this.errorMessage);
  147.                      }
  148.                   }
  149.                }
  150.  
  151.                DefaultApplication var22 = new DefaultApplication();
  152.                this.appManager.addApplication(var22);
  153.                this.bench = this.properties.getProperty("log.bench") != null;
  154.                this.indexPage = this.properties.getProperty("parser.indexpage");
  155.                if (this.indexPage == null) {
  156.                   this.indexPage = "index.gsp";
  157.                }
  158.  
  159.                this.uploadDir = this.properties.getProperty("upload.dir");
  160.                if (this.uploadDir == null) {
  161.                   if (File.separator.equals("/")) {
  162.                      this.uploadDir = "/tmp";
  163.                   } else {
  164.                      this.uploadDir = "c:\\temp";
  165.                   }
  166.  
  167.                   this.context.log("GspServlet: warning - upload.dir not set.  Using " + this.uploadDir + " by default");
  168.                }
  169.  
  170.                this.keepUploadFile = this.properties.getProperty("upload.keeptempfile") != null;
  171.  
  172.                try {
  173.                   this.maxFileSize = Long.parseLong(this.properties.getProperty("upload.maxfilesize"));
  174.                } catch (Exception var10) {
  175.                   this.maxFileSize = 1000000L;
  176.                   this.context.log("GspServlet: warning - upload.maxfilesize not set.  Using " + this.maxFileSize + " bytes by default");
  177.                }
  178.  
  179.                this.alwaysRegister = this.properties.getProperty("session.create_upon_request") == null;
  180.                this.started = true;
  181.                this.context.log("GspServlet started successfully at: " + new Date());
  182.             } catch (Exception var17) {
  183.                this.errorMessage = "GspServlet: Failed to start successfully: " + Logger.exceptionToString(var17);
  184.                this.context.log(this.errorMessage);
  185.             }
  186.          }
  187.       }
  188.    }
  189.  
  190.    public void destroy() {
  191.       if (this.started) {
  192.          this.context.log("GspServlet: destroy() called.  shutting down applications");
  193.  
  194.          try {
  195.             this.appManager.destroy();
  196.          } catch (Exception var2) {
  197.             this.logger.log(var2, "during GspServlet.destroy()");
  198.          }
  199.  
  200.          this.context.log("GspServlet: stopping the logger");
  201.          this.logger.destroy();
  202.          this.context.log("GspServlet: stopping the scheduler");
  203.          this.scheduler.stop();
  204.          this.context.log("GspServlet: shutdown successful");
  205.          this.started = false;
  206.       }
  207.  
  208.    }
  209.  
  210.    public void service(HttpServletRequest var1, HttpServletResponse var2) throws IOException {
  211.       if (this.started) {
  212.          GspRequest var31 = null;
  213.          long var4 = System.currentTimeMillis();
  214.  
  215.          try {
  216.             ++this.requestCount;
  217.             String var8 = var1.getRequestURI();
  218.             if (var8.indexOf(63) != -1) {
  219.                var8 = var8.substring(0, var8.indexOf(63));
  220.             }
  221.  
  222.             String var9 = var1.getPathTranslated();
  223.             String var10 = var1.getServletPath();
  224.             var1.getPathInfo();
  225.             String var11 = var8;
  226.             if (var9 == null) {
  227.                throw new IOException("req.getPathTranslated() is null!");
  228.             }
  229.  
  230.             if (var8 == null) {
  231.                throw new IOException("uri is null!");
  232.             }
  233.  
  234.             if (File.separatorChar != '/' && var9.indexOf(var8) == -1) {
  235.                var9 = var9 + var8;
  236.             }
  237.  
  238.             if (debug) {
  239.                System.err.println("getRequestURI() = " + var8);
  240.                System.err.println("getServletPath() = " + var10);
  241.                System.err.println("getPathTranslated() = " + var9);
  242.                System.err.println("relativePath = " + var8);
  243.             }
  244.  
  245.             if (var10 != null && var8.indexOf(var10) != -1 && !var8.equals(var10)) {
  246.                var11 = var8.substring(var10.length());
  247.             }
  248.  
  249.             if (debug) {
  250.                System.err.println("relativePath = " + var11);
  251.             }
  252.  
  253.             Object var13 = null;
  254.             String var14 = null;
  255.             String var36;
  256.             if (!var9.endsWith(var11) && var9.indexOf(var11) != -1) {
  257.                int var37 = var9.lastIndexOf(var11);
  258.                var36 = var9.substring(0, var37);
  259.                var11 = var9.substring(var36.length());
  260.             } else if (var8.startsWith("/~")) {
  261.                int var15 = var8.indexOf(47, 2);
  262.                var11 = var8.substring(var15);
  263.                var14 = var8.substring(2, var15);
  264.                var36 = var9.substring(0, var9.length() - var11.length());
  265.             } else {
  266.                var36 = var9.substring(0, var9.length() - var11.length());
  267.             }
  268.  
  269.             if (debug) {
  270.                System.err.println("relativePath = " + var11);
  271.             }
  272.  
  273.             if (var11.indexOf(".gsp/") != -1) {
  274.                var11 = var11.substring(0, var11.indexOf(".gsp/") + 4);
  275.                if (debug) {
  276.                   System.err.println("relativePath = " + var11);
  277.                }
  278.             }
  279.  
  280.             if (var36.indexOf(var11) != -1) {
  281.                var36 = var36.substring(0, var36.indexOf(var11));
  282.             }
  283.  
  284.             if (debug) {
  285.                System.err.println("relativePath = " + var11);
  286.                System.err.println("docRoot = " + var36);
  287.             }
  288.  
  289.             String var38 = System.getProperty("file.separator") + System.getProperty("file.separator");
  290.             int var16 = var11.indexOf(var38);
  291.             if (var16 >= 0) {
  292.                StringBuffer var18 = new StringBuffer(var11.length());
  293.                var18.append(var11.substring(0, var16 + 1));
  294.  
  295.                while(var16 >= 0) {
  296.                   int var17 = var16;
  297.  
  298.                   do {
  299.                      ++var17;
  300.                   } while(var11.charAt(var17) == File.separatorChar);
  301.  
  302.                   var16 = var11.indexOf(System.getProperty("file.separator") + System.getProperty("file.separator"), var17 + 1);
  303.                   if (var16 >= 0) {
  304.                      var18.append(var11.substring(var17, var16 + 1));
  305.                   } else {
  306.                      var18.append(var11.substring(var17));
  307.                   }
  308.                }
  309.  
  310.                var11 = var18.toString();
  311.                if (debug) {
  312.                   System.err.println("stripped double path separators from relativePath to get " + var11);
  313.                }
  314.             }
  315.  
  316.             Application var39 = this.appManager.getApplication(var1.getRequestURI());
  317.             var31 = new GspRequest(this, var1, var39, var36, var11, var14, var4);
  318.             GspResponse var40 = new GspResponse(this, var2);
  319.             if (this.alwaysRegister) {
  320.                var1.getSession(true);
  321.             }
  322.  
  323.             var2.setContentType("text/html");
  324.             Template var19 = null;
  325.             if (!var39.handleRequest(var31, var40)) {
  326.                var19 = this.renderTemplate(var31, var40, var39, var31.getRelativePath());
  327.             }
  328.  
  329.             if (var19 != null) {
  330.                if (var19.usesPrintWriter()) {
  331.                   PrintWriter var20 = var40.getWriter();
  332.                   var20.flush();
  333.                } else {
  334.                   ServletOutputStream var41 = var40.getOutputStream();
  335.                   ((OutputStream)var41).flush();
  336.                }
  337.             }
  338.  
  339.             if (this.bench) {
  340.                long var42 = System.currentTimeMillis() - var4;
  341.                this.logger.log("GSP BENCH: " + var42);
  342.             }
  343.  
  344.             this.logger.flushExceptions(var4);
  345.          } catch (Exception var29) {
  346.             if (var31 != null) {
  347.                this.logger.log(var29, var31);
  348.             } else {
  349.                this.logger.log(var29);
  350.             }
  351.          } finally {
  352.             if (var31 != null && !this.keepUploadFile && var31.getUploadedFiles() != null) {
  353.                Enumeration var32 = var31.getUploadedFiles().elements();
  354.  
  355.                while(var32.hasMoreElements()) {
  356.                   String var34 = (String)var32.nextElement();
  357.  
  358.                   try {
  359.                      File var35 = new File(var34);
  360.                      var35.delete();
  361.                   } catch (Exception var27) {
  362.                      this.logger.log(var27, var31);
  363.                   }
  364.                }
  365.             }
  366.  
  367.             if (this.checkProperties && var4 > this.recheckProp) {
  368.                this.recheckProp = var4 + this.statInterval;
  369.                File var33 = new File(this.propFile);
  370.                if (var33.exists() && var33.lastModified() > this.propLastMod) {
  371.                   this.restartServlet(var33);
  372.                }
  373.             }
  374.  
  375.          }
  376.  
  377.       } else {
  378.          try {
  379.             var2.setContentType("text/html");
  380.             ServletOutputStream var3 = var2.getOutputStream();
  381.             var3.println("<html><head><title>GspServlet Not Started</title>");
  382.             var3.println("</head><body>");
  383.             var3.println("<h1>Error: GspServlet Not Started</h1>");
  384.             var3.println("The following error occurred while trying to start ");
  385.             var3.println("the GspServlet: ");
  386.             var3.println("<p><hr><p><pre>");
  387.             var3.println(this.errorMessage);
  388.             var3.println("</pre><p><hr><p>");
  389.             var3.println("Please consult your Servlet runtime's error logs ");
  390.             var3.println("for more information.  Fix the configuration ");
  391.             var3.println("problem, and restart the Servlet runtime.");
  392.             var3.println("</body></html>");
  393.             ((OutputStream)var3).flush();
  394.          } catch (Exception var28) {
  395.             this.context.log(Logger.exceptionToString(var28));
  396.          }
  397.       }
  398.    }
  399.  
  400.    public ServletConfig getServletConfig() {
  401.       return this.config;
  402.    }
  403.  
  404.    public Template renderTemplate(GspRequest var1, GspResponse var2, Application var3, String var4) {
  405.       Object var5 = null;
  406.  
  407.       try {
  408.          var5 = this.factory.getTemplate(var1.getDocumentRoot(), var4, var1.getUsername(), var1.getRequestTime());
  409.       } catch (Throwable var8) {
  410.          var5 = new ErrorTemplate("An internal error w/in GSP occured while trying to retrieve the template class<pre>" + Logger.exceptionToString(var8) + "</pre>");
  411.          this.logger.log(var8, "N/A");
  412.       }
  413.  
  414.       try {
  415.          ((Template)var5).render(var3, var1, var2);
  416.          return (Template)var5;
  417.       } catch (Exception var7) {
  418.          var3.handleException(var7, var1, var2);
  419.          return null;
  420.       }
  421.    }
  422.  
  423.    public Logger getLogger() {
  424.       return this.logger;
  425.    }
  426.  
  427.    public Mailer getMailer() {
  428.       return this.mailer;
  429.    }
  430.  
  431.    public Scheduler getScheduler() {
  432.       return this.scheduler;
  433.    }
  434.  
  435.    public void flushCache() {
  436.       this.factory.flushCache();
  437.    }
  438.  
  439.    public Date getStartTime() {
  440.       return this.startTime;
  441.    }
  442.  
  443.    public long getRequestCount() {
  444.       return this.requestCount;
  445.    }
  446.  
  447.    public ServletContext getServletContext() {
  448.       return this.context;
  449.    }
  450.  
  451.    public String getProperty(String var1) {
  452.       return this.properties.getProperty(var1);
  453.    }
  454.  
  455.    public String getProperty(String var1, String var2) {
  456.       return this.properties.getProperty(var1, var2);
  457.    }
  458.  
  459.    public Enumeration getPropertyNames() {
  460.       return this.properties.keys();
  461.    }
  462.  
  463.    public Object getGlobal(String var1) {
  464.       return this.globalHash.get(var1);
  465.    }
  466.  
  467.    public Object setGlobal(String var1, Object var2) {
  468.       return this.globalHash.put(var1, var2);
  469.    }
  470.  
  471.    public Object removeGlobal(String var1) {
  472.       return this.globalHash.remove(var1);
  473.    }
  474.  
  475.    public long getMaxFileSize() {
  476.       return this.maxFileSize;
  477.    }
  478.  
  479.    public String getUploadDir() {
  480.       return this.uploadDir;
  481.    }
  482.  
  483.    public long getStatInterval() {
  484.       return this.statInterval;
  485.    }
  486.  
  487.    private synchronized void restartServlet(File var1) {
  488.       if (var1.lastModified() > this.propLastMod) {
  489.          this.propLastMod = var1.lastModified();
  490.          this.context.log("GspServlet: restarting GSP to reload gsp.properties");
  491.          this.destroy();
  492.          this.init(this.config);
  493.          this.context.log("GspServlet: restart successful");
  494.       }
  495.  
  496.    }
  497. }
  498.