01: /*
02: * Copyright 2004,2004 The Apache Software Foundation.
03: *
04: * Licensed under the Apache License, Version 2.0 (the "License");
05: * you may not use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.apache.org/licenses/LICENSE-2.0
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License.
15: */
16:
17: package org.apache.bsf.util;
18:
19: import org.apache.bsf.BSFEngine;
20: import org.apache.bsf.BSFException;
21: import org.apache.bsf.BSFManager;
22: import org.apache.bsf.util.event.EventProcessor;
23:
24: /**
25: * This is used to support binding scripts to be run when an event
26: * occurs.
27: *
28: * @author Sanjiva Weerawarana
29: */
30: public class BSFEventProcessor implements EventProcessor {
31: BSFEngine engine;
32: BSFManager manager;
33: String filter;
34: String source;
35: int lineNo;
36: int columnNo;
37: Object script;
38:
39: /**
40: * Package-protected constructor makes this class unavailable for
41: * public use.
42: */
43: BSFEventProcessor(BSFEngine engine, BSFManager manager,
44: String filter, String source, int lineNo, int columnNo,
45: Object script) throws BSFException {
46: this .engine = engine;
47: this .manager = manager;
48: this .filter = filter;
49: this .source = source;
50: this .lineNo = lineNo;
51: this .columnNo = columnNo;
52: this .script = script;
53: }
54:
55: //////////////////////////////////////////////////////////////////////////
56: //
57: // event is delegated to me by the adapters using this. inFilter is
58: // in general the name of the method via which the event was received
59: // at the adapter. For prop/veto change events, inFilter is the name
60: // of the property. In any case, in the event processor, I only forward
61: // those events if for which the filters match (if one is specified).
62:
63: public void processEvent(String inFilter, Object[] evtInfo) {
64: try {
65: processExceptionableEvent(inFilter, evtInfo);
66: } catch (RuntimeException re) {
67: // rethrow this .. I don't want to intercept run-time stuff
68: // that can in fact occur legit
69: throw re;
70: } catch (Exception e) {
71: // should not occur
72: System.err
73: .println("BSFError: non-exceptionable event delivery "
74: + "threw exception (that's not nice): " + e);
75: e.printStackTrace();
76: }
77: }
78:
79: //////////////////////////////////////////////////////////////////////////
80: //
81: // same as above, but used when the method event method may generate
82: // an exception which must go all the way back to the source (as in
83: // the vetoableChange case)
84:
85: public void processExceptionableEvent(String inFilter,
86: Object[] evtInfo) throws Exception {
87: if ((filter != null) && !filter.equals(inFilter)) {
88: // ignore this event
89: return;
90: }
91:
92: // run the script
93: engine.exec(source, lineNo, columnNo, script);
94: }
95: }
|