<?xml version="1.0"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You 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 FAQ</title>
    <author email="jstrachan@apache.org">James Strachan</author>
  </properties>

  <body>

  <section name="Frequently Asked Questions">
    <p>
      This document attempts to answer some of the more frequently asked
      questions regarding various aspects of Jelly.  These questions are
      typically asked over and over again on the mailing lists, as a
      courtesy to the developers, we ask that you read this document
      before posting to the mailing lists.
    </p>
    <p><strong>General</strong></p>
    <ol>
      <li>
        <a href="#what-is-jelly">
          What is Jelly?
        </a>
      </li>
      <li>
        <a href="#why-called-jelly">
          Why is this called Jelly?
        </a>
      </li>
      <li>
        <a href="#jira">
          How do I report a bug or request a feature?
        </a>
      </li>
    </ol>
    <p><strong>Using Jelly</strong></p>
    <ol>
      <li>
        <a href="#calling-jelly">
          How do I call Jelly from Java code?
        </a>
      </li>
      <li>
        <a href="#command-line">
          How do I invoke Jelly from the command line?
        </a>
      </li>
      <li>
        <a href="#invoke-ant">
          How do I invoke Jelly from inside Ant?
        </a>
      </li>
      <li>
        <a href="#invoke-maven">
          How do I invoke Jelly from inside Maven?
        </a>
      </li>
      <li>
        <a href="#adding-taglibs">
          How do I add my own tag libraries to Jelly?
        </a>
      </li>
      <li>
        <a href="#tag-attributes">
          How do I use expressions and tag attributes?
        </a>
      </li>
      <li>
        <a href="#cdata">
          How do Jelly scripts handle CDATA sections?
        </a>
      </li>
      <li>
        <a href="#escapingJexl">
          How does one write ${a.variable} to the output?
        </a>
      </li>
    </ol>
    <p><strong>Building Jelly</strong></p>
    <ol>
      <li>
        <a href="#how-to-build">
          How do I build Jelly?
        </a>
      </li>
    </ol>

    <section name="General">
      <dl>
        <dt>
          <a name="what-is-jelly">
            What is Jelly?
          </a>
        </dt>
        <dd>
          Jelly is an open and customizable XML processing engine.
          Please see the <a href="index.html">Home page</a> and <a
          href="overview.html">Overview</a> documents for more detail.
        </dd>
      </dl>

      <dl>
        <dt>
          <a name="why-called-jelly">
            Why is this called Jelly?
          </a>
        </dt>
        <dd>
          The name started out as 'Jele' as in Java ELEments but then I thought Jelly was a nicer spelling :-).
          The basic idea behind Jelly that Java code is bound on to XML elements.
        </dd>
        <dd>
          Also Jelly (in British or Jello in American) can be molded to fit any shape required which kinda fits
          with Jelly's main aim to be a flexible Java and XML based scripting engine that can do anything.
        </dd>
        <dd>
          There are many different specific frameworks that take an XML document, bind it to some kind of bean or object
          and then evaluate it in some kind of script or process, so Jelly was an attempt at a generic engine
          using ideas from JSP, JSTL, Velocity, Cocoon and Ant.
        </dd>
      </dl>

      <dl>
        <dt>
          <a name="jira">
            How do I report a bug or request a feature?
          </a>
        </dt>
        <dd>
          Use the Jelly JIRA page: <a href="http://issues.apache.org/jira/browse/JELLY">http://issues.apache.org/jira/browse/JELLY</a>
        </dd>
      </dl>
      
    </section>
    <section name="Using Jelly">
      <dl>
        <dt>
                    <a name="calling-jelly">
                        How do I call Jelly from Java code?
                    </a>
        </dt>
        <dd>
            Try the following code. Note that the runScript() method below is overloaded and can take a File, URL etc.
<code>
<source>
// pass the output of the script somewhere
Writer someWriter = new FileWriter( "output.xml" );
XMLOutput output = XMLOutput.createXMLOutput( someWriter );

// now run a script using a URL
JellyContext context = new JellyContext();
context.runScript( "foo.jelly", output );</source>
</code>
        </dd>
      </dl>

      <dl>
        <dt>
                    <a name="command-line">
                        How do I invoke Jelly from the command line?
                    </a>
        </dt>
        <dd>
            When you build a binary disitribution of Jelly, 
            there is a jelly script which works on Windows and Unixes to run Jelly.
            You can create a binary distribution of Jelly via
            <code>
                maven dist
            </code>
        </dd>
        <dd>
            All you really need to do is to invoke the 
            <i>org.apache.commons.jelly.Jelly</i> class from the command line
            with a correct classpath.
        </dd>
      </dl>
      <dl>
        <dt>
                    <a name="invoke-ant">
                        How do I invoke Jelly from inside Ant?
                    </a>
        </dt>
        <dd>
            There is an Ant task that comes with the Ant library called
            <i>org.apache.commons.task.JellyTask</i> which can be taskdef'd in any Ant script.
        </dd>
      </dl>

      <dl>
        <dt>
                    <a name="invoke-maven">
                        How do I invoke Jelly from inside Maven?
                    </a>
        </dt>
        <dd>
            Maven's maven.xml file is actually a Jelly script; so you can include any Jelly script
            inside any of the Maven goals. So if you want to execute a specific Jelly script you can
            just &lt;j:include uri="foo.jelly" &gt; it inside the maven.xml.
        </dd>
      </dl>

      <dl>
        <dt>
          <a name="adding-taglibs">
            How do I add my own tag libraries to Jelly?
          </a>
        </dt>
        <dd>
          Firstly you need to create one or more tags, by deriving from TagSupport.
          Then create a TagLibrary class for your tags; typically all this does
          is register all the tags in your tag library and give them names.
          Then you can use your new tag library by specifying the classname in
          a namespace URI. For example
        </dd>
        <dd>
<code>
<source>
&lt;j:jelly xmlns:j="jelly:core" xmlns:foo="jelly:com.acme.something.MyTagLibrary"&gt;

  &lt;foo:bar x="12&gt;
    something goes here
  &lt;/foo:bar&gt;

&lt;/j:jelly&gt;
</source>
</code>
        </dd>
        <dd>
          Going forward we hope to provide an alias mechanism using the jar-extension
          mechanism used by JAXP so that a file could be placed on the classpath
          called <code>META-INF/services/org.apache.commons.jelly.foo</code> which
          would contain the class name of the tag library (com.acme.something.MyTagLibrary)
          then you could use it as follows, which would avoid using the class name in your scripts.
        </dd>
        <dd>
<code>
<source>
&lt;j:jelly xmlns:j="jelly:core" xmlns:foo="jelly:foo"&gt;

  &lt;foo:bar x="12&gt;
    something goes here
  &lt;/foo:bar&gt;

&lt;/j:jelly&gt;
</source>
</code>
        </dd>
      </dl>

      <dl>
        <dt>
          <a name="tag-attributes">
            How do I use expressions and tag attributes?
          </a>
        </dt>
        <dd>
          Jelly uses introspection to set the properties on a Tag from the XML attribute
          values. If the attribute value in XML uses an expression, it will be evaluated
          and the result of the expression will be passed into your Tag's setter method.
          For example if you had the following Tag...
        </dd>
        <dd>
<code>
<source>
public class FooTag extends TagSupport {
  private String value;

  public void setValue(String value) {
    this.value = value;


  .
}</source>
</code>
                </dd>
        <dd>
        Then if you were to use it like this...
<code>
<source>
  &lt;my:foo value="${customer.fullName}"/&gt;
</source>
</code>
        Then this would be equivalent in pseudocode to
<code>
<source>
FooTag tag = FooTag();
...
tag.setValue( ((Customer) context.getVariable("customer")).getFullName() );
...
tag.doTag(output);
</source>
</code>
             </dd>
        <dd>
            If ever you find that your Tag's bean property is not being set it could be that your Tag is
            not properly following the bean introspection naming conventions.
            For example do you have a method called getValue() or isValue() with the wrong return type?
            (In this discussion substitute 'value' for the name of your own property, it doesn't have to be called 'value' :).
            For more details of the introspection rules, please checkout the Java Bean specification.
             </dd>
        <dd>
          It could be that you want to coerce the value of an expression to some special type.
          For example if you want to evaluate the expression as an Iterator you can use a property
          on your Tag of type Expression so that in your Tag you can use the Expression.evaluateAsIterator()
          method. This is how the &lt;x:forEach&gt; tag currently is implemented for example.
<source>
public class FooTag extends TagSupport {
  private Expression value;

  public void setValue(Expression value) {
    this.value = value;
  }

  public void doTag(XMLOutput output) {
    Iterator iter = expression.evaluateAsIterator();
            ...
  }
}</source>
        </dd>
      </dl>
            <dl>
        <dt>
          <a name="cdata">
            How do Jelly scripts handle CDATA sections?
          </a>
        </dt>
        <dd>
          Jelly outputs the <i>content</i> of a CDATA section directly.  You can use CDATA sections
          to create output that otherwise cannot be described in XML.  For example, you can use
          a CDATA section to create a DTD.  The following Jelly script:
        </dd>
                <dd>

<source>
&lt;?xml version="1.0"?>

&lt;j:file xmlns:j="jelly:core" var="foo" escapeText="false">
    
    &lt;![CDATA[
        &lt;!DOCTYPE foo [
            &lt;!ELEMENT foo (#PCDATA)>
        ]>
    ]]&gt;
    
    &lt;foo/>
    
&lt;/j:file>
</source>
</dd>
        <dt>
          <a name="escapingJexl">
          How does one write ${a.variable} to the output?
          </a>
        </dt>
        <dd>
          Use the double-dollar as in
        </dd>
                <dd>

<source>
<![CDATA[<?xml version="1.0"?>
<j:jelly xmlns:j="jelly:core">
  This is $${escaped}
</j:jelly>]]></source>
</dd>
      </dl>
    </section>
    <section name="Building Jelly">
      <dl>
        <dt>
          <a name="how-to-build">
            How do I build Jelly?
          </a>
        </dt>
        <dd>
          Jelly uses Maven for its build system. So you should be able to build Jelly just like
          any other Maven enabled project. Please see the
          <a href="http://maven.apache.org/start/index.html">Maven</a>
          documentation for details.
        </dd>
      </dl>
    </section>
  </section>
</body>
</document>
