KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > bsf > engines > jpython > JPythonEngine


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.jpython;
57
58 import java.util.Vector JavaDoc;
59
60 import org.python.util.*;
61 import org.python.core.*;
62
63 import org.apache.bsf.*;
64 import org.apache.bsf.util.BSFEngineImpl;
65 import org.apache.bsf.util.BSFFunctions;
66
67 /**
68  * This is the interface to JPython (http://www.jpython.org/) from BSF.
69  *
70  * @author Sanjiva Weerawarana
71  * @author Finn Bock <bckfnn@worldonline.dk>
72  */

73
74 public class JPythonEngine extends BSFEngineImpl {
75   PythonInterpreter interp;
76
77   /**
78    * call the named method of the given object.
79    */

80   public Object JavaDoc call (Object JavaDoc object, String JavaDoc method, Object JavaDoc[] args)
81                                                         throws BSFException {
82     
83     PyObject[] pyargs = Py.EmptyObjects;
84     if (args != null) {
85       pyargs = new PyObject[args.length];
86       for (int i = 0; i < pyargs.length; i++)
87         pyargs[i] = Py.java2py(args[i]);
88     }
89
90     if (object != null) {
91       PyObject o = Py.java2py(object);
92       return unwrap(o.invoke(method, pyargs));
93     }
94     PyObject m = interp.get(method);
95     if (m == null)
96         m = interp.eval(method);
97     if (m != null) {
98     return unwrap(m.__call__(pyargs));
99     }
100     return null;
101   }
102   /**
103    * Declare a bean
104    */

105   public void declareBean (BSFDeclaredBean bean) throws BSFException {
106     interp.set (bean.name, bean.bean);
107   }
108   /**
109    * Evaluate an expression.
110    */

111   public Object JavaDoc eval (String JavaDoc source, int lineNo, int columnNo,
112               Object JavaDoc script) throws BSFException {
113     try {
114       Object JavaDoc result = interp.eval (script.toString ());
115       if (result != null && result instanceof PyJavaInstance)
116         result = ((PyJavaInstance)result).__tojava__(Object JavaDoc.class);
117       return result;
118     } catch (PyException e) {
119       e.printStackTrace ();
120       throw new BSFException (BSFException.REASON_EXECUTION_ERROR,
121                   "exception from JPython: " + e, e);
122     }
123   }
124   /**
125    * Execute a script.
126    */

127   public void exec (String JavaDoc source, int lineNo, int columnNo,
128             Object JavaDoc script) throws BSFException {
129     try {
130       interp.exec (script.toString ());
131     } catch (PyException e) {
132       e.printStackTrace ();
133       throw new BSFException (BSFException.REASON_EXECUTION_ERROR,
134                   "exception from JPython: " + e, e);
135     }
136   }
137   /**
138    * Initialize the engine.
139    */

140   public void initialize (BSFManager mgr, String JavaDoc lang,
141                           Vector JavaDoc declaredBeans) throws BSFException {
142     super.initialize (mgr, lang, declaredBeans);
143
144     // create an interpreter
145
interp = new PythonInterpreter ();
146
147     // register the mgr with object name "bsf"
148
interp.set ("bsf", new BSFFunctions (mgr, this));
149
150     int size = declaredBeans.size ();
151     for (int i = 0; i < size; i++) {
152       declareBean ((BSFDeclaredBean) declaredBeans.elementAt (i));
153     }
154   }
155
156   /**
157    * Undeclare a previously declared bean.
158    */

159   public void undeclareBean (BSFDeclaredBean bean) throws BSFException {
160     interp.set (bean.name, null);
161   }
162   public Object JavaDoc unwrap(PyObject result) {
163     if (result != null) {
164        Object JavaDoc ret = result.__tojava__(Object JavaDoc.class);
165        if (ret != Py.NoConversion)
166           return ret;
167     }
168     return result;
169   }
170 }
171
Popular Tags