<html>
<!--
   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.
-->
<head>
<title>Status File for Apache Commons "Jexl" Package</title>
</head>
<body bgcolor="white">


<div align="center">
<h1>The Apache Commons <em>Jexl</em> Package</h1>
$Id$<br/>
<a href="#Introduction">[Introduction]</a>
<a href="#Dependencies">[Dependencies]</a>
<a href="#Release Info">[Release Info]</a>
<a href="#Committers">[Committers]</a>
<a href="#Action Items">[Action Items]</a>
<br/><br/>
</div>


<a name="Introduction"></a>
<h3>1.  INTRODUCTION</h3>

<p>
The <em>Jexl</em> package implements a simple expression language
engine. It borrows many ideas from the JSTL Expression Language. Liberally.
Ok, it's an attempt at an idependent implementation of the JSTL EL with
extensions.
</p>

<a name="Dependencies"></a>
<h3>2.  DEPENDENCIES</h3>

<p>The <em>Jexl</em> package is dependent upon the following external
components for development and use:</p>
<ul>
<li>
    <a href="http://java.sun.com/j2se">Java Development Kit</a>
    (Version 1.5 or later)
</li>
<li>
  <a href="http://commons.apache.org/logging/">Apache Commons Logging</a>
    (Version 1.0.1 or later)
</li>
<li>
  <a href="http://jakarta.apache.org/velocity/">Jakarta Velocity DVSL</a>
    (any version) - for documentation generation
</li>
<li>
  <a href="http://www.dom4j.org/">dom4j</a>
    (latest version) - for documentation generation
</li>
<li>
<a href="http://www.junit.org">JUnit Testing Framework</a>
    (Version 3.8.2 or later) - for unit tests only, not required
    for deployment
</li>
</ul>

<a name="Release Info"></a>
<h3>3.  RELEASE INFO</h3>

<p>Current Release: 1.1</p>

<p>Planned Next Release: 2.0</p>

<a name="Committers"></a>
<h3>4.  COMMITTERS</h3>

<p>The following individuals are the primary developers and maintainers of this
component.  Developers who plan to use <em>Jexl</em> in their own
projects are encouraged to collaborate on the future development of this
component to ensure that it continues to meet a variety of needs.</p>
<ul>
   <li><a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a></li>
   <li><a href="mailto:jstrachan@apache.org">James Strachan</a></li>
   <li><a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a></li>
   <li><a href="mailto:proyal@apache.org">Peter Royal</a></li>
   <li><a href="mailto:henrib@apache.org">Henri Biestro</a></li>
</ul>

<a name="Action Items"></a><h3>5.  ACTION ITEMS</h3>

<p>Want to help?  Here's some "to do" items the team has identified.</p>

<table border="1">
  <tr>
    <th width="80%">Action Item</th>
    <th width="20%">Volunteer</th>
  </tr>

  <tr>
    <td>Please read the TODO.txt document in CVS</td>
    <td align="center">&nbsp;</td>
  </tr>

  </table>

</body>
</html>