blob: d6e257908dfe35fc967c4b708e061e272c48e674 [file] [log] [blame]
<?xml version="1.0"?>
<!--
Copyright 2002,2004 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<title>Jelly : Executable XML</title>
<author email="jstrachan@apache.org">James Strachan</author>
</properties>
<body>
<section name="Jelly : Executable XML">
<p><em>Jelly</em> is a tool for turning XML into executable code.
So Jelly is a Java and XML based scripting and processing engine.
Jelly can be used as a more flexible and powerful front end
to <a href="http://jakarta.apache.org/ant/">Ant</a>
such as in the <a href="http://maven.apache.org/">Maven</a>
project, as a testing framework such as <a href="jellyunit.html">JellyUnit</a>,
in an intergration or workflow
system such as <a href="http://werkflow.werken.com/">werkflow</a>
or as a page templating system inside engines like
<a href="http://cocoon.apache.org/">Cocoon</a>.
</p>
<p>
Jelly borrows many good ideas from both JSP custom tags, Velocity, Cocoon, Ant.
Jelly can be used from the command line, inside Ant and
Maven or inside a Servlet, Web Service, JMS MessageListener or embedded directly into your software.
</p>
<p>
Jelly has native support for a Velocity-like expression language called
<a href="http://jakarta.apache.org/commons/jexl/">Jexl</a>
which is a superset of the JSP, JSTL and JSF expression languages
as well as support for other pluggable expression languages like XPath via
<a href="http://jaxen.org">Jaxen</a>, JavaScript, beanshell and Jython.
</p>
<p>
Jelly is completely extendable via custom tags in a similar way to JSP custom tags or Ant tasks.
Though Jelly is really simple and has no dependencies either Servlets or JSP.
So you could think of Jelly as similar to an XML-ized Velocity where the directives are XML tags.
Or you could think of Jelly as a more flexible engine for processing Ant tasks with better expression,
logic and looping support.
</p>
<p>
Jelly is also based on an XML pipeline architecture, like Cocoon, so that it is ideal for processing XML,
scripting web services, generating dynamic web content or being part of a content generation
system such as Cocoon.
</p>
</section>
<section name="How it works">
<p>A Jelly script is an XML document which gets parsed into a Script. The script can then be ran to produce
dynamic XML events which can then be turned into text, XML, HTML etc.
</p>
<p>
Rather like Velocity, the XML can contain expressions to make the output dynamic and can work with a variable
context.
</p>
<source>
&lt;document time="${now}"&gt;
Welcome ${user.name} to Jelly!
&lt;/document&gt;
</source>
<p>
XML elements can be bound to some Java code to implement some kind of dynamic processing.
The default way to do this is to implement Jelly <i>Tags</i> which are Java Beans which also implement Jelly's
<a href="apidocs/org/apache/commons/jelly/Tag.html">Tag</a> interface.
</p>
<p>
When a Jelly script is run, the properties of the Jelly Bean are configured using the XML attributes.
Then the tag is run by calling its <i>doTag()</i> method.
The Tag can then perform some processing and invoke its body (the contents of the XML element)
if it wishes, however many times it wants. So Jelly Tags are very like JSP custom tags and analogous
to <i>directives</i> in Velocity..
</p>
<p>
There is an Ant Tag Library which allows all Ant tasks to be used inside a Jelly script.
</p>
<p>
Also Jelly Tags can be defined at runtime in dynamic Jelly script using the
<a href="libs/define/tags.html">define</a> tag
library so that simple yet powerful macros can be made very easily using just Jelly script.
</p>
<p>
<i>Jelly Beans</i> can be created with the define tag library. A Jelly Bean is where a regular
Java Bean can be bound to a Jelly tag. If the bean implements the Runnable interface or has some kind
of invokable method, like run(), invoke() or execute() then the bean will also be invoked by the tag.
</p>
<p>
For example imagine if you had written the following bean
</p>
<source>
public class MyTask {
// 'doIt' method that does some function/task...
public void run() throws SomeException {
// do something...
}
// Properties, can be any type
public void setX(int x) {
this.x = x;
}
public void setY(String y) {
this.y = y;
}
}
</source>
<p>
Then you can use this bean in a script by defining a new tag library and
then using the new tag as follows...
</p>
<source>
&lt;j:jelly xmlns:j="jelly:core" xmlns:define="jelly:define" xmlns:my="myTagLib"&gt;
&lt;define:taglib uri="myTagLib"&gt;
&lt;define:jellybean name="foo" className="MyTask"/&gt;
&lt;/define:taglib&gt;
Now lets use the new tag
&lt;my:foo x="2" y="cheese"/&gt;
&lt;/j:jelly&gt;
</source>
<p>
This mechanism is kinda similar to using a &lt;taskdef&gt; in Ant except that the
bean can be anything, it doesn't need to derive from Ant's Task - it can be
any java object with some kind of 'doIt' method which takes no arguments.
Indeed the method name can be set via &lt;define:jellybean method="doIt"/&gt;
</p>
</section>
<section name="JSTL">
<p>
<a href="http://java.sun.com/products/jsp/jstl/">JSTL</a>
is the JSP Standard Tag Library which is standardized through the JCP process.
</p>
<p>
Jelly implements a collection of JSTL tags to perform core features like
expression evaluation, conditional branching and looping, as well the processing of beans, XML, XPath and SQL.
</p>
<p>
Jelly can act as a stand alone lightweight engine for running JSTL
scripts which can be run from the command line or from Ant or that can be easily
embedded into SOAP services, Servlet engines, JMS MessageListeners or your own software.
</p>
<p>
In addition Jelly allows the JSTL tags to be used to create unit testing scripts
for web applications and web services.
</p>
</section>
<section name="Ant">
<p>
There is a JellyTask for calling Jelly from
<a href="http://jakarta.apache.org/ant/">Ant</a>
as well as a Jelly tag library for using any Ant Tasks inside a Jelly script!
</p>
<p>
Jelly's support the Jexl expression language which is a superset of the expression language in JSTL
and Ant's expression language, means that Ant properties can be used inside Jelly scripts seamlessly
while also working with beans, properties, collections, method calls etc.
</p>
<p>
So Jelly can be thought of as a more flexible scripting and processing engine for Ant, kinda like
a combination of Ant, Velocity and JSP.
</p>
</section>
<section name="XML and Web Services">
<p>
Jelly is based on an XML event pipeline architecture (SAX), like Cocoon, rather than being purely text
based like JSP and Velocity. This means that Jelly tags can consume XML events and emit them. Each
Jelly Tag can then act as an XML source, result, filter or transformation.
</p>
<p>
Also because Jelly works on an XML event pipeline, XML can be processed very efficiently without redundant
runtime parsing.
Once a Jelly script is parsed, it can be cached so that whenever it is run, no XML parsing is usually necessary of the input or the output.
</p>
<p>
In addition there is a tag library called the Jelly Stylesheet Library (
<a href="libs/jsl/tags.html">JSL</a>) for
performing XSLT-style declarative processing of XML documents using a pattern match approach.
</p>
<p>
Using the dynamic tag creation features of the <i>define</i> tag library we can easily script SOAP services using
a simple tag based macro language.
</p>
<p>
For example the following piece of Jelly script could evaluate its dynamic
body (which can contain any Jelly tags, JSTL or Ant tasks) then convert the body into the correct SOAP message, call a SOAP service
then format the results neatly as XML.
</p>
<source>
&lt;babelfish:translate from="en" to="fr"&gt;
Welcome ${user.name} to Jelly!
&lt;/babelfish:translate&gt;
</source>
<p>
A Jelly script is an XML document, which means that Jelly can process itself.
All of these things make Jelly a good choice for for working with XML and Web Services.
</p>
</section>
<section name="Other uses">
<p>
We hope Jelly can be both generic and powerful XML processing and transformation engine,
a web and XML based scripting engine as well as a unit testing framework for
testing web applications and web services.
</p>
<p>
Currently Jelly is being used inside <a href="http://maven.apache.org/">Maven</a>
to provide more flexible and powerful build mechanism while still preserving investment in Ant tasks.
</p>
</section>
<section name="JSTL References">
<ul>
<li><a href="http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html">JSTL Tag reference</a></li>
<li><a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/index.html">JSTL API</a></li>
<li><a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html">Apache JSTL Implementation</a></li>
</ul>
</section>
</body>
</document>