KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > bsf > engines > jacl > JaclEngine


1 /*
2  * The Apache Software License, Version 1.1
3  *
4  * Copyright (c) 2002 The Apache Software Foundation. All rights
5  * reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in
16  * the documentation and/or other materials provided with the
17  * distribution.
18  *
19  * 3. The end-user documentation included with the redistribution, if
20  * any, must include the following acknowlegement:
21  * "This product includes software developed by the
22  * Apache Software Foundation (http://www.apache.org/)."
23  * Alternately, this acknowlegement may appear in the software itself,
24  * if and wherever such third-party acknowlegements normally appear.
25  *
26  * 4. The names "Apache BSF", "Apache", and "Apache Software Foundation"
27  * must not be used to endorse or promote products derived from
28  * this software without prior written permission. For written
29  * permission, please contact apache@apache.org.
30  *
31  * 5. Products derived from this software may not be called "Apache"
32  * nor may "Apache" appear in their names without prior written
33  * permission of the Apache Group.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many individuals
50  * on behalf of the Apache Software Foundation and was originally created by
51  * Sanjiva Weerawarana and others at International Business Machines
52  * Corporation. For more information on the Apache Software Foundation,
53  * please see <http://www.apache.org/>.
54  */

55
56 package org.apache.bsf.engines.jacl;
57
58 import java.util.*;
59 import java.io.*;
60
61 import tcl.lang.*;
62
63 import org.apache.bsf.*;
64 import org.apache.bsf.util.*;
65
66 /**
67  * This is the interface to Scriptics's Jacl (Tcl) from the
68  * Bean Scripting Framework.
69  * <p>
70  *
71  * @author Sanjiva Weerawarana
72  */

73
74 public class JaclEngine extends BSFEngineImpl {
75   /* the Jacl interpretor object */
76   private Interp interp;
77
78   /**
79    *
80    * @param method The name of the method to call.
81    * @param args an array of arguments to be
82    * passed to the extension, which may be either
83    * Vectors of Nodes, or Strings.
84    */

85   public Object JavaDoc call (Object JavaDoc obj, String JavaDoc method, Object JavaDoc[] args)
86                                                         throws BSFException {
87     StringBuffer JavaDoc tclScript = new StringBuffer JavaDoc (method);
88     if (args != null) {
89       for( int i = 0 ; i < args.length ; i++ ) {
90     tclScript.append (" ");
91     tclScript.append (args[i].toString ());
92       }
93     }
94     return eval ("<function call>", 0, 0, tclScript.toString ());
95   }
96   /**
97    * Declare a bean
98    */

99   public void declareBean (BSFDeclaredBean bean) throws BSFException {
100     String JavaDoc expr = "set " + bean.name + " [bsf lookupBean \"" + bean.name +
101       "\"]";
102     eval ("<declare bean>", 0, 0, expr);
103   }
104   /**
105    * This is used by an application to evaluate a string containing
106    * some expression.
107    */

108   public Object JavaDoc eval (String JavaDoc source, int lineNo, int columnNo,
109               Object JavaDoc oscript) throws BSFException {
110     String JavaDoc script = oscript.toString ();
111     try {
112       interp.eval (script);
113       TclObject result = interp.getResult();
114       Object JavaDoc internalRep = result.getInternalRep();
115
116       // if the object has a corresponding Java type, unwrap it
117
if (internalRep instanceof ReflectObject)
118         return ReflectObject.get(interp,result);
119       if (internalRep instanceof TclString)
120         return result.toString();
121       if (internalRep instanceof TclDouble)
122         return new Double JavaDoc(TclDouble.get(interp,result));
123       if (internalRep instanceof TclInteger)
124         return new Integer JavaDoc(TclInteger.get(interp,result));
125
126       return result;
127     } catch (TclException e) {
128       throw new BSFException (BSFException.REASON_EXECUTION_ERROR,
129                   "error while eval'ing Jacl expression: " +
130                   interp.getResult (), e);
131     }
132   }
133   /**
134    * Initialize the engine.
135    */

136   public void initialize (BSFManager mgr, String JavaDoc lang,
137               Vector declaredBeans) throws BSFException {
138     super.initialize (mgr, lang, declaredBeans);
139
140     // create interpreter
141
interp = new Interp();
142
143     // register the extension that user's can use to get at objects
144
// registered by the app
145
interp.createCommand ("bsf", new BSFCommand (mgr, this));
146
147     // Make java functions be available to Jacl
148
try {
149         interp.eval("jaclloadjava");
150     } catch (TclException e) {
151         throw new BSFException (BSFException.REASON_OTHER_ERROR,
152                     "error while loading java package: " +
153                     interp.getResult (), e);
154     }
155
156     int size = declaredBeans.size ();
157     for (int i = 0; i < size; i++) {
158       declareBean ((BSFDeclaredBean) declaredBeans.elementAt (i));
159     }
160   }
161
162   /**
163    * Undeclare a previously declared bean.
164    */

165   public void undeclareBean (BSFDeclaredBean bean) throws BSFException {
166     eval ("<undeclare bean>", 0, 0, "set " + bean.name + " \"\"");
167   }
168 }
169
Popular Tags