
                  A  P  A  C  H  E     C  O  C  O  O  N

                                @version@

  What is it?
  -----------

  Apache Cocoon is a web development framework built around the concepts of
  separation of concerns (making sure people can interact and collaborate on a
  project, without stepping on each other toes) and component-based web
  development.

  Cocoon implements these concepts around the notion of 'component pipelines',
  each component on the pipeline specializing on a particular operation. This
  makes it possible to use a Lego(tm)-like approach in building web solutions,
  hooking together components into pipelines without any required programming.

  Cocoon is "web glue for your web application development needs". It is a glue
  that keeps concerns separate and allows parallel evolution of all aspects of
  a web application, improving development pace and reducing the chance of
  conflicts.

  Requirements
  ------------

  Cocoon has been designed to coexist and interoperate side-by-side with your
  existing J2EE solutions or to give them new functionality without requiring
  any change in the existing infrastructure.

  Cocoon is implemented both as a Java servlet and a Java command line
  application. The following requirements exist for installing it:

   o  A Java 1.6.0 or later compatible virtual machine for your operating system. 
      The build system is only compatible with JDK up to 1.8, but later versions could be used at runtime.

   o  A Servlet API 2.3 compatible Servlet Engine or J2EE Application Server.
      [not required for command line operation]

  Installation Instructions and Documentation
  -------------------------------------------

  Read the INSTALL.txt file in this directory for the installation instructions.

  The documentation is available as a separate download package. Read the INSTALL.txt
  for more information.

  If you are updating from a previous release of Cocoon, make sure
  that you read the installation instructions on updating first.

  Look for the most updated documentation on the Apache Cocoon web site
  (http://cocoon.apache.org/).

  Licensing and legal issues
  --------------------------

  Cocoon is licensed under the Apache License, version 2.0
  See the files in the top-level of the Cocoon distribution called
  LICENSE.txt and NOTICE.txt and see licenses for accompanying products
  in the "legal" directory.

  Credits
  -------

  For more information on credits and due reference to included software, please
  read the CREDITS.txt file in this directory.


  Thanks for using Apache Cocoon.

                                           The Apache Cocoon Project
                                           http://cocoon.apache.org/

