01: package pygmy.handlers.bsf;
02:
03: import pygmy.core.*;
04:
05: import java.io.*;
06: import java.net.HttpURLConnection;
07: import java.util.StringTokenizer;
08:
09: import org.apache.bsf.BSFManager;
10: import org.apache.bsf.BSFException;
11:
12: public class BsfScriptingHandler extends AbstractHandler {
13:
14: private static final ConfigOption SCRIPT_DIR_OPTION = new ConfigOption(
15: "script-dir", true,
16: "Directory path to scripts for the BSF interpreter.");
17: private static final ConfigOption LANGUAGE_OPTION = new ConfigOption(
18: "languages", true,
19: "A comma seperated list of languages to register with the BSF.");
20: private static final ConfigOption CLASSNAME_OPTION = new ConfigOption(
21: "classname", true, "Class name of a bsf interpreter.");
22: private static final ConfigOption FILE_EXTS_OPTION = new ConfigOption(
23: "file-exts", true,
24: "A comma seperated list of file extensions associated with this language.");
25:
26: private BSFManager manager;
27: private String scriptDir;
28:
29: public boolean initialize(String handlerName, Server server) {
30: super .initialize(handlerName, server);
31: registerLanguages();
32: manager = new BSFManager();
33: scriptDir = SCRIPT_DIR_OPTION.getProperty(server, handlerName);
34: return true;
35: }
36:
37: private void registerLanguages() {
38: StringTokenizer tokenizer = new StringTokenizer(LANGUAGE_OPTION
39: .getProperty(server, handlerName), ",");
40: while (tokenizer.hasMoreTokens()) {
41: String language = tokenizer.nextToken();
42: if (!BSFManager.isLanguageRegistered(language)) {
43: String classname = CLASSNAME_OPTION.getProperty(server,
44: handlerName + "." + language);
45: String fileExts = FILE_EXTS_OPTION.getProperty(server,
46: handlerName + "." + language);
47: BSFManager.registerScriptingEngine(language, classname,
48: fileExts.split(","));
49: }
50: }
51: }
52:
53: protected boolean handleBody(HttpRequest request,
54: HttpResponse response) throws IOException {
55: try {
56: File scriptFile = Http.translatePath(scriptDir, request
57: .getUrl().substring(getUrlPrefix().length()));
58: String language = BSFManager.getLangFromFilename(scriptFile
59: .getName());
60: return executeScript(language, scriptFile, request,
61: response);
62: } catch (BSFException e) {
63: return false;
64: }
65: }
66:
67: private boolean executeScript(String language, File scriptFile,
68: HttpRequest request, HttpResponse response)
69: throws IOException {
70: try {
71: manager.declareBean("request", request, request.getClass());
72: manager.declareBean("response", response, response
73: .getClass());
74: manager.exec(language, scriptFile.getPath(), 0, 0,
75: fetchScript(scriptFile));
76: } catch (BSFException e) {
77: response.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR, e
78: .getMessage(), e);
79: }
80: return true;
81: }
82:
83: private StringBuffer fetchScript(File scriptFile)
84: throws IOException {
85: Reader reader = new BufferedReader(new FileReader(scriptFile));
86: try {
87: StringBuffer buffer = new StringBuffer();
88: char[] buf = new char[1024];
89: int length = 0;
90: while (length >= 0) {
91: length = reader.read(buf);
92: buffer.append(buf, 0, length);
93: }
94: return buffer;
95: } finally {
96: reader.close();
97: }
98: }
99: }
|