<?xml version="1.0"?>
<!-- 
/*
 * Copyright 2001-2006 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>Turbine</title>
 </properties>

 <body>

 <section name="What is Turbine?">

 <p>
    Turbine is a servlet based framework that allows experienced Java
    developers to quickly build secure web applications. Parts of
    Turbine can also be used independently of the web portion of Turbine
    as well. In other words, we strive to make portions of Turbine
    easily available for use in other applications.
 </p>

 <p>
    <strong>A web based application is an application where users use
    their favorite web browser in order to access secure business
    logic.</strong>
 </p>

 <p>
    A couple example web applications that can benefit from using this
    framework include <a
    href="http://www.restorationhardware.com/">e-commerce shopping cart
    systems</a>, Yahoo style link conservatories and <a
    href="http://scarab.tigris.org/">project / bug / issue</a> tracking systems as
    well as cool XML integration applications like <a
    href="http://portals.apache.org/jetspeed-1/">Jetspeed</a>.
 </p>

 <p>
    <strong>A platform for building applications, not just running
    them.</strong>
 </p>

 <p>
    Many commercial (and non-commercial!) software companies will
    attempt to sell you an "Application Server", but what few people
    realize is that it is only half of the battle to creating a web
    application. There is often quite a lot of code that your engineers
    end up re-inventing the wheel with or grabbing various packages from
    all over the net with various licenses that you may or may not agree
    to.
 </p>

 <p>
    The point of Turbine is to collect that code into one location and
    make it easy to create re-usable components (such as
    ParameterParsing, Database Connection Pools, Job Scheduling,
    GlobalCaches, integration with other tools such as Torque, Velocity,
    etc...) all under a <a href="../../common/license.html">license</a>
    (Apache) that allows you to create useful websites for your
    customers without worrying about viral code. Turbine is not the end
    all answer, but it sure is a nice way to make your development life
    easier.
 </p>

 <p>
    This framework has an intended audience that is directed at web
    engineers, not necessarily the web designers. By using this
    framework, it is possible for the web engineers to build intuitive
    high level systems for the web designers to use, but the low level
    framework is strictly for web engineers. Turbine is not a web
    application server. It is a tool for building web applications. Your
    <a href="http://tomcat.apache.org/">servlet engine</a> is your
    application server and the application that you develop using this
    framework is your web application.
 </p>

 <p>
    <strong>Integration with Velocity is well
    defined and makes doing applications using these tools painless for
    both the developers and the web designers!</strong>
 </p>

 <p>
    Turbine can be integrated with existing <a
    href="http://jakarta.apache.org/velocity/">Velocity</a>, <a
    href="http://java.sun.com/products/jsp/">Java Server Pages (JSP)</a>
    and <a href="http://cocoon.apache.org/">Cocoon</a> technologies by
    specially creating Screens that use Services to parse templates.
    Screens can also be created to read files from other websites as
    well as off disk. This makes it easy to have designers simply put
    the body of a page on disk and Turbine can serve these files when
    requested. All of this is described in more detail in the
    documentation section below.
 </p>

 <p>
    The reason why Turbine works so well is because it applies object oriented
    principles to the entire process of building a complex secure web application.
    We try to follow the
    <a href="http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html">Model
    2 methodology</a> yet expand on it to encompass "View" techologies other
    than just JSP as well as more mature methodologies such as
    <a href="./howto/action-event-howto.html">Action
    Event</a> handling. Turbine is consided as Model 2 <strong>+ 1</strong>. :-) Please
    see the <a href="model2+1.html">discussion</a> of Model 2+1 for more information.
 </p>

 <p>
    This all sounds like a bunch of marketing talk, but in reality,
    Turbine has been developed by developers for developers. We are not
    trying to sell you something that does not really work, instead we
    are trying to solve (or do something about) the problems that our
    fellow developers keep having over and over again. Come be a part of
    the revolution!
 </p>

 </section>

<section name="Where do I get releases?">

  <p>
    Currently, the best way to get started with Turbine is to use the
    <a href="/turbine/meta/">Maven Environment for Turbine Applications (M.E.T.A.)</a>.
    You may also need <a href="http://db.apache.org/torque/">Torque</a> which
    you can download from
    <a href="http://db.apache.org/torque/download.html">here</a>.
  </p>

</section>

<section name="How do I contribute, give feedback, fix bugs and so on?">

<p>
We really need and appreciate any contributions you can give. This
includes documentation help, source code and feedback. Discussion
about changes should come in the form of source code and/or very
detailed and well thought out constructive feedback. The <a
href="how-to-help.html">How To Help</a> document has details and hints
how to get engaged with Turbine Development. We also have a <a
href="todo.html">To Do</a> document that describes work to do with
the current Turbine code.
</p>

<ul>
    <li>
        We have a <a href="http://jakarta.apache.org/site/mail.html">Turbine mailing
        lists</a> for discussion.</li>
    <li>
        You can also access the <a href="cvs-usage.html">Turbine CVS 
        repository</a></li>
</ul>

</section>

 </body>
 </document>
