/**
* 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(""");
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>");
}
}
}
|