Nashorn and AsciidoctorJs

Jim Laskey (Oracle) james.laskey at oracle.com
Tue Jul 29 13:21:09 UTC 2014


I just remembered I'm running with 8u20 preview - likely has some affect.

-- Jim



On Jul 29, 2014, at 10:08 AM, Jim Laskey (Oracle) <james.laskey at oracle.com> wrote:

> [Just getting back]
> Granted I tweaked the main to simplify the testing outside an IDE, but when I ran it it seems to work up to a point (asciidoctor.js:12234 timings.$start is undefined.):
> 
>>> java -cp ../java nashorn.RenderDocumentWithNashorn
> Working Directory = /Projects/asciidoctorjs/src/test/resources
> <!DOCTYPE html>
> <html lang="en">
> <head>
> <meta charset="UTF-8">
> <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
> <meta name="viewport" content="width=device-width, initial-scale=1.0">
> <meta name="generator" content="Asciidoctor 1.5.0-preview.8">
> <title>Untitled</title>
> <link rel="stylesheet" href="./asciidoctor.css">
> </head>
> <body class="article">
> <div id="header">
> </div>
> <div id="content">
> <div class="paragraph">
> <p><strong>Hello World</strong></p>
> </div>
> </div>
> <div id="footer">
> <div id="footer-text">
> Last updated 2014-07-29 09:56:41 ADT
> </div>
> </div>
> </body>
> </html>
> *Hello World*
> [object Object]
> nashorn.AsciidoctorJs$$NashornJavaAdapter at 4a70d302
> undefined
> Exception in thread "main" <eval>:12235 TypeError: Cannot call undefined
> 	at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:56)
> 	at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:212)
> 	at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:184)
> 	at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:171)
> 	at jdk.nashorn.internal.runtime.Undefined.lookupTypeError(Undefined.java:128)
> 	at jdk.nashorn.internal.runtime.Undefined.lookup(Undefined.java:100)
> 	at jdk.nashorn.internal.runtime.linker.NashornLinker.getGuardedInvocation(NashornLinker.java:98)
> 	at jdk.internal.dynalink.support.CompositeTypeBasedGuardingDynamicLinker.getGuardedInvocation(CompositeTypeBasedGuardingDynamicLinker.java:176)
> 	at jdk.internal.dynalink.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:124)
> 	at jdk.internal.dynalink.support.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:144)
> 	at jdk.internal.dynalink.DynamicLinker.relink(DynamicLinker.java:232)
> 	at jdk.nashorn.internal.scripts.Script$\^eval\_$32._L11888$_L11906$_L12223$_L12226(<eval>:12235)
> 	at jdk.nashorn.internal.scripts.Script$\^eval\_$34._L11888$_L11906$_L12223$_L12310(<eval>:12336)
> 	at jdk.nashorn.internal.scripts.Script$\^eval\_._L1(<eval>:2)
> 	at nashorn.AsciidoctorJs$$NashornJavaAdapter.render(Unknown Source)
> 	at nashorn.RenderDocumentWithNashorn.main(RenderDocumentWithNashorn.java:66)
> 
> package nashorn;
> 
> import java.io.*;
> import java.util.HashMap;
> import java.util.Map;
> import java.util.Scanner;
> 
> import javax.script.*;
> 
> public class RenderDocumentWithNashorn {
>    static void evalFile(String filename, ScriptEngine engine, SimpleScriptContext context) throws ScriptException, FileNotFoundException {
>        engine.eval(new java.io.FileReader(filename), context);
>    }
> 
>    public static void main(String[] args) throws ScriptException, NoSuchMethodException, FileNotFoundException {
>        System.out.println("Working Directory = " + System.getProperty("user.dir"));
> 
>        ScriptEngineManager engineManager =
>                new ScriptEngineManager();
>        ScriptEngine engine =
>                engineManager.getEngineByName("nashorn");
> 
> 
>        SimpleScriptContext simpleScriptContext = new SimpleScriptContext();
>        Bindings bindings = new SimpleBindings();
> 
>        simpleScriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
> 
>        try {
>            evalFile("opal.js", engine, simpleScriptContext);
>            evalFile("asciidoctor.js", engine, simpleScriptContext);
>            evalFile("asciidoctor_extensions.js", engine, simpleScriptContext);
>            evalFile("asciidoctorjava.js", engine, simpleScriptContext);
>        } catch (ScriptException e) {
>            throw new IllegalArgumentException(e);
>        }
> 
>        String content = "*Hello World*";
>        Map<String, Object> options = new HashMap<>();
>        options.put("header_footer", true);
> 
>        simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("listOptions", options.keySet().toArray());
>        simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("options", options);
>        simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("content", content);
> 
> 
>        Invocable invocable = (Invocable) engine;
> 
>        Object eval = engine.eval("Opal.hash2(listOptions, options)", simpleScriptContext);
> 
>        simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("hash2", eval);
> 
> 
> 
>        engine.setContext(simpleScriptContext);
> 
>        System.out.println(engine.eval("Opal.Asciidoctor.$render(content, hash2);", simpleScriptContext));
> 
>        AsciidoctorJs asciidoctorJs =
>                invocable.getInterface(
>                        AsciidoctorJs.class);
>        System.out.println(content);
>        System.out.println(eval);
>        System.out.println(asciidoctorJs);
>        System.out.println(
>                asciidoctorJs.render(content, eval));
> 
> 
>    }
> 
> }
> 
> 
> 
> 
> 
> On Jul 26, 2014, at 9:02 AM, Alex Soto <asotobu at gmail.com> wrote:
> 
>> Hi guys,
>> 
>> currently I am working on integrating Asciidoctor to Java using Nashorn and
>> Opal. Nowadays we have got an asciidoctor java running above JRuby.
>> 
>> Apart from Asciidoctor java we also have an asciidoctorjs which is created
>> using Opal (a gem to convert Ruby programs to JavaScript).
>> 
>> So next step is to integrate this js to java using nashorn. But we are
>> having one problem.
>> 
>> I have created a project with a test so you can take a look as well:
>> https://github.com/lordofthejars/asciidoctorjs
>> 
>> The test is located at
>> https://github.com/lordofthejars/asciidoctorjs/blob/master/src/test/java/rhino/RenderDocumentWithRhino.java
>> (although it is called Rhino currently we are using Nashorn).
>> 
>> If I create an script engine an I use the eval method everywhere it works
>> perfectly but because I would like to use some more typesafe approach I
>> decided to create an interface mirroring some asciidoctor operations so I
>> call invocable.getInterface(AsciidoctorJs.class) to create the proxied
>> instance and then I call defined methods.
>> 
>> This interface mimics the js asciidoctorjava.js which internally calls
>> asciidoctor.js operations. This is done because I only want some operations
>> available from Java part, not the whole operations that asciidoctor.js
>> offers.
>> 
>> asciidoctorjava.js looks like:
>> 
>> var render = function(content, optionsHash2) {
>>   return Opal.Asciidoctor.$render(content, optionsHash2);
>> };
>> 
>> The problem is that when I run the test an exception is thrown notifying
>> that Opal.Asciidoctor.$render is not found. If I change that line to:
>> 
>> var render = function(content, optionsHash2) {
>>   return "Hello World";
>> };
>> 
>> then it works so it seems that Nashorn don't load the asciidoctor.js but
>> this is not exactly true because if I execute the same operation but using
>> eval method it works.
>> 
>> Probably I am missing something in the creation of proxied interface, but
>> currently I cannot see what.
>> 
>> Any idea on why this happens?
>> 
>> Thank you so much for your help in advance.
>> 
>> Alex.
>> 
>> -- 
>> +----------------------------------------------------------+
>> Alex Soto Bueno - Computer Engineer
>> www.lordofthejars.com
>> +----------------------------------------------------------+
> 



More information about the nashorn-dev mailing list