01: /*
02: * argun 1.0
03: * Web 2.0 delivery framework
04: * Copyright (C) 2007 Hammurapi Group
05: *
06: * This program is free software; you can redistribute it and/or
07: * modify it under the terms of the GNU Lesser General Public
08: * License as published by the Free Software Foundation; either
09: * version 2 of the License, or (at your option) any later version.
10: *
11: * This program is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * Lesser General Public License for more details.
15: *
16: * You should have received a copy of the GNU Lesser General Public
17: * License along with this library; if not, write to the Free Software
18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19: *
20: * URL: http://www.hammurapi.biz
21: * e-Mail: support@hammurapi.biz
22: */
23: package biz.hammurapi.web.eval;
24:
25: import java.io.ByteArrayOutputStream;
26: import java.io.IOException;
27: import java.io.PrintStream;
28: import java.util.Iterator;
29: import java.util.Map;
30:
31: import biz.hammurapi.web.HammurapiWebException;
32: import bsh.EvalError;
33: import bsh.Interpreter;
34: import bsh.TargetError;
35:
36: /**
37: * Inteprets Java code using BeanShell.
38: * @author Pavel
39: */
40: public class BeanShellEvaluator implements Evaluator {
41:
42: public EvaluationResult evaluate(String source, String sourceName,
43: Map context, ClassLoader classLoader)
44: throws HammurapiWebException {
45: try {
46: Interpreter interpreter = new Interpreter();
47: if (context != null) {
48: Iterator it = context.entrySet().iterator();
49: while (it.hasNext()) {
50: Map.Entry entry = (Map.Entry) it.next();
51: interpreter.set(entry.getKey().toString(), entry
52: .getValue());
53: }
54: }
55: if (classLoader != null) {
56: interpreter.setClassLoader(classLoader);
57: }
58: ByteArrayOutputStream baos = new ByteArrayOutputStream();
59: PrintStream out = new PrintStream(baos);
60: interpreter.setOut(out);
61: interpreter.setErr(out);
62: final Object result = interpreter.eval(source);
63: baos.close();
64: byte[] bytes = baos.toByteArray();
65: final String output = bytes.length == 0 ? "" : new String(
66: bytes);
67: return new EvaluationResult() {
68:
69: public String getOutput() {
70: return output;
71: }
72:
73: public Object getResult() {
74: return result;
75: }
76:
77: };
78: } catch (EvalError e) {
79: String msg = "Evaluation of " + sourceName + " failed: "
80: + e;
81: if (e instanceof TargetError) {
82: Throwable rc = ((TargetError) e).getTarget();
83: while (rc.getCause() != null && rc.getCause() != rc) {
84: rc = rc.getCause();
85: }
86: msg += "\nRoot cause: " + rc;
87: }
88: throw new HammurapiWebException(msg, e);
89: } catch (IOException e) {
90: throw new HammurapiWebException(
91: "Should never happen: " + e, e);
92: }
93: }
94:
95: }
|