ExpressionServlet.java :  » Scripting » InstantJ » instantj » j2ee » Java Open Source

Java Open Source » Scripting » InstantJ 
InstantJ » instantj » j2ee » ExpressionServlet.java
/**
 * InstantJ
 * 
 * Copyright (C) 2002 Nils Meier
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 */
package instantj.j2ee;

import instantj.compile.CompilationFailedException;
import instantj.expression.EvaluationFailedException;
import instantj.expression.Expression;
import instantj.reflect.IllegalPropertyException;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * A <b>simple</b> Servlet that allows expressions to be executed. 
 * Warning: Any user accessing this Servlet can perform functions
 * on your server that you might not appreciate. This is a proof
 * of concept only!
 */
public class ExpressionServlet extends HttpServlet {
  
  private static final String TYPES[] = {
    String.class.getName(),
    Boolean.class.getName(),
    Integer.class.getName(),
    Date.class.getName(),
    Boolean.TYPE.getName(),
    Integer.TYPE.getName(),
  };

  /** some predefined sample expressions */
  public final static String[][] SAMPLES = new String[][] {  
    { "\"Hello World\"" },
    { "\"It is \" + new java.util.Date() + \" ... too late!\""  } ,
    { "\"PI equals \" + Math.PI " },
    { "2 * Math.PI * radius", "radius", "int", "16" },
    { "birthday ? \"Turning \" +(new Date().getYear()-date.getYear())+ \" today? \" + hurray + \" times Hurray!!!\" : \"*sigh*\"",
      "birthday", "boolean", "true", "date", "java.util.Date", "1970/05/25", "hurray", "java.lang.Integer", "3"}
  };
  
  /**
   * @see HttpServlet#doGet(HttpServletRequest, HttpServletResponse)
   */
  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

    res.setContentType("text/html");
    PrintWriter out = new PrintWriter(res.getOutputStream());
    
    // The header and stuff    
    generateHeader(out);
    
    // The body
    generateBody(out,req);
    
    // The footer and stuff
    generateFooter(out);

    // Done    
    out.flush();
    out.close();
  }

  /**
   * Generates the Header
   */  
  private void generateHeader(PrintWriter out) {
    out.println("<html><body>");
    out.println("<h1>InstantJ - Expression Servlet</h1>");
  }
  
  /**
   * Generates the Footer
   */  
  private void generateFooter(PrintWriter out) {
    out.println("<p align=right><a href=\"http://instantj.sourceforge.net\">InstantJ @ Sourceforge</a></p>");
    out.println("</body></html>");
  }
  
  /**
   * Helper that returns a value
   */
  private String getValue(HttpServletRequest req, String name) {
    String result = req.getParameter(name); 
    if (result==null)
      result = "";
    return result;
  }
  
  /**
   * Helper that checks for given value
   */
  private boolean isValue(HttpServletRequest req, String name) {
    return getValue(req,name).length()>0;
  }
  
  /**
   * Helper that checks for given value
   */
  private boolean isValue(HttpServletRequest req, String name, int value) {
    try {
      return Integer.parseInt(getValue(req,name)) == value;
    } catch (NumberFormatException nfe) {
      return false;
    }
  }
  
  /**
   * Generates a URL
   */
  private void outURL(PrintWriter out, String name, Map parameters) {
    out.print("<a href=\"?");
    
    Iterator it = parameters.keySet().iterator();
    while (it.hasNext()) {
      Object key = it.next();
      out.print(key);
      out.print("=");
      // this is how it would look for 1.4 
      //  try {
      //    out.print(URLEncoder.encode(parameters.get(key).toString(),"UTF-8"));
      //  } catch (UnsupportedEncodingException e) { }
      out.print(URLEncoder.encode(parameters.get(key).toString()));
      if (it.hasNext()) out.print('&');
    }
    out.print("\">");
    out.print(name);
    out.println("</a>");
    
  }

  /**
   * Helper that translates given String into valid HTML FORM text
   */
  private String formalize(String s) {
    
    StringBuffer result = new StringBuffer(s.length()*2);
    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      switch (c) {
        case '\"' : 
          result.append("&quot;");
          break;
        default :
          result.append(c);
      }
    }
    return result.toString();
  }
   
  /**
   * Generates a textbox
   */
  private void outTextBox(PrintWriter out, String prefix, String name, String value) {
    out.print(prefix);
    out.print("<input type=\"text\" name=\"");
    out.print(name);
    out.print("\" value=\"");
    out.print(formalize(value));
    out.println("\"></input>");
  }

  /**
   * Generates a button
   */
  private void outButton(PrintWriter out, String text) {
    out.print(" <input type=\"submit\" value=\"");
    out.print(text);
    out.println("\"></input>");
  }
  
  /**
   * Generates a combobox
   */
  private void outDropBox(PrintWriter out, String prefix, String name, String[] values, String selection) {
    
    out.print(prefix);
    out.print("<select name=\"");
    out.print(name);
    out.print("\"> ");
    for (int t=0;t<values.length;t++) {
      boolean selected = values[t].equals(selection);
      out.print(" <option value=\"");
      out.print(formalize(values[t]));
      out.print("\" ");
      if (selected) out.print("SELECTED");
      out.print(">");
      out.print(values[t]);
      out.print("</option>");
    }
    out.println(" </select>,");
  }
  
  /**
   * Generates the Body
   */  
  private void generateBody(PrintWriter out, HttpServletRequest req) {

    // The preselection section
    out.println("<blockquote>");
    out.println("Good expressions are:<br>");
    for (int i = 0; i < SAMPLES.length; i++) {
      Map parms = new HashMap();
      String body = SAMPLES[i][0];
      parms.put("body", body);
      for (int p=0;p<SAMPLES[i].length/3;p++) {
        parms.put("parm."+p+".name" , SAMPLES[i][1+p*3+0]);
        parms.put("parm."+p+".type" , SAMPLES[i][1+p*3+1]);
        parms.put("parm."+p+".value", SAMPLES[i][1+p*3+2]);
      }
      if (body.length()>72) body=body.substring(0,72) + "...";
      outURL(out, body,parms);
      out.println("<br>");
    }
    out.println("</blockquote>");

    // The enter expression section
    out.println("<form>");

    out.println("<blockquote>");
    out.println("Please enter a Java expression here:<br>");
    outTextBox (out, " body=", "body", getValue(req,"body"));
    outButton  (out, "Evaluate");
    out.println("</blockquote>");
    
    // The enter parameters section
    out.println("<blockquote>");
    out.println("and enter (optional) parameters here (no quotes):<br>");
    
    for (int i=0;i<3;i++) {
      String 
        p_name = "parm."+i+".name",
        p_type = "parm."+i+".type",
        p_value= "parm."+i+".value";

      outTextBox (out, "name=", p_name, getValue(req,p_name));
      outDropBox (out, "type=", p_type, TYPES, getValue(req,p_type));
      outTextBox (out, "value=",p_value, getValue(req,p_value));
              
      out.println("<br>");
    }    
    out.println("</blockquote>");
    
    out.println("</form>");
    
    // The result from last expression
    if (isValue(req,"body")) {
      out.println("<blockquote>");
      out.println("Evaluation resulted in:<br>");
      evaluate(out,req);
      out.println("</blockquote>");
    }
   
    // Done 
  }
  
  /**
   * Evaluates an expression
   */
  private void evaluate(PrintWriter out, HttpServletRequest req) {
    
    try {
      String body = getValue(req,"body");
      
      Map parms = new HashMap();
      Map values= new HashMap();
      for (int i=0;;i++) {
        String name = getValue(req, "parm."+i+".name" );
        if (name.length()==0) break;
        String type = getValue(req, "parm."+i+".type" );
        String value= getValue(req, "parm."+i+".value");
        parms .put(name, type);
        values.put(name, value);
      }    
      
      Object result = new Expression(body,parms).getInstance(values).evaluate();
      
      out.println("<b>"+result+"</b>");
      
    } catch(IllegalPropertyException e) {
      out.println("<b>Setting parameters failed because of "+e.getMessage()+"</b>");
      out.println("<font size=\"1\"><pre>");
      e.printStackTrace(out);
      out.println("</pre></font>");
    } catch(EvaluationFailedException e) {
      out.println("<b>Evaluation failed because of "+e.getMessage()+"</b>");
      out.println("<font size=\"1\"><pre>");
      e.printStackTrace(out);
      out.println("</pre></font>");
    } catch(CompilationFailedException e) {
      out.println("<b>Compilation failed because of "+e.getMessage()+"</b>");
      out.println("<font color=\"red\"><pre>");
      e.printErrors(out);
      out.println("</pre></font>");
      out.println("<font size=\"1\"><pre>");
      e.printStackTrace(out);
      out.println("</pre></font>");
    }
  }  
  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.