<?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>Powered By Jelly</title>
    <author email="jstrachan@apache.org">James Strachan</author>
  </properties>

  <body>
    <section name="Powered By Jelly">
      <p>
        This page contains a list of known projects successfully using
        Jelly.  We would be very interested if you would drop us a note
        if you are using Jelly with your project and would like to be
        added to this list.
      </p>
      <subsection name="Projects Using Jelly">
      <table>
        <tr><th>Project</th><th>Overview</th></tr>
        <tr>
          <td><a href="http://aft.sourceforge.net/">Anteater</a></td>
          <td>
            A testing framework which provides an easy way to write tests for checking the functionality of a 
            Web application or of an XML Web service.
          </td>
        </tr>
        <tr>
          <td><a href="http://drools.org/">Drools</a></td>
          <td>
            A Java rules engine.
          </td>
        </tr>
        <tr>
          <td><a href="http://blissed.werken.com/">Blissed</a></td>
          <td>
            A Java process and state framework.
          </td>
        </tr>
        <tr>
          <td><a href="http://jakarta.apache.org/commons/latka/">Latka</a></td>
          <td>
            A functional (end-to-end) testing tool implemented in Java, and using an XML syntax to 
            define a series of HTTP (or HTTPS) requests and a set of validations used to verify that 
            the request was processed correctly. 
          </td>
        </tr>
        <tr>
          <td><a href="http://maven.apache.org/">Maven</a></td>
          <td>
            A java project management and project comprehension tool.
          </td>
        </tr>
        <tr>
          <td><a href="http://nanning.sourceforge.net/">Nanning</a></td>
          <td>
            A simple yet scaleable aspect-oriented framework for Java
          </td>
        </tr>
        <tr>
          <td><a href="http://seedling.sourceforge.net">Seedling</a></td>
          <td>
            A generic application platform that enables streamlined development of Java applications from 
            reusable components. In particular JellyUnit and JellySwing are used to implement Swing based
            unit testing.
          </td>
        </tr>
        <tr>
          <td><a href="http://werkflow.werken.com/">Werkflow</a></td>
          <td>
            A Java workflow system.
          </td>
        </tr>
      </table>
    </subsection>
    </section>
  </body>
</document>
