1
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
4
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5
<meta name="Generator" content="Microsoft Word 97">
6
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
7
<title>Embedding �Scripting Host� in Business Applications</title>
10
<b><font face="Arial"><font size=-1>Embedding
11
�Scripting Host� in Business Applications</font></font></b>
12
<p><b><font face="Arial"><font size=-1>Madhukumar Seshadri, <a href="http://www.cognizant.com)/">www.cognizant.com</a></font></font></b>
15
<p><font face="Arial"><font size=-1>With web browsers, continuing to rule
16
the human interface for applications, creating value by being ubiquitous,
17
few adoptions of rich technology that�s getting brewed underneath, will
18
help designing business applications even though most of the current ones
19
are made with bird�s eye of the underlying technologies.</font></font>
20
<p><font face="Arial"><font size=-1>JavaScript is a scripting language
21
invented and developed by Netscape. The language was primarily designed
22
for creating lightweight programming for web browser extensions by exposing
23
the Document Object Model of an HTML page to the scripts. JavaScript is
24
becoming object oriented and getting adopted for server-side scripting.</font></font>
25
<p><font face="Arial"><font size=-1>JavaScript is also becoming a standard
26
in the scripting world as Netscape is working closely with ECMA (European
27
Computer Manufacturers Association) to make it as a standard scripting
28
language for the script world. The standards are published as ECMA Script.</font></font>
29
<p><font face="Arial"><font size=-1>JavaScript originally designed for
30
exposing the DOM (Document Object Model) standardized by World Wide Web
31
consortium (W3C), to help web page designers to control and manipulate
32
the pages dynamically. �JavaScript� engines were embedded in the browsers
33
and they execute those portions of the code embedded in the HTML pages.</font></font>
34
<p><font face="Arial"><font size=-1>In short, JavaScript engine embedded
35
in the browser allowed extensions or manipulations for DOM Object run time
36
for the HTML page by executing the �scripts� associated with them. In other
37
words, browser exposes its DOM object for the page to scripts for extensions
38
and dynamic manipulations of the same, using a language that the script
39
interpreter understands.</font></font>
40
<p><font face="Arial"><font size=-1>Can I do the same for my application
41
by exposing my custom business objects written in my middle-tier? Can I
42
allow user to my write JavaScript extensions for my objects and also be
43
host for executing those scripts?</font></font>
44
<p><font face="Arial"><font size=-1>JavaScript host runs times are available
45
as binaries written in major languages. Check out <a href="http://www.mozilla.org/js">www.mozilla.org/js</a>.
46
Spider Monkey and Rhino are open source JavaScripting engines available
47
from mozilla.</font></font>
48
<p><font face="Arial"><font size=-1>Microsoft implementation of ECMA Script
49
(ECMA Script is based on core JavaScript, created by Netscape) is called
50
JScript. Microsoft binaries of jscript engine can be downloaded from http://msdn.microsoft.com/scripting/.</font></font>
51
<p><font face="Arial"><font size=-1>This document doesn�t explain the JavaScript
52
language in detail but explains how these scripting engines can be used
53
as host to expose business objects in the middle-tier and how the user
54
of these applications can extend it if needed using JavaScript.</font></font>
55
<p><font face="Arial"><font size=-1>The scripting engine Rhino (<a href="http://www.mozilla.org/js)">www.mozilla.org/rhino)</a>,
56
a javascript engine purely written in Java is one that I am going to use
57
for the testing the above.</font></font>
58
<p><font face="Arial"><font size=-1>Let us set some simple goals,</font></font>
61
<font face="Arial"><font size=-1>Execute a plain �JavaScript� code and
62
use static Java object</font></font></li>
65
<font face="Arial"><font size=-1>Instantiate external objects (written
66
in Java) from the script and use them within the script</font></font></li>
71
<p><font face="Arial"><font size=-1>Let us write a simple Javscript to
72
test the above set goals,</font></font>
73
<p><font face="Arial"><font size=-1><b>Fig 1</b> � jshosttest.js</font></font>
74
<p><b><i><font face="Arial"><font size=-1>/* Test 1 */</font></font></i></b>
75
<br><b><i><font face="Arial"><font size=-1>/* Use a static Java Object
76
in the script */</font></font></i></b>
77
<p><font face="Arial"><font size=-1>function test1() {</font></font>
78
<br><font face="Arial"><font size=-1> var str;</font></font>
79
<br><font face="Arial"><font size=-1> str = '"Hello World";</font></font>
80
<br><font face="Arial"><font size=-1> return str;</font></font>
81
<br><font face="Arial"><font size=-1>}</font></font>
82
<p><font face="Arial"><font size=-1>var str = test1( );</font></font>
83
<br><font face="Arial"><font size=-1>//out is expected to be Java Object
84
exposed to the script scope</font></font>
85
<br><font face="Arial"><font size=-1>out.println ("JavaScript - Test 1
86
- " + str);</font></font>
87
<p><b><i><font face="Arial"><font size=-1>/* Test 2 */</font></font></i></b>
88
<p><b><i><font face="Arial"><font size=-1>/* Instantiate a Javaobject for
89
this scope and use it */</font></font></i></b>
90
<p><font face="Arial"><font size=-1>function test2(){</font></font>
91
<br><font face="Arial"><font size=-1> // create a Java
92
string buffer object from JavaScript and use its java instance</font></font>
93
<br><font face="Arial"><font size=-1> // This uses an
94
another Java object created for creating new objects within Java and</font></font>
95
<br><font face="Arial"><font size=-1> // brings the same
96
for JavaScript execution scope</font></font>
97
<br><font face="Arial"><font size=-1> // Refer _create.java
98
for more information</font></font>
99
<br><font face="Arial"><font size=-1> create.getInstance("java.lang.StringBuffer","buffer");</font></font>
100
<br><font face="Arial"><font size=-1> //JavaScript refers
101
the java object instance as �buffer�</font></font>
102
<br><font face="Arial"><font size=-1> out.println(buffer.toString());</font></font>
103
<br> <font face="Arial"><font size=-1>buffer.append("I
104
am a javaobject dynamically created and executed in JavaScript");</font></font>
105
<br> <font face="Arial"><font size=-1>return buffer.toString();</font></font>
106
<br><font face="Arial"><font size=-1>}</font></font>
107
<p><font face="Arial"><font size=-1>var str = test2();</font></font>
108
<br><font face="Arial"><font size=-1>out.println("From JavaScript - Test
109
2 " + str);</font></font>
110
<p><font face="Arial"><font size=-1>Let us write a simple Javahost Object
111
using the Rhino engine to execute the above script,</font></font>
112
<p><b><font face="Arial"><font size=-1>Fig 2.1 - JSHost.java</font></font></b>
113
<p><font face="Arial"><font size=-1>/**</font></font>
114
<br><font face="Arial"><font size=-1>* @author Madhukumar Seshadri</font></font>
115
<br><font face="Arial"><font size=-1>* @version</font></font>
116
<br><font face="Arial"><font size=-1>*/</font></font>
117
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
118
<br><font face="Arial"><font size=-1>import java.io.*;</font></font>
119
<br><font face="Arial"><font size=-1>import java.lang.*;</font></font>
120
<br><i><font face="Arial"><font size=-1>// import com.xxx.xxx.*;</font></font></i>
121
<p><font face="Arial"><font size=-1>public class JSHost extends Object
123
<br><font face="Arial"><font size=-1> /** Creates new
124
JSHost */</font></font>
125
<br><font face="Arial"><font size=-1> public JSHost()
127
<br><font face="Arial"><font size=-1> }</font></font>
128
<p><i><font face="Arial"><font size=-1> /*** Executes
129
.js file ***/</font></font></i>
130
<br><font face="Arial"><font size=-1> public Object executeJS
131
(String jsfname){</font></font>
132
<br><font face="Arial"><font size=-1> //You can also
133
use evaluateReader</font></font>
134
<br><font face="Arial"><font size=-1> File fp = new File(jsfname);</font></font>
135
<br><font face="Arial"><font size=-1> String str_buff
137
<br><font face="Arial"><font size=-1> try {</font></font>
138
<br><font face="Arial"><font size=-1>
139
FileReader fr = new FileReader(jsfname);</font></font>
140
<br><font face="Arial"><font size=-1>
141
int length = (int) fp.length();</font></font>
142
<br><font face="Arial"><font size=-1>
143
char cbuff[] = new char[(char)length];</font></font>
144
<br><font face="Arial"><font size=-1>
145
fr.read(cbuff);</font></font>
146
<br><font face="Arial"><font size=-1>
147
str_buff = new String(cbuff);</font></font>
148
<br><font face="Arial"><font size=-1> } catch(Exception
150
<br><font face="Arial"><font size=-1>
151
e.printStackTrace();</font></font>
152
<br><font face="Arial"><font size=-1> }</font></font>
153
<p><font face="Arial"><font size=-1> //Execute the .js
154
file content</font></font>
155
<br><font face="Arial"><font size=-1> return executeJSSource(str_buff);</font></font>
156
<br><font face="Arial"><font size=-1>}</font></font>
157
<p><i><font face="Arial"><font size=-1>/*** Executes javascript source
158
***/</font></font></i>
159
<br><font face="Arial"><font size=-1>public Object executeJSSource (String
160
jsbuff){</font></font>
161
<br><font face="Arial"><font size=-1>Object any=null;</font></font>
162
<br><font face="Arial"><font size=-1>try{</font></font>
163
<br><i><font face="Arial"><font size=-1>//Enter the Context</font></font></i>
164
<br><font face="Arial"><font size=-1><i>// Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
165
<br><font face="Arial"><font size=-1>Context context = Context.enter();</font></font>
166
<br><i><font face="Arial"><font size=-1>// Get the execution scope</font></font></i>
167
<br><font face="Arial"><font size=-1>Scriptable scope = context.initStandardObjects(null);</font></font>
168
<p><i><font face="Arial"><font size=-1>//----------- For Test 1 - Get System.out
169
in scope</font></font></i>
170
<br><font face="Arial"><font size=-1>//Scriptable jObj1 = Context.toObject(System.out,
171
scope);</font></font>
172
<br><font face="Arial"><font size=-1>scope.put("out", scope, jObj1);</font></font>
173
<p><i><font face="Arial"><font size=-1>//------------ For Test 2 - Instantiate
174
Create Object and get that in scope</font></font></i>
175
<br><i><font face="Arial"><font size=-1>//Allow JScript to create Java
176
Objects</font></font></i>
177
<br><i><font face="Arial"><font size=-1>//Bring the _create object to context</font></font></i>
178
<br><font face="Arial"><font size=-1>_create create = new _create( );</font></font>
179
<br><i><font face="Arial"><font size=-1>//Register this context and scope
180
to this create object instance</font></font></i>
181
<br><font face="Arial"><font size=-1>create.registerContext(context,scope);</font></font>
182
<br><font face="Arial"><font size=-1>//Scriptable jObj2 = Context.toObject(_create,
183
scope);</font></font>
184
<br><font face="Arial"><font size=-1>scope.put("create",scope,create);</font></font>
185
<br><i><font face="Arial"><font size=-1>//Evaluate (or execute js)</font></font></i>
186
<br><font face="Arial"><font size=-1><i>//Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
187
<br><font face="Arial"><font size=-1>any = context.evaluateString(scope,
188
jsbuff, "", 1, null);</font></font>
189
<br><i><font face="Arial"><font size=-1>//Exit the Context</font></font></i>
190
<br><font face="Arial"><font size=-1>context.exit( );</font></font>
191
<br><font face="Arial"><font size=-1>}</font></font>
192
<p><font face="Arial"><font size=-1>catch ( JavaScriptException jse) {</font></font>
193
<br><font face="Arial"><font size=-1>jse.printStackTrace();</font></font>
194
<br><font face="Arial"><font size=-1>}</font></font>
195
<p><font face="Arial"><font size=-1>return any;</font></font>
196
<p><font face="Arial"><font size=-1>}</font></font>
197
<p><font face="Arial"><font size=-1>}</font></font>
200
<p><font face="Arial"><font size=-1>Let us write a class for creating new
201
Java objects and bringing them to this script execution scope,</font></font>
202
<p><b><font face="Arial"><font size=-1>Fig 2.2 � _create.java</font></font></b>
203
<p><i><font face="Arial"><font size=-1>/**</font></font></i>
204
<p><i><font face="Arial"><font size=-1>* @author Madhukumar</font></font></i>
205
<p><i><font face="Arial"><font size=-1>*/</font></font></i>
206
<p><font face="Arial"><font size=-1>import java.lang.Class;</font></font>
207
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
208
<p><font face="Arial"><font size=-1>public class _create extends Object
210
<p><font face="Arial"><font size=-1>static Context ptr = null;</font></font>
211
<p><font face="Arial"><font size=-1>static Scriptable scope =null;</font></font>
212
<p><font face="Arial"><font size=-1>public _create () { }</font></font>
213
<p><font face="Arial"><font size=-1>public void registerContext(Context
214
cptr, Scriptable sc){</font></font>
215
<p><font face="Arial"><font size=-1>ptr = cptr;</font></font>
216
<p><font face="Arial"><font size=-1>scope = sc;</font></font>
217
<p><font face="Arial"><font size=-1>}</font></font>
218
<p><font face="Arial"><font size=-1>public void getInstance(String classname,String
219
jsclassname) {</font></font>
220
<p><font face="Arial"><font size=-1>Object any=null;</font></font>
221
<p><font face="Arial"><font size=-1>try {</font></font>
222
<p><font face="Arial"><font size=-1>Class thisclass = Class.forName(classname);</font></font>
223
<p><font face="Arial"><font size=-1>any = thisclass.newInstance();</font></font>
224
<p><font face="Arial"><font size=-1>}</font></font>
225
<p><font face="Arial"><font size=-1>catch(Exception e){</font></font>
226
<p><font face="Arial"><font size=-1>e.printStackTrace();</font></font>
227
<p><font face="Arial"><font size=-1>}</font></font>
228
<p><font face="Arial"><font size=-1>if( ptr != null) {</font></font>
229
<p><font face="Arial"><font size=-1>if (scope !=null) {</font></font>
230
<p><i><font face="Arial"><font size=-1>//register created object for this
231
execution scope</font></font></i>
232
<p><font face="Arial"><font size=-1>scope.put(jsclassname,scope,any);</font></font>
233
<p><font face="Arial"><font size=-1>}</font></font>
234
<p><font face="Arial"><font size=-1>}</font></font>
235
<p><font face="Arial"><font size=-1>}</font></font>
236
<p><font face="Arial"><font size=-1>}</font></font>
239
<p><font face="Arial"><font size=-1>It is time to test the code, so let
240
us write a small object that will use the JSHost object,</font></font>
241
<p><b><font face="Arial"><font size=-1>Fig 3 - JSHosttest.java</font></font></b>
242
<p><font face="Arial"><font size=-1>/**</font></font>
243
<p><font face="Arial"><font size=-1>* @author Madhukumar</font></font>
244
<p><font face="Arial"><font size=-1>* @version</font></font>
245
<p><font face="Arial"><font size=-1>*/</font></font>
246
<p><font face="Arial"><font size=-1>public class JSHosttest extends Object
248
<p><font face="Arial"><font size=-1>/** Creates new JSHostTest*/</font></font>
249
<p><font face="Arial"><font size=-1>public JSHosttest() {</font></font>
250
<p><font face="Arial"><font size=-1>}</font></font>
251
<p><font face="Arial"><font size=-1>public static void main (String args[]){</font></font>
252
<p><font face="Arial"><font size=-1>if (args.length < 1) {</font></font>
253
<p><font face="Arial"><font size=-1>System.out.println("Usage - Java JSHosttest.class
254
<js source file>");</font></font>
255
<p><font face="Arial"><font size=-1>return;</font></font>
256
<p><font face="Arial"><font size=-1>}</font></font>
257
<p><font face="Arial"><font size=-1>JSHost jsh = new JSHost();</font></font>
258
<p><font face="Arial"><font size=-1>System.out.println("Executing JavaScript
259
file - " + args[0]);</font></font>
260
<p><font face="Arial"><font size=-1>Object result = jsh.executeJS(args[0]);</font></font>
261
<p><font face="Arial"><font size=-1>if (result instanceof String){</font></font>
262
<p><font face="Arial"><font size=-1>System.out.println("Results - " + result);</font></font>
263
<p><font face="Arial"><font size=-1>}</font></font>
264
<p><font face="Arial"><font size=-1>}</font></font>
265
<p><font face="Arial"><font size=-1>}</font></font>
268
<p><font face="Arial"><font size=-1>For more explanations on the code execution,
269
please refer embedding tutorial <a href="http://www.mozilla.org/js/rhino/tutorial.html">http://www.mozilla.org/js/rhino/tutorial.html</a>
270
and for all documentation and examples on Rhino visit <a href="http://www.mozilla.org/rhino/doc.html">http://www.mozilla.org/rhino/doc.html</a>.</font></font>
1
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
4
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5
<meta name="Generator" content="Microsoft Word 97">
6
<meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
7
<title>Embedding �Scripting Host� in Business Applications</title>
10
<b><font face="Arial"><font size=-1>Embedding
11
�Scripting Host� in Business Applications</font></font></b>
12
<p><b><font face="Arial"><font size=-1>Madhukumar Seshadri, <a href="http://www.cognizant.com)/">www.cognizant.com</a></font></font></b>
15
<p><font face="Arial"><font size=-1>With web browsers, continuing to rule
16
the human interface for applications, creating value by being ubiquitous,
17
few adoptions of rich technology that�s getting brewed underneath, will
18
help designing business applications even though most of the current ones
19
are made with bird�s eye of the underlying technologies.</font></font>
20
<p><font face="Arial"><font size=-1>JavaScript is a scripting language
21
invented and developed by Netscape. The language was primarily designed
22
for creating lightweight programming for web browser extensions by exposing
23
the Document Object Model of an HTML page to the scripts. JavaScript is
24
becoming object oriented and getting adopted for server-side scripting.</font></font>
25
<p><font face="Arial"><font size=-1>JavaScript is also becoming a standard
26
in the scripting world as Netscape is working closely with ECMA (European
27
Computer Manufacturers Association) to make it as a standard scripting
28
language for the script world. The standards are published as ECMA Script.</font></font>
29
<p><font face="Arial"><font size=-1>JavaScript originally designed for
30
exposing the DOM (Document Object Model) standardized by World Wide Web
31
consortium (W3C), to help web page designers to control and manipulate
32
the pages dynamically. �JavaScript� engines were embedded in the browsers
33
and they execute those portions of the code embedded in the HTML pages.</font></font>
34
<p><font face="Arial"><font size=-1>In short, JavaScript engine embedded
35
in the browser allowed extensions or manipulations for DOM Object run time
36
for the HTML page by executing the �scripts� associated with them. In other
37
words, browser exposes its DOM object for the page to scripts for extensions
38
and dynamic manipulations of the same, using a language that the script
39
interpreter understands.</font></font>
40
<p><font face="Arial"><font size=-1>Can I do the same for my application
41
by exposing my custom business objects written in my middle-tier? Can I
42
allow user to my write JavaScript extensions for my objects and also be
43
host for executing those scripts?</font></font>
44
<p><font face="Arial"><font size=-1>JavaScript host runs times are available
45
as binaries written in major languages. Check out <a href="http://www.mozilla.org/js">www.mozilla.org/js</a>.
46
Spider Monkey and Rhino are open source JavaScripting engines available
47
from mozilla.</font></font>
48
<p><font face="Arial"><font size=-1>Microsoft implementation of ECMA Script
49
(ECMA Script is based on core JavaScript, created by Netscape) is called
50
JScript. Microsoft binaries of jscript engine can be downloaded from http://msdn.microsoft.com/scripting/.</font></font>
51
<p><font face="Arial"><font size=-1>This document doesn�t explain the JavaScript
52
language in detail but explains how these scripting engines can be used
53
as host to expose business objects in the middle-tier and how the user
54
of these applications can extend it if needed using JavaScript.</font></font>
55
<p><font face="Arial"><font size=-1>The scripting engine Rhino (<a href="http://www.mozilla.org/js)">www.mozilla.org/rhino)</a>,
56
a javascript engine purely written in Java is one that I am going to use
57
for the testing the above.</font></font>
58
<p><font face="Arial"><font size=-1>Let us set some simple goals,</font></font>
61
<font face="Arial"><font size=-1>Execute a plain �JavaScript� code and
62
use static Java object</font></font></li>
65
<font face="Arial"><font size=-1>Instantiate external objects (written
66
in Java) from the script and use them within the script</font></font></li>
71
<p><font face="Arial"><font size=-1>Let us write a simple Javscript to
72
test the above set goals,</font></font>
73
<p><font face="Arial"><font size=-1><b>Fig 1</b> � jshosttest.js</font></font>
74
<p><b><i><font face="Arial"><font size=-1>/* Test 1 */</font></font></i></b>
75
<br><b><i><font face="Arial"><font size=-1>/* Use a static Java Object
76
in the script */</font></font></i></b>
77
<p><font face="Arial"><font size=-1>function test1() {</font></font>
78
<br><font face="Arial"><font size=-1> var str;</font></font>
79
<br><font face="Arial"><font size=-1> str = '"Hello World";</font></font>
80
<br><font face="Arial"><font size=-1> return str;</font></font>
81
<br><font face="Arial"><font size=-1>}</font></font>
82
<p><font face="Arial"><font size=-1>var str = test1( );</font></font>
83
<br><font face="Arial"><font size=-1>//out is expected to be Java Object
84
exposed to the script scope</font></font>
85
<br><font face="Arial"><font size=-1>out.println ("JavaScript - Test 1
86
- " + str);</font></font>
87
<p><b><i><font face="Arial"><font size=-1>/* Test 2 */</font></font></i></b>
88
<p><b><i><font face="Arial"><font size=-1>/* Instantiate a Javaobject for
89
this scope and use it */</font></font></i></b>
90
<p><font face="Arial"><font size=-1>function test2(){</font></font>
91
<br><font face="Arial"><font size=-1> // create a Java
92
string buffer object from JavaScript and use its java instance</font></font>
93
<br><font face="Arial"><font size=-1> // This uses an
94
another Java object created for creating new objects within Java and</font></font>
95
<br><font face="Arial"><font size=-1> // brings the same
96
for JavaScript execution scope</font></font>
97
<br><font face="Arial"><font size=-1> // Refer _create.java
98
for more information</font></font>
99
<br><font face="Arial"><font size=-1> create.getInstance("java.lang.StringBuffer","buffer");</font></font>
100
<br><font face="Arial"><font size=-1> //JavaScript refers
101
the java object instance as �buffer�</font></font>
102
<br><font face="Arial"><font size=-1> out.println(buffer.toString());</font></font>
103
<br> <font face="Arial"><font size=-1>buffer.append("I
104
am a javaobject dynamically created and executed in JavaScript");</font></font>
105
<br> <font face="Arial"><font size=-1>return buffer.toString();</font></font>
106
<br><font face="Arial"><font size=-1>}</font></font>
107
<p><font face="Arial"><font size=-1>var str = test2();</font></font>
108
<br><font face="Arial"><font size=-1>out.println("From JavaScript - Test
109
2 " + str);</font></font>
110
<p><font face="Arial"><font size=-1>Let us write a simple Javahost Object
111
using the Rhino engine to execute the above script,</font></font>
112
<p><b><font face="Arial"><font size=-1>Fig 2.1 - JSHost.java</font></font></b>
113
<p><font face="Arial"><font size=-1>/**</font></font>
114
<br><font face="Arial"><font size=-1>* @author Madhukumar Seshadri</font></font>
115
<br><font face="Arial"><font size=-1>* @version</font></font>
116
<br><font face="Arial"><font size=-1>*/</font></font>
117
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
118
<br><font face="Arial"><font size=-1>import java.io.*;</font></font>
119
<br><font face="Arial"><font size=-1>import java.lang.*;</font></font>
120
<br><i><font face="Arial"><font size=-1>// import com.xxx.xxx.*;</font></font></i>
121
<p><font face="Arial"><font size=-1>public class JSHost extends Object
123
<br><font face="Arial"><font size=-1> /** Creates new
124
JSHost */</font></font>
125
<br><font face="Arial"><font size=-1> public JSHost()
127
<br><font face="Arial"><font size=-1> }</font></font>
128
<p><i><font face="Arial"><font size=-1> /*** Executes
129
.js file ***/</font></font></i>
130
<br><font face="Arial"><font size=-1> public Object executeJS
131
(String jsfname){</font></font>
132
<br><font face="Arial"><font size=-1> //You can also
133
use evaluateReader</font></font>
134
<br><font face="Arial"><font size=-1> File fp = new File(jsfname);</font></font>
135
<br><font face="Arial"><font size=-1> String str_buff
137
<br><font face="Arial"><font size=-1> try {</font></font>
138
<br><font face="Arial"><font size=-1>
139
FileReader fr = new FileReader(jsfname);</font></font>
140
<br><font face="Arial"><font size=-1>
141
int length = (int) fp.length();</font></font>
142
<br><font face="Arial"><font size=-1>
143
char cbuff[] = new char[(char)length];</font></font>
144
<br><font face="Arial"><font size=-1>
145
fr.read(cbuff);</font></font>
146
<br><font face="Arial"><font size=-1>
147
str_buff = new String(cbuff);</font></font>
148
<br><font face="Arial"><font size=-1> } catch(Exception
150
<br><font face="Arial"><font size=-1>
151
e.printStackTrace();</font></font>
152
<br><font face="Arial"><font size=-1> }</font></font>
153
<p><font face="Arial"><font size=-1> //Execute the .js
154
file content</font></font>
155
<br><font face="Arial"><font size=-1> return executeJSSource(str_buff);</font></font>
156
<br><font face="Arial"><font size=-1>}</font></font>
157
<p><i><font face="Arial"><font size=-1>/*** Executes javascript source
158
***/</font></font></i>
159
<br><font face="Arial"><font size=-1>public Object executeJSSource (String
160
jsbuff){</font></font>
161
<br><font face="Arial"><font size=-1>Object any=null;</font></font>
162
<br><font face="Arial"><font size=-1>try{</font></font>
163
<br><i><font face="Arial"><font size=-1>//Enter the Context</font></font></i>
164
<br><font face="Arial"><font size=-1><i>// Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
165
<br><font face="Arial"><font size=-1>Context context = Context.enter();</font></font>
166
<br><i><font face="Arial"><font size=-1>// Get the execution scope</font></font></i>
167
<br><font face="Arial"><font size=-1>Scriptable scope = context.initStandardObjects();</font></font>
168
<p><i><font face="Arial"><font size=-1>//----------- For Test 1 - Get System.out
169
in scope</font></font></i>
170
<br><font face="Arial"><font size=-1>//Scriptable jObj1 = Context.toObject(System.out,
171
scope);</font></font>
172
<br><font face="Arial"><font size=-1>scope.put("out", scope, jObj1);</font></font>
173
<p><i><font face="Arial"><font size=-1>//------------ For Test 2 - Instantiate
174
Create Object and get that in scope</font></font></i>
175
<br><i><font face="Arial"><font size=-1>//Allow JScript to create Java
176
Objects</font></font></i>
177
<br><i><font face="Arial"><font size=-1>//Bring the _create object to context</font></font></i>
178
<br><font face="Arial"><font size=-1>_create create = new _create( );</font></font>
179
<br><i><font face="Arial"><font size=-1>//Register this context and scope
180
to this create object instance</font></font></i>
181
<br><font face="Arial"><font size=-1>create.registerContext(context,scope);</font></font>
182
<br><font face="Arial"><font size=-1>//Scriptable jObj2 = Context.toObject(_create,
183
scope);</font></font>
184
<br><font face="Arial"><font size=-1>scope.put("create",scope,create);</font></font>
185
<br><i><font face="Arial"><font size=-1>//Evaluate (or execute js)</font></font></i>
186
<br><font face="Arial"><font size=-1><i>//Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
187
<br><font face="Arial"><font size=-1>any = context.evaluateString(scope,
188
jsbuff, "", 1, null);</font></font>
189
<br><i><font face="Arial"><font size=-1>//Exit the Context</font></font></i>
190
<br><font face="Arial"><font size=-1>context.exit( );</font></font>
191
<br><font face="Arial"><font size=-1>}</font></font>
192
<p><font face="Arial"><font size=-1>catch ( JavaScriptException jse) {</font></font>
193
<br><font face="Arial"><font size=-1>jse.printStackTrace();</font></font>
194
<br><font face="Arial"><font size=-1>}</font></font>
195
<p><font face="Arial"><font size=-1>return any;</font></font>
196
<p><font face="Arial"><font size=-1>}</font></font>
197
<p><font face="Arial"><font size=-1>}</font></font>
200
<p><font face="Arial"><font size=-1>Let us write a class for creating new
201
Java objects and bringing them to this script execution scope,</font></font>
202
<p><b><font face="Arial"><font size=-1>Fig 2.2 � _create.java</font></font></b>
203
<p><i><font face="Arial"><font size=-1>/**</font></font></i>
204
<p><i><font face="Arial"><font size=-1>* @author Madhukumar</font></font></i>
205
<p><i><font face="Arial"><font size=-1>*/</font></font></i>
206
<p><font face="Arial"><font size=-1>import java.lang.Class;</font></font>
207
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
208
<p><font face="Arial"><font size=-1>public class _create extends Object
210
<p><font face="Arial"><font size=-1>static Context ptr = null;</font></font>
211
<p><font face="Arial"><font size=-1>static Scriptable scope =null;</font></font>
212
<p><font face="Arial"><font size=-1>public _create () { }</font></font>
213
<p><font face="Arial"><font size=-1>public void registerContext(Context
214
cptr, Scriptable sc){</font></font>
215
<p><font face="Arial"><font size=-1>ptr = cptr;</font></font>
216
<p><font face="Arial"><font size=-1>scope = sc;</font></font>
217
<p><font face="Arial"><font size=-1>}</font></font>
218
<p><font face="Arial"><font size=-1>public void getInstance(String classname,String
219
jsclassname) {</font></font>
220
<p><font face="Arial"><font size=-1>Object any=null;</font></font>
221
<p><font face="Arial"><font size=-1>try {</font></font>
222
<p><font face="Arial"><font size=-1>Class thisclass = Class.forName(classname);</font></font>
223
<p><font face="Arial"><font size=-1>any = thisclass.newInstance();</font></font>
224
<p><font face="Arial"><font size=-1>}</font></font>
225
<p><font face="Arial"><font size=-1>catch(Exception e){</font></font>
226
<p><font face="Arial"><font size=-1>e.printStackTrace();</font></font>
227
<p><font face="Arial"><font size=-1>}</font></font>
228
<p><font face="Arial"><font size=-1>if( ptr != null) {</font></font>
229
<p><font face="Arial"><font size=-1>if (scope !=null) {</font></font>
230
<p><i><font face="Arial"><font size=-1>//register created object for this
231
execution scope</font></font></i>
232
<p><font face="Arial"><font size=-1>scope.put(jsclassname,scope,any);</font></font>
233
<p><font face="Arial"><font size=-1>}</font></font>
234
<p><font face="Arial"><font size=-1>}</font></font>
235
<p><font face="Arial"><font size=-1>}</font></font>
236
<p><font face="Arial"><font size=-1>}</font></font>
239
<p><font face="Arial"><font size=-1>It is time to test the code, so let
240
us write a small object that will use the JSHost object,</font></font>
241
<p><b><font face="Arial"><font size=-1>Fig 3 - JSHosttest.java</font></font></b>
242
<p><font face="Arial"><font size=-1>/**</font></font>
243
<p><font face="Arial"><font size=-1>* @author Madhukumar</font></font>
244
<p><font face="Arial"><font size=-1>* @version</font></font>
245
<p><font face="Arial"><font size=-1>*/</font></font>
246
<p><font face="Arial"><font size=-1>public class JSHosttest extends Object
248
<p><font face="Arial"><font size=-1>/** Creates new JSHostTest*/</font></font>
249
<p><font face="Arial"><font size=-1>public JSHosttest() {</font></font>
250
<p><font face="Arial"><font size=-1>}</font></font>
251
<p><font face="Arial"><font size=-1>public static void main (String args[]){</font></font>
252
<p><font face="Arial"><font size=-1>if (args.length < 1) {</font></font>
253
<p><font face="Arial"><font size=-1>System.out.println("Usage - Java JSHosttest.class
254
<js source file>");</font></font>
255
<p><font face="Arial"><font size=-1>return;</font></font>
256
<p><font face="Arial"><font size=-1>}</font></font>
257
<p><font face="Arial"><font size=-1>JSHost jsh = new JSHost();</font></font>
258
<p><font face="Arial"><font size=-1>System.out.println("Executing JavaScript
259
file - " + args[0]);</font></font>
260
<p><font face="Arial"><font size=-1>Object result = jsh.executeJS(args[0]);</font></font>
261
<p><font face="Arial"><font size=-1>if (result instanceof String){</font></font>
262
<p><font face="Arial"><font size=-1>System.out.println("Results - " + result);</font></font>
263
<p><font face="Arial"><font size=-1>}</font></font>
264
<p><font face="Arial"><font size=-1>}</font></font>
265
<p><font face="Arial"><font size=-1>}</font></font>
268
<p><font face="Arial"><font size=-1>For more explanations on the code execution,
269
please refer embedding tutorial <a href="http://www.mozilla.org/js/rhino/tutorial.html">http://www.mozilla.org/js/rhino/tutorial.html</a>
270
and for all documentation and examples on Rhino visit <a href="http://www.mozilla.org/rhino/doc.html">http://www.mozilla.org/rhino/doc.html</a>.</font></font>