<?xml version="1.0"?>
<!-- 
/*
 * Copyright 2001-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>
  <header>
    <title>VAJava and WebSphere Test Environment</title>
  </header>

  <body>

    <section name="Forewords and Requirements">

      <p>
        This tutorial explains how to run Turbine within VisualAge for
        Java WebSphere Test Environment.
      </p>
      <p>
        This tutorial works with VAJava 3.5.2 and 3.5.3. Please tell us if you 
        find that it works with other versions.
      </p>

    </section>

    <section name="Step 1 : Import the correct packages in VAJava">

      <p>
        Let's assume the following conventions :
        <strong><code>{Turbine dir}</code></strong> is the directory where you
        have unzipped the Turbine distribution or sources and
        <strong><code>{VAJava dir}</code></strong> is the directory where
        VAJava is installed. Let's also define <strong><code>{WTE dir}</code>
        </strong> to be the WebSphere Test Environment directories, i.e.
        <code>{VAJava dir}/ide/project_resources/IBM WebSphere Test
        Environment</code>.
      </p>

      <p>
        You need to create a project : Turbine
      </p>
      
      <p>
        Import into Turbine project all JARS/SRC associated with the specific 
        Turbine release
      </p>      

    </section>

    <section name="Step 2 : Modify WebSphere Test Environment">

      <section name="Edit default.servlet_engine">

        <p>
          Edit <code>{WTE dir}/properties/default.servlet_engine</code> and
          add the following under the <code>default_app</code> webgroup :
        </p>

<source><![CDATA[
    <websphere-webgroup name="turbine">
       <description>Turbine Application Framework</description>
       <document-root>$approot$/web</document-root>
       <classpath>$approot$/servlets</classpath>
       <root-uri>/turbine</root-uri>
       <auto-reload enabled="true" polling-interval="3000"/>
       <shared-context>false</shared-context>
    </websphere-webgroup>
]]></source>

      </section>

      <section name="Create a turbine directory">

        <p>
          Create a directory called <code>turbine</code> under
          <code>{WTE dir}/hosts/default_host</code>. Under <code>turbine</code>
          create another 2 subdirectories : <code>servlets</code> and
          <code>web</code>.
        </p>
        
        <p>
	Create the following directories (which is similiar to the TDK distribution)
	under the web directory.
	<li> images </li>
	<li> logs </li>
	<li> resources</li>
	<li> stylesheets</li>
	<li> templates</li>
	<li> WEB-INF/conf</li>
        </p>    
        <p>
        Copy the TurbineResource.properties file to the "WEB-INF/conf" directory. The templates, 
        logs etc. directories are quite self explanetory I think.
        </p>    

      </section>

      <section name="Create a turbine.webapp file">

        <p>
          Create a <code>turbine.webapp</code> file in
          <code>{WTE dir}/host/default_app/servlets</code> and put the following
          content :
<source><![CDATA[
<webapp>
   <name>turbine</name>
   <description>Turbine Application Framework</description>
   <error-page>/ErrorReporter</error-page>

   <servlet>
      <name>turbine</name>
      <description>Turbine Application Framework</description>
      <code>org.apache.turbine.Turbine</code>
      <servlet-path>/ServletRedirector</servlet-path>
      <autostart>true</autostart>
   </servlet> 
 </webapp>
]]></source>          
        </p>

      </section>

    </section>

    <section name="Step 3 : Edit VAJava workspace classpath">

      <p>
        In the WebSphere Test Environment under Servlet Engine, add Turbine to the classpath.
      </p>

    </section>
  </body>
</document>

