Hi Mani,
You need to *override* nashorn.jar in the underlying jdk8 build. The
command line for the same is as follows:
/usr/lib/jdk1.8.0/bin/java
-Djava.ext.dirs=<$nashorn/dist-dir-of-your-nashorn-repo> JSObjectTest
With that nashorn.jar from the latest (nashorn repo) code is used -
rather than the nashorn.jar bundled in jdk8. Note that this issue will
be resolved in a (near) future jdk8 snapshot build (and also in jdk8
fcs). For the interim period, you've to use the above command line.
Hope this helps,
-Sundar
On Saturday 08 June 2013 12:33 AM, Mani Sarkar wrote:
Thanks Sundar, Jim for the explanation.
I extracted the jsobjectTest() from ScriptEngineTest.java as it is and
compiled and ran it, when I run it I still get the same error that I got
with my example. I have put all of this in a gist to demonstrate what I was
doing:
https://gist.github.com/neomatrix369/5731520
I also ran the ScriptEngineTest using the jtreg command and that ran
successfully:
~/jtreg/linux/bin/jtreg -jdk:/usr/lib/jdk1.8.0
-Xbootclasspath/p:$HOME/sources/jdk8_tl/nashorn/dist/nashorn.jar
-verbose:fail test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java
Regards,
mani
On Thu, Jun 6, 2013 at 11:25 AM, Mani Sarkar <[email protected]> wrote:
Hi Jim,
You have been very quick with your response to my query.
Thanks for going through the trouble, apologies for the empty
folders,www.google.co.in/accounts/Logout2?hl=en&service=mail&ilo=1&ils=s.IN&ilc=1&continue=https%3A%2F%2Faccounts.google.com%2FServiceLogin%3Fservice%3Dmail%26passive%3Dtrue%26rm%3Dfalse%26continue%3Dhttps%3A%2F%2Fmail.google.com%2Fmail%2F%26ss%3D1%26scc%3D1%26ltmpl%3Ddefault%26ltmplcache%3D2%26hl%3Den&zx=-1663605433tami
they are submodules that haven;t been pushed correctly to my repo.
I have made the changes you suggested and rebuilt my class (I had to get
the latest version of the codebase as JSObject wasn;t present in
nashorn.jar in my old code-base).
After building and running I get the below:
Exception in thread "main" java.lang.ClassCastException:
jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to
jdk.nashorn.api.scripting.JSObject
at JSJSONInJava.main(JSJSONInJava.java:19)
Lines 18 and 19 are as follows:
17: // fetch the value of a variable
18: Object objFromJS = engine.get("JSONObjectUsingJavaScript");
19: JSObject jsonObjFromJS = (JSObject) objFromJS;
Any ideas, or is it something new?
Regards,
mani
On Wed, Jun 5, 2013 at 8:51 PM, Jim Laskey <[email protected]>wrote:
The repo you provided has empty JSON-java and JSON-js directories, so
I'll give you an alternative example. The main thing to note is that,
because of a JS object's dynamic nature, it can not mirror a Java object.
A better analogy would be to think of a JS object as a Map object, where
properties are keys and you access values with keys.
Run the enclosed example as follows;
javac Example.java
java Example
The class of myObject is a JSObject. You can access properties of a
JSObject with getMember/setMember (or getSlot/setSlot for integer keys.)
=== Example.java ===
import javax.script.*;
import jdk.nashorn.api.scripting.JSObject;
public class Example {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("nashorn");
engine.eval(new java.io.FileReader("Example1.js"));
JSObject myObject = (JSObject)engine.get("myObject");
System.out.println(myObject.getMember("a"));
System.out.println(myObject.getMember("b"));
System.out.println(myObject.getMember("c"));
myObject.setMember("d", "A new string");
engine.eval(new java.io.FileReader("Example2.js"));
}
}
=== Example1.js ===
var myObject = {
a: "A string",
b: 100,
c: true
}
=== Example2.js ===
print(myObject.d);
==== Output ===
A string
100
true
A new string
Cheers,
-- Jim
On 2013-06-05, at 3:50 PM, Mani Sarkar <[email protected]> wrote:
Hi,
I have another query regarding the example (see
https://github.com/neomatrix369/NashornHackDay/blob/master/examples/JSON_in_JS_and_Java/JSJSONInJava.java
)
created sometime back during the Nashorn hackday. When I bring a JS
object
created in Nashorn into Java I'm not able to access the object directly,
how do I access it like a normal java object.
If its a raw / primitive type then the contents are accessible (you can
see
the value) while for JS object, when I say
*System.out.println(JSObjectFromNashorn);*
I get the below output
*[object object]*
The full implementation of what I'm talking about can be found at the
above
link.
Regards,
mani
--
*Twitter:* @theNeomatrix369 *Blog:*
http://neomatrix369.wordpress.com
*JUG activity:* LJC Advocate (@adoptopenjdk & @adoptajsr programs)
*Meet-a-Project:* https://github.com/MutabilityDetector
*Bitbucket:* https://bitbucket.org/neomatrix369 * **Github:*
https://github
.com/neomatrix369
*LinkedIn:* http://uk.linkedin.com/pub/mani-sarkar/71/a77/39b
*Devoxx UK 2013* was a grand success:
http://www.devoxx.com/display/UK13/Home
*Don't chase success, rather aim for "Excellence", and success will come
chasing after you!*
--
*Twitter:* @theNeomatrix369 *Blog:*
http://neomatrix369.wordpress.com
*JUG activity:* LJC Advocate (@adoptopenjdk & @adoptajsr programs)
*Meet-a-Project:* https://github.com/MutabilityDetector
*Bitbucket:* https://bitbucket.org/neomatrix369 * **Github:* https://
github.com/neomatrix369
*LinkedIn:* http://uk.linkedin.com/pub/mani-sarkar/71/a77/39b
*Devoxx UK 2013* was a grand success:
http://www.devoxx.com/display/UK13/Home
*Don't chase success, rather aim for "Excellence", and success will come
chasing after you!*