
  Installation of the source version of Apache Lenya 1.2.x
  ========================================================

  This is an abbreviated version of the installation instructions found
  at http://lenya.apache.org/docs/1_2_x/installation/source_version.html

  It is assumed that you follow the preparation steps, otherwise make 
  sure to adjust some values in local.build.properties 
  (see below, check website)

  This document covers

	* Standalone Installation (using the built-in Jetty)
	* Installation with Apache Tomcat

  You will need

	* Java 2 Platform, Standard Edition
	  version 1.4.2 or newer, 1.5.x works too.

	* Apache Cocoon, version 2.1.7 or newer
	  Available from http://cocoon.apache.org/mirror.cgi

	* Apache Tomcat, version 5
	  (optional, only if you don't want to use the built-in Jetty)

  Don't install Tomcat in a location with spaces in the path!
  On Windows, put it directly in C:\tomcat rather than
  C:\Program Files\Apache Software Foundation\Tomcat 5.0

  Preparation:

	1.	Create a directory src/ in a location with no spaces in the path

	2.	Unpack Cocoon in src/, thereby creating src/cocoon-2.1.7

	3.	Unpack Lenya in src/, thereby creating src/lenya-1.2.x

  Build Cocoon

	1.	Copy
			src/lenya-1.2.x/src/cocoon/local.build.properties
			src/lenya-1.2.x/src/cocoon/local.blocks.properties

		to	src/cocoon-2.1.7/

	2.	Go to src/cocoon-2.1.7 and type

			./build.sh on Unix
			build.bat  on Windows

  Standalone Installation (using the built-in Jetty)

	1.	Configure Lenya

		In lenya-1.2.x, copy

			build.properties

		to	local.build.properties
 
		Edit local.build.properties and make sure that

			cocoon.src.dir=../cocoon-2.1.7
			web.app.server=Jetty

		If you want to upload files to your Lenya website
		(images, other assets), set

			enable.uploads=true 

	2.	Build Lenya 

		In lenya-1.2.x, execute

			./build.sh on Unix
			build.bat  on Windows

		If you need to re-build Lenya, issue

			./build.sh clean on Unix
			build.bat clean  on Windows

		to clear the build directory prior to your next build.

	3.	Start Lenya/Jetty

		In lenya-1.2.x, type

			./lenya.sh servlet on Unix
			lenya.bat servlet  on Windows

	4.	Test the Installation

		Point your browser to http://localhost:8888

  End of standalone installation using the built-in Jetty
  ----

  Installation with Apache Tomcat

	1.	Configure Lenya

		In lenya-1.2.x, copy

			build.properties

		to	local.build.properties

		Edit local.build.properties and make sure that

			cocoon.src.dir=../cocoon-2.1.7
			web.app.server=Tomcat
			tomcat.home.dir=[path_to_tomcat]

		If you want to upload files to your Lenya website
		(images, other assets), set

			enable.uploads=true

		If this is an update to a previous installation of Lenya,
		carefully check

			target.install.excludes=
			target.reset.excludes=

	2.	Build Lenya

		In lenya-1.2.x, execute

			./build.sh on Unix
			build.bat  on Windows

		This will build Lenya and copy all files to the Tomcat
		webapp directory.

		If you need to re-build Lenya, issue

			./build.sh clean on Unix
			build.bat clean  on Windows

		to clear the build directory prior to your next build
		This will also remove Lenya from the webapps directory,
		unless you set target.reset.exludes accordingly.

	3.	Restart Tomcat

		On Unix, this cane be done with

			tomcat/bin/shutdown.sh
			tomcat/bin/startup.sh

		On Windows, point and click accordingly

	4.	Test the Installation

		Point your browser to http://localhost:8080/lenya
