<?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>Commons JEXL Overview</title>
    </properties>

    <body>
        <section name="Java Expression Language (JEXL)">
            <p>
            JEXL is a library intended to facilitate the implementation of dynamic and scripting features in
            applications and frameworks.
            </p>
            <p>
            It is a small footprint "glueing" API
            - the <a href="apidocs/org/apache/commons/jexl2/package-summary.html#usage">core features</a> fit in
            3 classes and 10 methods - that can be used in various conditions:
                <ul>
                    <li>Module or component configuration:
                        <ul>
                            <li>Your application has configuration files (eventually generated by a design module)
                            consumed by the end-user module that would benefit from variables and expressions.
                            </li>
                            <li>When it would be convenient to use IOC but overall complexity doesn't require
                            (or can't depend upon) a full-blown library (Spring, Guice...).
                            </li>
                        </ul>
                    </li>
                    <li>Loose-coupling of interfaces and implementations or duck-typing:
                        <ul>
                            <li>You have optional classes that your code cant consider as compilation dependencies.</li>
                            <li>You have to integrate and call "legacy" code or use components that you dont want to
                            strongly depend upon.</li>
                        </ul>
                    </li>
                    <li>Basic scripting features:
                        <ul><li>Your application lets (advanced) users evaluate or define some simple expressions
                        like computation formulas.</li></ul>
                    </li>
                    <li>Simple template capabilities:
                        <ul><li>Your application has basic template requirements and JSPs or
                        Velocity would be overkill or too inconvenient to deploy.</li></ul>
                    </li>
                </ul>
            </p>
            <p>
            Its name stands for Java EXpression Language, a simple expression language inspired by Jakarta
            Velocity and the Expression Language defined in the JavaServer Pages Standard Tag Library version 1.1 (JSTL)
            and JavaServer Pages version 2.0 (JSP). JEXL 2.0 adds features inspired by
            <a href="http://java.sun.com/products/jsp/reference/techart/unifiedEL.html">Unified EL</a>.
            </p>
            <p>
            The API and the expression language exploit Java-beans naming patterns through
            introspection to expose property getters and setters. It also considers public class fields
            as properties and allows to invoke any accessible method.
            </p>
            <p>
            JEXL attempts to bring some of the lessons learned by the Velocity
            community about expression languages in templating to a wider audience.
                <a href="http://commons.apache.org/jelly">Commons Jelly</a> needed
            Velocity-ish method access, it just had to have it.
            </p>
            <p>
            It must be noted that JEXL is <strong>not</strong> a compatible implementation of EL as defined
            in JSTL 1.1 (JSR-052) or JSP 2.0 (JSR-152). For a compatible implementation of
            these specifications, see the <a href="http://commons.apache.org/el">Commons EL</a> project.
            </p>
        </section>
    
        <section name="A Brief Example">
            <p>
            When evaluating expressions, JEXL merges an
                <a href="apidocs/org/apache/commons/jexl2/Expression.html">Expression</a>
            with a
                <a href="apidocs/org/apache/commons/jexl2/JexlContext.html">JexlContext</a>.
            An Expression is created using
                <a href="apidocs/org/apache/commons/jexl2/JexlEngine.html#createExpression(java.lang.String)">JexlEngine#createExpression()</a>,
            passing a String containing valid JEXL syntax.  A simple JexlContext can be created by instantiating a
                <a href="apidocs/org/apache/commons/jexl2/MapContext.html">MapContext</a>;
            a map of variables that will be internally wrapped can be optionally provided through its constructor.
            The following example, takes a variable named foo, and invokes the bar() method on the property innerFoo:
            </p>

            <source><![CDATA[
            // Create or retrieve a JexlEngine
            JexlEngine jexl = new JexlEngine();
            // Create an expression object
            String jexlExp = "foo.innerFoo.bar()";
            Expression e = jexl.createExpression( jexlExp );

            // Create a context and add data
            JexlContext jc = new MapContext();
            jc.set("foo", new Foo() );

            // Now evaluate the expression, getting the result
            Object o = e.evaluate(jc);
        ]]>
            </source>
        </section>

        <section name="Extensions to JSTL Expression Language">
            <p>
    While JEXL is similar to the expression language defined in JSTL, it has improved
    upon the syntax in a few areas:
            </p>
            <ul>
                <li>Support for invocation of any accessible method (see example above).</li>
                <li>Support for setting/getting any accessible public field.</li>
                <li>A general <span class="literal">size()</span> method, which works on:
                    <ul>
                        <li><span class="literal">String</span> - returns length</li>
                        <li><span class="literal">Map</span> - returns number of keys</li>
                        <li><span class="literal">List</span> - returns number of elements.</li>
                    </ul>
                </li>
                <li>A general <span class="literal">empty()</span> method, which works on Collections and Strings.</li>
                <li>A general <span class="literal">new()</span> method allowing to instantiate objects.</li>
                <li>Support for the ternary operator 'a ? b : c' - and its GNU-C / "Elvis" variant 'a ?: c'.</li>
                <li>Support for the Perl-like regex matching operators '=~' and '!~'</li>
                <li>Misc : '+' has been overloaded to be use as a String concatenation operator</li>
            </ul>

        </section>

        <section name="Releases">
            <p>
        The current released version is 2.0.
        See the <a href="releases.html">releases</a> page for information on obtaining releases.
            </p>
        </section>

        <section name="Related Resources">
            <p>
          JEXL is not a product of the Java Community Process (JCP), but it provides a
          similar expression syntax.  For more information about JSP 2.0 EL and JSTL 1.1
          EL:
            </p>
            <ul>
                <li>
                    <a href="http://java.sun.com/products/jsp/index.jsp">JSP 2.0</a> is covered
            by Java Specification Requests (JSR) 
                    <a href="http://www.jcp.org/en/jsr/detail?id=152">JSR-152: JavaServer
            Pages 2.0 Specification</a>.
                </li>
                <li>
            Apache has an implementation of the expression language for JSP 2.0,
            called <a href="http://commons.apache.org/el/index.html">EL</a>
                </li>
                <li>
                    <a href="http://java.sun.com/products/jsp/jstl/">JSTL 1.1</a> is covered
            by <a href="http://jcp.org/en/jsr/detail?id=52">JSR 52: A Standard
            Tag Library for JavaServer Pages</a>. See the
                    <a href="http://java.sun.com/products/jsp/jstl/1.1/docs/api/index.html">JSTL API</a>.
                </li>
          <li>Apache has a <a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html">JSTL Implementation</a>.</li>
            </ul>
            <subsection name="Velocity">
                <p>
                    <a href="http://jakarta.apache.org/velocity">Jakarta Velocity</a> implements
            a similar expression language. 
                </p>
                <p>
            In particular the <a href="http://jakarta.apache.org/velocity/user-guide.html#References">References</a>
            section of the User Guide has some good information on properties and method which correlate
            directly to JEXL.
                </p>
            </subsection>
        </section>

        <section name="Anyone Using It Yet?">
            <ul>
                <li>
                    <a href="http://commons.apache.org/configuration">Commons Configuration</a>
                </li>
                <li>
                    <a href="http://commons.apache.org/scxml">Commons SCXML</a>
                </li>
                <li>
                    <a href="http://commons.apache.org/jelly">Jelly</a>
                </li>
            </ul>
        </section>

    </body>
</document>

