001: /*
002: * @(#) PnutsBSFEngine.java 1.5 00/08/01
003: *
004: * Copyright (c) 1997-1999 Sun Microsystems, Inc. All Rights Reserved.
005: *
006: * See the file "license.txt" for information on usage and redistribution
007: * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
008: */
009: package pnuts.ext;
010:
011: import org.apache.bsf.BSFDeclaredBean;
012: import org.apache.bsf.BSFException;
013: import org.apache.bsf.util.BSFEngineImpl;
014: import pnuts.compiler.DynamicRuntime;
015: import pnuts.lang.Context;
016: import pnuts.lang.Package;
017: import pnuts.lang.Pnuts;
018: import pnuts.lang.PnutsException;
019: import pnuts.lang.PnutsFunction;
020:
021: /**
022: * This is the interface to Pnuts from Bean Scripting Framework.
023: *
024: * @see <a href="../../../doc/bsf.html">Pnuts User's Guide</a>
025: * @see com.ibm.bsf.BSFEngine
026: * @see pnuts.lang.Package
027: * @see pnuts.lang.Context
028: */
029: public class PnutsBSFEngine extends BSFEngineImpl {
030:
031: private Context context;
032: private Package pkg;
033:
034: public PnutsBSFEngine() {
035: pkg = new Package();
036: context = new Context(pkg);
037: context.setPnutsImpl(new CachedPnutsImpl());
038: }
039:
040: /**
041: * This is used by an application to evaluate an expression. The
042: * expression may be string or some other type, depending on the
043: * language. (For example, for BML it'll be an org.w3c.dom.Element
044: * object.)
045: *
046: * @param source (context info) the source of this expression
047: * (e.g., filename)
048: * @param lineNo (context info) the line number in source for expr
049: * @param columnNo (context info) the column number in source for expr
050: * @param expr the expression to evaluate
051: *
052: * @throws BSFException if anything goes wrong while eval'ing a
053: * BSFException is thrown. The reason indicates the problem.
054: */
055: public Object eval(String source, int lineNo, int columnNo,
056: Object script) throws BSFException {
057: try {
058: return Pnuts.eval((String) script, context);
059: } catch (PnutsException e) {
060: throw new BSFException(BSFException.REASON_EXECUTION_ERROR,
061: e.getMessage(), e.getThrowable());
062: }
063: }
064:
065: /**
066: * This is used by an application to call into the scripting engine
067: * to make a function/method call. The "object" argument is the object
068: * whose method is to be called, if that applies. For non-OO languages,
069: * this is typically ignored and should be given as null. For pretend-OO
070: * languages such as VB, this would be the (String) name of the object.
071: * The arguments are given in the args array.
072: *
073: * @param object object on which to make the call
074: * @param name name of the method / procedure to call
075: * @param args the arguments to be given to the procedure
076: *
077: * @throws BSFException if anything goes wrong while eval'ing a
078: * BSFException is thrown. The reason indicates the problem.
079: */
080: public Object call(Object object, String method, Object[] args)
081: throws BSFException {
082: try {
083: if (object == null) {
084: return PnutsFunction.call(method, args, context);
085: } else {
086: return DynamicRuntime.callMethod(context, object
087: .getClass(), method, args, null, object);
088: }
089: } catch (PnutsException e) {
090: throw new BSFException(BSFException.REASON_EXECUTION_ERROR,
091: e.getMessage(), e.getThrowable());
092: }
093: }
094:
095: /**
096: * Declare a bean
097: */
098: public void declareBean(BSFDeclaredBean bean) throws BSFException {
099: pkg.set(bean.name.intern(), bean.bean, context);
100: }
101:
102: /**
103: * Undeclare a previously declared bean.
104: */
105: public void undeclareBean(BSFDeclaredBean bean) throws BSFException {
106: pkg.clear(bean.name.intern(), context);
107: }
108: }
|