Hi All,

We have started the integration of JSR-223 i.e. javax.script API with
Jaggery. Sorry for the lengthy mail, but this is just to share the status
and get your all kinds of feedbacks. A Jaggery fork and a distribution with
the following improvements can be found at [1] and [2] respectively. In
case you want to try this out before sharing your feedbacks, you can
download a Jaggery distribution with all the above implementations at [2].
It consists of 5 demo apps. (At the moment, this has been tested only on
linux/mac and you will have to run this either on JDK 7 or 8. As JDK 6
supports only an older version of ECMAScript, this pack will not work. But
in order to get the support even on JDK 6, we will have to pack the JSR-223
rhino implementation with a rhino 1.7 version, following a similar way
described at [7])

With the integration with JSR-223, we had to and thought to do a few
changes and improvements to Jaggery which will be detailed below. BUT,
please note that, every existing Jaggery application will work as it is,
independent of those improvements. i.e. With a version field in
jaggery.conf, we internally decide, whether to go with the newer version.

*Key Decisions*

   1. JSR-223 support
      - With this, Jaggery will use Nashorn from JDK8 onwards and will
      fallback to JDK's embeded Rhino version with JDK7 or below.
   2. Saying good bye for hostobjects
   - Hostobjects are a concept of Rhino and it was needed to follow certain
      conventions when you write your hostobjects. With JSR-223, we cannot have
      it anymore. But, instead of that, you can refactor only the hostobject
      *.java class into *.js file which contains the Java code and plug it.
      3. Dropping E4X support
   - E4X was an extension to ECMAScripts and usage of E4X is being
      deprecated in many places. Also, AFAIK, there is no support for E4X in
      nashorn. This will be replaced by a Axiom/DOM like modules. i.e. without
      altering the spec.
      4. Except the bare minimal, everything else is separated into
   commonjs modules
   - This will give much more flexibility and extendability for Jaggery.
      i.e. In order to extend Jaggery, developers don't need to be Java
      developers anymore
      5. Introduction of app.server() method
   - In the current version, routing mechanism has been implemented by
      Jaggery core and there is no way to intercept that. This makes
it harder to
      write cooler modules for Jaggery, such as express, connect for
node. Using
      app.server(), Jaggery core delegates request serving to a single
callback.
      But, via that callback, users can call their own routing modules and do
      whatever they want. You can even implement the current *.jag
model, on top
      of app.server()[refer demo3]. Also, we have written an express
like routing
      framework which can be used to define REST APIs very easily through
      Jaggery. This will be a good alternative for JAX-RS developers too.
      6. Servlet 3.0 Async support
   - Another key feature is utilizing Async servlet support. So,
      concurrency will not be restricted by the available thread count anymore.
      7. CommonJS module system
      - At the moment, Jaggery has its own module system. Instead of that,
      we though of going ahead with commonjs module specification. With this,
      commonjs compliant modules will be able to use within Jaggery. i.e. Any
      node module which doesn't depend on node core APIs, can be used
in Jaggery
      as well, without doing any change.
      8. Module versioning and nested module support
      - Another improvement is, adding module versioning support for
      Jaggery modules. i.e. x app(or module) can use y1 version of y module,
      while another z app(or module) can use y2 without conflicting each other.
      For this too, we are also using package.json as per the commonjs
      specification
      9. Support for deploying directly on top of tomcat
      - With the above Jaggery core minimisations, a Jaggery app can be
      even deployed on top of tomcat, subjecting to a WEB-INF directory which
      contains jaggery core jars and web.xml
      10. Improved command line tool
      - clamshell-cli based command line tool with history support etc.
      With this, we expect people to write more command line tools
such as built
      tools, package managers etc. using Jaggery

*Demo Apps*

   1. https://github.com/ruchiraw/jaggery/tree/master/apps/demo1
   - this is the bare minimal with app.server()
      - can be accessed via http://localhost:9763/demo1
      2. https://github.com/ruchiraw/jaggery/tree/master/apps/demo2
   - this shows about module versioning and nested modules
      - can be accessed via http://localhost:9763/demo2
   3. https://github.com/ruchiraw/jaggery/tree/master/apps/demo3
      - this shows how you can implement *.jag support on top of app.serve()
      - can be accessed via http://localhost:9763/demo3/index.jag
      - you can click on "See Docs" link too
      - at the moment, this doesn't support all the APIs of the current
      version, but this is a PoC for that.
   4. https://github.com/ruchiraw/jaggery/tree/master/apps/demo4
      1. this shows the usage of express like routing module developed by
      SameeraM[3]
      2. can be accessed via http://localhost:9763/demo4/users/1 or
      http://localhost:9763/demo4/apps/1
   5. https://github.com/ruchiraw/jaggery/tree/master/apps/demo5
      - by copying this into the webapps directory of an apache tomcat
      server, you can try out how Jaggery can work on tomcat
      - this app is exactly like aboute demo4, but this time, it runs on
      tomcat.
      - can be accessed via http://localhost:8080/demo5/users/1 or
      http://localhost:8080/demo5/apps/1

When, above demos are run, you will be able to see module resolution log
messages at the moment. Hence, if you are doing any kind of load testing
etc.,

   - If it is Jaggery server, please make "development" as false in
   jaggery.conf
   - If it is on tomcat, set "jaggery.development" as false in web.xml.

This will enable caching for loaded modules, pooling for script engines and
async servlets. Further, you can fine tune the performances using the
jaggery.conf[4] parameters on Jaggery and web.xml[5] parameters on tomcat.
I have done only a small load test to test the server concurrency. Will do
a proper benchmarking round after improving further.

*Command Line Tool*

   - In order to use the cmd tool, you need to first set the environment
   variable JAGGERY_HOME pointing to your unzipped Jaggery distribution
      - export
      
JAGGERY_HOME=/Users/ruchira/binaries/jaggery/1.0.0/m0/jaggery-0.9.0-SNAPSHOT
   - Then download *.jar at [8]
   - Execute the downloaded *.jar using
      - java -jar org.jaggeryjs.cmd-0.9.0-SNAPSHOT-jar-with-dependencies.jar
      - You can require the modules
      - relative to your working directory. e.g. require('./foo') if it the
      module foo is at <cwd>/foo.js or <cwd>/foo/
      - If you have a jaggery-modules directory working direcotry as
      <cwd>/jaggery-modules, then you can require any module exists there using
      require('foo') etc.

Current implementation is just the core to get started and demonstrate what
I have mentioned above. We have plans along the line to write
a comprehensive Jaggery Package Manager, a maven plugin to execute unit
tests etc.

[1] https://github.com/ruchiraw/jaggery
[2]
https://github.com/ruchiraw/sandbox/raw/master/jaggery/1.0.0/m0/jaggery-0.9.0-SNAPSHOT.zip
[3] https://github.com/splinter/jaggery-pipe
[4]
https://github.com/ruchiraw/jaggery/blob/4560a303f809d532ad041125c1a29ecc2eb9df55/apps/tomgery/jaggery.conf
[5]
https://github.com/ruchiraw/jaggery/blob/master/apps/demo5/WEB-INF/web.xml
[6] https://github.com/vladimirvivien/clamshell-cli
[7]
https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8
[8]
https://github.com/ruchiraw/sandbox/raw/master/jaggery/1.0.0/m0/org.jaggeryjs.cmd-0.9.0-SNAPSHOT-jar-with-dependencies.jar


-- 

*Ruchira Wageesha**Associate Technical Lead*
*WSO2 Inc. - lean . enterprise . middleware |  wso2.com <http://wso2.com>*

*email: ruch...@wso2.com <ruch...@wso2.com>,   blog:
ruchirawageesha.blogspot.com <http://ruchirawageesha.blogspot.com>,
mobile: +94 77 5493444 <%2B94%2077%205493444>*
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to