You are viewing a plain text version of this content. The canonical link for it is here.
Posted to tdk-dev@turbine.apache.org by jv...@apache.org on 2001/05/25 08:27:48 UTC

cvs commit: jakarta-turbine-tdk/src/share/sample/templates/jsp/tld Test.tld

jvanzyl     01/05/24 23:27:48

  Added:       src/share/sample/WEB-INF web.xml
               src/share/sample/WEB-INF/build GETTING_STARTED.txt
                        build.properties build.xml
               src/share/sample/WEB-INF/conf project-inputs.xml
                        project-schema.xml
               src/share/sample/WEB-INF/src/java/modules/actions SQL.java
                        SecureAction.java Upload.java
               src/share/sample/WEB-INF/src/java/modules/screens Form.java
                        Index.java SecureScreen.java
               src/share/sample/WEB-INF/src/java/modules/tags
                        UserInfoTag.java
               src/share/sample/images tdm.jpg
               src/share/sample/resources/ui/skins/default skin.props
               src/share/sample/resources/ui/skins/default/images
                        alert1.gif alter2.gif line.gif
               src/share/sample/templates/app GlobalMacros.vm
               src/share/sample/templates/app/layouts Default.vm Login.vm
               src/share/sample/templates/app/navigations DefaultBottom.vm
                        DefaultTop.vm Menu.vm
               src/share/sample/templates/app/screens Error.vm Form.vm
                        Index.vm Insert.vm Login.vm Upload.vm
                        UploadComplete.vm
               src/share/sample/templates/jsp/screens Index.jsp Login.jsp
               src/share/sample/templates/jsp/tld Test.tld
  Log:
  - new sample application directory, everything setup to mirror
    the final build. before bits we're being pulled from the common/
    and the velocity/peer/ which is confusing. the process should
    be a lot easier to understand for those who eventually help
    develop the tdk.
  
  Revision  Changes    Path
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/web.xml
  
  Index: web.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">
  
  <web-app>
      <servlet>
          <servlet-name>
             @PROJECT@
          </servlet-name>
          <servlet-class>
              org.apache.turbine.Turbine
          </servlet-class>
  
          <init-param>
              <param-name>properties</param-name>
              <!-- This is relative to the docBase -->
              <param-value>
                  /WEB-INF/conf/TurbineResources.properties
              </param-value>
          </init-param>
      </servlet>
      <security-constraint>
          <web-resource-collection>
              <web-resource-name>templates</web-resource-name>
              <url-pattern>/templates/*</url-pattern>
          </web-resource-collection>
          <web-resource-collection>
              <web-resource-name>logs</web-resource-name>
              <url-pattern>/logs/*</url-pattern>
          </web-resource-collection>
          <auth-constraint>
              <role-name>admin</role-name>
          </auth-constraint>
      </security-constraint>
      <login-config>
          <auth-method>BASIC</auth-method>
          <realm-name>Templates</realm-name>
      </login-config>
  </web-app>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/build/GETTING_STARTED.txt
  
  Index: GETTING_STARTED.txt
  ===================================================================
  --------------------------------------------------------------------------
  G E T T I N G  S T A R T E D  G U I D E
  --------------------------------------------------------------------------
  
  Hey! You made it!
  
  To get the sample peer application running you must edit
  a few properties in your ./project/newapp.properties file
  and run the "init" target in the provided Ant build file.
  
  YOU MUST RUN THE INITIALIZATION TARGET OR NOTHING
  WILL WORK!!! YOU HAVE BEEN WARNED!!
  
  You must edit the following properties in your
  ./project/newapp.properties file:
  
  database
  targetPlatform
  targetPlatformExt
  databaseUrl
  databaseDriver
  databaseUser
  databasePassword
  
  There is documentation inside your ./project/newapp.properties
  file describing your options in each case.
  
  After you have edited your properties, you should run the
  initialization target of your build file:
  
      ant init 
  
  You must have an installed version of Ant, if you
  do not have an installed version of Ant you can
  find instructions here:
  
  http://jakarta.apache.org/ant/manual/install.html
  
  Running the "init" target will run the following set
  of targets for you automatically:
  
   1. turbine-sql
   2. turbine-id-table-sql
   3. turbine-id-table-init-sql
   4. turbine-security-sql
   5. project-sql
   6. project-id-table-init-sql
   7. create-database
   8. insert-sql
   9. project-om
  10. compile
  
  Running these targets should completely setup the sample
  peer application. Everything database related should be
  working at this point, and all the required Java sources
  should have been generated and compiled. Now all you
  have to do is:
  
  http://localhost:8080/newapp/servlet/newapp
  
  This process is not perfect: it works well in the
  first pass running the init target but there is one
  prominent defect. After you run the init target any
  subsequent changes to your database properties will
  not automatically be propagated to your TR.props, even
  if you run the init target again. If you change your db 
  configuration after the init target is run you will have 
  to manually edit your TR.props. Sorry for the
  inconvenience.
  
  But otherwise, Enjoy!!
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/build/build.properties
  
  Index: build.properties
  ===================================================================
  # -------------------------------------------------------------------
  # 
  # P R O J E C T  P R O P E R T I E S
  # 
  # -------------------------------------------------------------------
  # These are the properties for your Turbine project. The properties
  # in this file will override properties set anywhere else. 
  # -------------------------------------------------------------------
  
  project=@PROJECT@
  
  # -------------------------------------------------------------------
  # 
  #  T A R G E T  D A T A B A S E
  #
  # -------------------------------------------------------------------
  # This is the target database, only considered when generating
  # the SQL for your Turbine project. Your possible choices are
  #
  # db2
  # hypersonic
  # mysql
  # oracle,
  # postgresql
  #
  # Default: none
  # -------------------------------------------------------------------
  
  database=@DATABASE@
  #database.manual.creation = true
  
  # -------------------------------------------------------------------
  # 
  #  T A R G E T  P L A T F O R M
  #
  # -------------------------------------------------------------------
  # Your options for targetPlatform are: unix | windows
  # Your options for targetPlatformExt are: sh | bat
  # -------------------------------------------------------------------
  
  targetPlatform = unix
  targetPlatformExt = sh
  
  # -------------------------------------------------------------------
  # 
  #  O B J E C T  M O D E L  I N F O R M A T I O N
  #
  # -------------------------------------------------------------------
  # These settings will allow you to customize the way your
  # Peer-based object model is created.
  # -------------------------------------------------------------------
  
  extend=TurbineMapBuilder
  mapname=TurbineMap
  suffix=MapBuilder
  targetPackage=@TARGET_PACKAGE@.om
  addSaveMethod=true
  addGetByNameMethod=false
  complexObjectModel=true
  basePrefix=Base
  
  # -------------------------------------------------------------------
  # 
  #  D A T A B A S E  S E T T I N G S
  #
  # -------------------------------------------------------------------
  # JDBC connection settings. This is used by the JDBCToXML task that
  # will create an XML database schema from JDBC metadata. These
  # settings are also used by the SQL Ant task to initialize your
  # Turbine system with the generated SQL.
  # -------------------------------------------------------------------
  
  #--------------------------------------------------------------------
  # HSQL use
  # FULLPATH = full path to where you want the database
  # Note: either torque or HSQL is really touchy about extra spaces
  # or other stuff after each line below.
  #--------------------------------------------------------------------
  #databaseUrl=jdbc:HypersonicSQL:FULLPATH/@PROJECT@
  #databaseDriver=org.hsql.jdbcDriver
  #databaseUser=sa
  #databasePassword=
  
  databaseUrl = jdbc:mysql://127.0.0.1/@PROJECT@
  databaseDriver = org.gjt.mm.mysql.Driver
  databaseUser = user
  databasePassword = password
  databaseHost = 127.0.0.1
  
  # -------------------------------------------------------------------
  # You should NOT have to edit anything below here.
  # -------------------------------------------------------------------
  
  # -------------------------------------------------------------------
  # 
  #  T E M P L A T E  P A T H
  #
  # -------------------------------------------------------------------
  
  templatePath = @TEMPLATE_PATH@
  
  # -------------------------------------------------------------------
  # 
  #  C O N T R O L  T E M P L A T E S
  #
  # -------------------------------------------------------------------
  
  SQLControlTemplate = sql/base/Control.vm
  OMControlTemplate = om/Control.vm
  idTableControlTemplate = sql/id-table/Control.vm
  securityControlTemplate = sql/security/Control.vm
  
  # -------------------------------------------------------------------
  # 
  #  O U T P U T  D I R E C T O R Y
  #
  # -------------------------------------------------------------------
  # The two properties are identical but they are like this for
  # a reason. They are for testing the TDK, the reason they
  # are duplicated is due to a bug in Ant with the <exec> task.
  # -------------------------------------------------------------------
  
  outputDirectory = @OUTPUT_DIRECTORY@
  fullPathOutputDirectory = @OUTPUT_DIRECTORY@
  
  # -------------------------------------------------------------------
  # 
  #  S C H E M A  D I R E C T O R Y
  #
  # -------------------------------------------------------------------
  
  schemaDirectory = @SCHEMA_DIRECTORY@
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/build/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <!-- Build file for application -->
  <project name="peer" default="compile" basedir=".">
  
    <!-- Build classpath -->
    <path id="classpath">
      <fileset dir="../lib">
        <include name="**/*.jar"/>
      </fileset>
      <fileset dir="../../../../bin">
        <include name="**/servlet*.jar"/>
      </fileset>
    </path>
  
    <!-- Give user a chance to override without editing this file 
    (and without typing -D each time it compiles it) -->    
    
    <property file="build.properties"/>
    <property file="${user.home}/build.properties"/>
    <property name="build.properties" value="build.properties"/>
    
    <property name="project" value="@PROJECT@"/>
    <property name="version" value="0.1"/>
    <property name="build.dest" value="../classes"/>
    <property name="src.dir" value="../src/java"/>
    <property name="final.name" value="${project}-${version}"/>
    <property name="final.dir" value="../${final.name}/"/>
    <property name="ant.home" value="."/>
    <property name="debug" value="on"/>
    <property name="optimize" value="off"/>
    <property name="deprecation" value="on"/>
  
    <!-- ================================================================ -->
    <!-- I N I T  T A S K  T A R G E T                                    -->
    <!-- ================================================================ -->
    <!-- Taskdefs are defined inside this target as Ant seems to have     -->
    <!-- problems defining them at the top level.                         -->
    <!-- ================================================================ -->
  
    <target name="init-tasks">
      
      <taskdef name="torque-sql" 
        classname="org.apache.turbine.torque.TorqueSQLTask">
        <classpath refid="classpath"/>
      </taskdef>
      
      <taskdef name="torque-om" 
        classname="org.apache.turbine.torque.TorqueObjectModelTask">
        <classpath refid="classpath"/>
      </taskdef>
      
      <taskdef name="sql-xml" 
        classname="org.apache.turbine.torque.TorqueSQLTransformTask">
        <classpath refid="classpath"/>
      </taskdef>
      
      <taskdef name="texen" 
        classname="org.apache.velocity.texen.ant.TexenTask">
        <classpath refid="classpath"/>
      </taskdef>
    
    </target>
  
    <!-- =================================================================== -->
    <!-- Compiles the source directory                                       -->
    <!-- =================================================================== -->  
    <target name="compile">
          
      <javac srcdir="${src.dir}"
        destdir="${build.dest}"
        debug="${debug}"
        deprecation="${deprecation}"
        optimize="${optimize}">
              
        <classpath refid="classpath"/>
  
      </javac>
    </target>
  
    <!-- ================================================================ -->
    <!-- I N I T  T A R G E T                                             -->
    <!-- ================================================================ -->
    <!-- You will probably only run this target once. It will generate    -->
    <!-- your sources for you and compile them.                           -->
    <!-- ================================================================ -->
  
    <target name="init">
      
      <!-- Create all the necessary SQL -->
      
      <antcall target="turbine-sql"/>
      <antcall target="turbine-id-table-sql"/>
      <antcall target="turbine-id-table-init-sql"/>
      <antcall target="turbine-security-sql"/>
      <antcall target="project-sql"/>
      <antcall target="project-id-table-init-sql"/>
      
      <!-- Create the database and insert the SQL -->
      
      <antcall target="create-database"/>
      <antcall target="insert-sql"/>
      
      <!-- Generate the project OM and compile the sources -->
      
      <antcall target="project-om"/>
      <antcall target="compile"/>
      
      <!-- 
        Update the TurbineResources.properties file with
        the info user should have put in the project
        properties file :-)
      -->
      
      <antcall target="update-tr-props"/>
    
    </target>
  
    <!-- ================================================================ -->
    <!-- C R E A T E  T A R G E T  D A T A B A S E                        -->
    <!-- ================================================================ -->
    <!-- Create the target database by executing a generated script       -->
    <!-- that is capable of performing the task.                          -->
    <!-- ================================================================ -->
    <target name="create-database" depends="init-tasks" unless="database.manual.creation">
      
      <property name="script" value="create-database.${targetPlatformExt}"/>
      
      <texen
        controlTemplate="sql/db-init/Control.vm"
        outputDirectory="${outputDirectory}/sql"
        templatePath="${templatePath}"
        outputFile="${script}"
        contextProperties="${build.properties}"
      />
      
      <chmod file="${outputDirectory}/sql/${script}" perm="+x"/>
      <exec executable="${fullPathOutputDirectory}/sql/${script}"/>
      
    </target>
  
    <!-- ================================================================ -->
    <!-- G E N E R A T E  P R O J E C T  S Q L                            -->
    <!-- ================================================================ -->
    <!-- Generate the SQL for your project, these are in addition         -->
    <!-- to the base Turbine tables! The tables you require for your      -->
    <!-- project should be specified in project-schema.xml.               -->
    <!-- ================================================================ -->
  
    <target name="project-sql" depends="init-tasks">
  
      <echo message="+------------------------------------------+"/>
      <echo message="|                                          |"/>
      <echo message="| Generating SQL for YOUR Turbine project! |"/>
      <echo message="| Woo hoo!                                 |"/>
      <echo message="|                                          |"/>
      <echo message="+------------------------------------------+"/>
  
      <torque-sql
        contextProperties="${build.properties}"
        controlTemplate="${SQLControlTemplate}"
        outputDirectory="${outputDirectory}/sql"
        templatePath="${templatePath}"
        outputFile="report.${project}.sql.generation"
        xmlFile="${schemaDirectory}/${project}-schema.xml"
        targetDatabase="${database}"
      />
  
    </target>
  
    <!-- ================================================================ -->
    <!-- G E N E R A T E  P R O J E C T  P E E R  B A S E D  O M          -->
    <!-- ================================================================ -->
    <!-- Generate the Peer-based object model for your project.           -->
    <!-- These are in addition to the base Turbine OM!                    -->
    <!-- ================================================================ -->
  
    <target name="project-om" depends="init-tasks">
  
      <echo message="+------------------------------------------+"/>
      <echo message="|                                          |"/>
      <echo message="| Generating Peer-based Object Model for   |"/>
      <echo message="| YOUR Turbine project! Woo hoo!           |"/>
      <echo message="|                                          |"/>
      <echo message="+------------------------------------------+"/>
  
      <torque-om
        contextProperties="${build.properties}"
        controlTemplate="${OMControlTemplate}"
        outputDirectory="${outputDirectory}/java"
        templatePath="${templatePath}"
        outputFile="report.${project}.om.generation"
        targetPackage="${targetPackage}.om"
        xmlFile="${schemaDirectory}/${project}-schema.xml"
      />
  
    </target>
    
    <!-- ================================================================ -->
    <!-- G E N E R A T E  T U R B I N E  S Q L                            -->
    <!-- ================================================================ -->
    <!-- Generate the SQL required for the Turbine base system.           -->
    <!-- You will probably do this once for your development, but         -->
    <!-- may do this repeatedly when you deploy and want your app         -->
    <!-- app to run with multiple DBs.                                    -->
    <!-- ================================================================ -->
  
    <target name="turbine-sql" depends="init-tasks">
  
      <echo message="+------------------------------------------+"/>
      <echo message="|                                          |"/>
      <echo message="| Generating SQL for Turbine base system!  |"/>
      <echo message="|                                          |"/>
      <echo message="+------------------------------------------+"/>
  
      <torque-sql
        controlTemplate="${SQLControlTemplate}"
        outputDirectory="${outputDirectory}/sql"
        templatePath="${templatePath}"
        outputFile="turbine-schema.sql"
        xmlFile="${schemaDirectory}/turbine-schema.xml"
        targetDatabase="${database}"
      />
  
    </target>
  
    <!-- ================================================================ -->
    <!-- G E N E R A T E  P R O J E C T  S Q L                            -->
    <!-- ================================================================ -->
    <!-- Generate the SQL for your project, these are in addition         -->
    <!-- to the base Turbine tables! The tables you require for your      -->
    <!-- project should be specified in project-schema.xml.               -->
    <!-- ================================================================ -->
  
    <target name="turbine-id-table-sql" depends="init-tasks">
  
      <echo message="+------------------------------------------+"/>
      <echo message="|                                          |"/>
      <echo message="| Generating SQL for YOUR Turbine project! |"/>
      <echo message="| Woo hoo!                                 |"/>
      <echo message="|                                          |"/>
      <echo message="+------------------------------------------+"/>
  
      <torque-sql
        controlTemplate="${SQLControlTemplate}"
        outputDirectory="${outputDirectory}/sql"
        templatePath="${templatePath}"
        outputFile="id-table-schema.sql"
        xmlFile="${schemaDirectory}/id-table-schema.xml"
        targetDatabase="${database}"
      />
  
    </target>
  
    <!-- ================================================================ -->
    <!-- G E N E R A T E  T U R B I N E  I D  B R O K E R  I N I T  S Q L -->
    <!-- ================================================================ -->
  
    <target name="turbine-id-table-init-sql" depends="init-tasks">
  
      <echo message="+------------------------------------------+"/>
      <echo message="|                                          |"/>
      <echo message="| Generating TURBINE initialization SQL    |"/>
      <echo message="| for ID Broker system!                    |"/>
      <echo message="|                                          |"/>
      <echo message="+------------------------------------------+"/>
  
      <torque-sql
        contextProperties="bin/torque/templates/sql/id-table/turbine.props"
        controlTemplate="${idTableControlTemplate}"
        outputDirectory="${outputDirectory}/sql"
        templatePath="${templatePath}"
        outputFile="turbine-id-table-init.sql"
        xmlFile="${schemaDirectory}/turbine-schema.xml"
        targetDatabase="${database}"
      />
  
    </target>
  
    <!-- ================================================================ -->
    <!-- G E N E R A T E  P R O J E C T  I D  B R O K E R  I N I T  S Q L -->
    <!-- ================================================================ -->
  
    <target name="project-id-table-init-sql" depends="init-tasks">
  
      <echo message="+------------------------------------------+"/>
      <echo message="|                                          |"/>
      <echo message="| Generating PROJECT initialization SQL    |"/>
      <echo message="| for ID Broker system!                    |"/>
      <echo message="|                                          |"/>
      <echo message="+------------------------------------------+"/>
  
      <torque-sql
        contextProperties="bin/torque/templates/sql/id-table/project.props"
        controlTemplate="${idTableControlTemplate}"
        outputDirectory="${outputDirectory}/sql"
        templatePath="${templatePath}"
        outputFile="${project}-id-table-init.sql"
        xmlFile="${schemaDirectory}/${project}-schema.xml"
        targetDatabase="${database}"
      />
  
    </target>
  
    <!-- ================================================================ -->
    <!-- T U R B I N E  S E C U R I T Y  S Y S T E M  S Q L               -->
    <!-- ================================================================ -->
  
    <target name="turbine-security-sql" depends="init-tasks">
  
      <echo message="+------------------------------------------+"/>
      <echo message="|                                          |"/>
      <echo message="| Generating Turbine security system SQL!  |"/>
      <echo message="|                                          |"/>
      <echo message="+------------------------------------------+"/>
      
      <!-- This could probably be a simple texen task -->
      
      <torque-sql
        contextProperties="bin/torque/templates/sql/id-table/project.props"
        controlTemplate="${securityControlTemplate}"
        outputDirectory="${outputDirectory}/sql"
        templatePath="${templatePath}"
        outputFile="turbine-security.sql"
        xmlFile="${schemaDirectory}/${project}-schema.xml"
        targetDatabase="${database}"
      />
  
    </target>
  
    <!-- ================================================================ -->
    <!-- I N S E R T  G E N E R A T E D  S Q L  I N T O  D A T A B A S E  -->
    <!-- ================================================================ -->
    
    <target name="insert-sql">
      
      <antcall target="insert-sql-file">
        <param name="sqlFile" value="${outputDirectory}/sql/turbine-schema.sql"/>
      </antcall>
  
      <antcall target="insert-sql-file">
        <param name="sqlFile" value="${outputDirectory}/sql/turbine-security.sql"/>
      </antcall>
  
      <antcall target="insert-sql-file">
        <param name="sqlFile" value="${outputDirectory}/sql/id-table-schema.sql"/>
      </antcall>
      
      <antcall target="insert-sql-file">
        <param name="sqlFile" value="${outputDirectory}/sql/${project}-schema.sql"/>
      </antcall>
      
      <antcall target="insert-sql-file">
        <param name="sqlFile" value="${outputDirectory}/sql/turbine-id-table-init.sql"/>
      </antcall>
      
      <antcall target="insert-sql-file">
        <param name="sqlFile" value="${outputDirectory}/sql/${project}-id-table-init.sql"/>
      </antcall>
    </target>
  
    <!-- ================================================================ -->
    <!-- INSERT SINGLE SQL FILE                                           -->
    <!-- ================================================================ -->
    <target name="insert-sql-file">
      <sql
        driver="${databaseDriver}"
        url="${databaseUrl}"
        userid="${databaseUser}"
        password="${databasePassword}"
        src="${sqlFile}"
        autocommit="true"
        onerror="continue"
      >
        <classpath refid="classpath"/>
      </sql>
    </target>
  
    <!-- ================================================================ -->
    <!-- U P D A T E  T U R B I N E  R E S O U R C E S  P R O P S         -->
    <!-- ================================================================ -->
    
    <!-- This is a bit hacky but it makes sure that the user
         only has to edit the project properties file. So
         they don't have to edit the TR.props as well. I will
         unify this in a less hack-ass manner next round :-)
    -->
    
    <target name="update-tr-props">
      
      <filter token="DATABASE_DRIVER" value="${databaseDriver}"/>
      <filter token="DATABASE_URL" value="${databaseUrl}"/>
      <filter token="DATABASE_USER" value="${databaseUser}"/>
      <filter token="DATABASE_PASSWORD" value="${databasePassword}"/>
      
      <property name="database.descriptor" value="../../../../share/conf/database/${database}"/>
      <property name="database.name" value="${project}"/>
      <property file="${database.descriptor}"/>
      
      <filter token="DATABASE_ADAPTOR" value="${database.adaptor}"/>
    
      <copy 
        file="../conf/TurbineResources.properties" 
        tofile="../conf/tmp"
        filtering="yes"
      />
  
      <move
        file="../conf/tmp"
        tofile="../conf/TurbineResources.properties" 
      />
  
    </target>
  
    <!-- ================================================================ -->
    <!-- C L E A N                                                        -->
    <!-- ================================================================ -->
    <target name="clean">
      <delete dir="../classes"/>
      <mkdir dir="../classes"/>
    </target>
  
    <!-- =================================================================== -->
    <!-- Create an xml schema from an sql schema.                            -->
    <!--                                                                     -->
    <!--  inputFile: The input sql file. This must be valid sql file but     -->
    <!--             it not not be in any specific format.                   -->
    <!-- outputFile: The file where the xml schema will be written           -->
    <!-- =================================================================== -->
  
    <target name="sql2xml">
      <sql-xml
        inputFile="schema/schema.sql"
        outputFile="schema/schema.xml"
      />
    </target>
  
    <!-- =================================================================== -->
    <!-- Compiles the source directory and creates a .jar file               -->
    <!-- =================================================================== -->  
    <target name="jar" depends="compile">
      <jar jarfile="../${final.name}.jar"
        basedir="${build.dest}"
        excludes="**/package.html"
      />
    </target>
  
  </project>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/conf/project-inputs.xml
  
  Index: project-inputs.xml
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
  <!DOCTYPE input-data SYSTEM
            "http://jakarta.apache.org/turbine/dtd/intake.dtd">
  
  <!-- PUBLIC "-//Apache//Apache-Turbine-Intake Application Data//EN" --> 
  
  <!-- ==================================================================== -->
  <!--                                                                      -->
  <!--                P R O J E C T  I N P U T S                            -->
  <!--                                                                      -->
  <!-- ==================================================================== -->
  <!-- This is an example.                      .                           -->
  <!-- ==================================================================== -->
  
  <input-data basePackage="org.tigris.scarab.">
  
  <group class="Attribute" key="att" mapToObject="om.Attribute">
    
    <field name="Id" key="id" type="NumberKey" mapToProperty="PrimaryKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
          
    <field name="TypeId" key="typeid" type="NumberKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
    
    <field name="Name" key="name" type="String" />
    
    <field name="Deleted" key="del" type="boolean" />
  
  </group>
  
  <group class="AttributeValue" key="attv" mapToObject="om.AttributeValue">
    
    <field name="Id" key="id" type="ComboKey" mapToProperty="PrimaryKey">
      <rule mask="([0-9]|:)+">badIdMessage</rule>
    </field>
    
    <field name="OptionId" key="optionid" type="NumberKey">
      <rule mask="^$|[0-9]+">Please select a valid choice</rule>
      <required-message>
        This module requires that you select an option for this attribute.
      </required-message>
    </field>
    
    <field name="UserId" key="visid" type="NumberKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
    
    <field name="Value" key="val" type="String">
      <rule maxLength="255">Value length cannot be &gt; 255</rule>
      <required-message>
        This module requires data for this attribute.
      </required-message>
    </field>
    
    <field name="Url" key="url" type="String" mapToProperty="Value">
      <rule maxLength="255">Url length cannot be &gt; 255</rule>
      <rule mask="^$|http.+">Please enter an url starting with "http"</rule>
      <required-message>This module requires a valid url.</required-message>
    </field>
    
    <field name="Deleted" key="del" type="boolean" />
  
  </group>
  
  <group class="Issue" key="issue" mapToObject="om.Issue">
    
    <field name="Id" key="id" type="NumberKey" mapToProperty="PrimaryKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
    
    <field name="ModuleId" key="modid" type="NumberKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
    
    <field name="Deleted" key="del" type="boolean" />
  
  </group>
  
  <group class="Module" key="mod" mapToObject="om.Module">
    
    <field name="Id" key="o" type="NumberKey" mapToProperty="PrimaryKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
          
    <field name="Name" key="name" type="String">
      <rule maxLength="255"/>
    </field>
    
    <field name="Description" key="desc" type="String">
      <rule maxLength="1024"/>
    </field>
          
    <field name="URL" key="url" type="String">
      <rule maxLength="255"/>
    </field>
          
    <field name="ParentId" key="parentid" type="NumberKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
          
    <field name="OwnerId" key="ownerid" type="NumberKey">
      <rule mask="[0-9]+">badIdMessage</rule>
    </field>
          
    <field name="Deleted" key="del" type="boolean" />
  
  </group>
  
  <group class="Login" key="login" mapToObject="om.ScarabUser">
    
    <field name="Username" key="u" type="String" mapToProperty="Username">
      <rule minLength="1">Please enter an email address</rule>
      <rule mask=".+@.+\..+">Please enter a valid email address</rule>
    </field>
    
    <field name="Password" key="p" type="String">
      <rule minLength="1">Please enter a password</rule>
    </field>
  
  </group>
  
  </input-data>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/conf/project-schema.xml
  
  Index: project-schema.xml
  ===================================================================
  <!-- ==================================================================== -->
  <!--                                                                      -->
  <!-- T U R B I N E  P R O J E C T  S C H E M A                            -->
  <!--                                                                      -->
  <!-- ==================================================================== -->
  <!-- This is an example Turbine project schema.                           -->
  <!-- ==================================================================== -->
  
  <database>
    <table name="RDF">
      <column name="RDF_ID" required="true" autoIncrement="true" primaryKey="true" type="INTEGER"/>
      <column name="TITLE" size="255" type="VARCHAR"/>
      <column name="BODY" size="255" type="VARCHAR"/>
      <column name="URL" size="255" type="VARCHAR"/>
      <column name="AUTHOR" size="255" type="VARCHAR"/>
      <column name="DEPT" size="255" type="VARCHAR"/>
    </table>
  </database>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/src/java/modules/actions/SQL.java
  
  Index: SQL.java
  ===================================================================
  package @TARGET_PACKAGE@.modules.actions;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and 
   *    "Apache Turbine" must not be used to endorse or promote products 
   *    derived from this software without prior written permission. For 
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Turbine", nor may "Apache" appear in their name, without 
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  import org.apache.velocity.context.Context;
  
  import org.apache.turbine.util.RunData;
  import org.apache.turbine.util.db.Criteria;
  import org.apache.turbine.modules.actions.VelocityAction;
  
  import @TARGET_PACKAGE@.om.Rdf;
  import @TARGET_PACKAGE@.om.RdfPeer;
  
  /**
   * This class provides a simple set of methods to
   * insert/update/delete records in a database.
   */
  public class SQL extends SecureAction
  {
      /**
       * This simply takes an entry from the web form and
       * inserts it directly into the database.
       *
       * This would not be good in practice as the
       * data should be verified before being allowed
       * into the database. This is merely an
       * example of how to use peers, this certainly
       * wouldn't be secure.
       */
      public void doInsert(RunData data, Context context)
          throws Exception
      {
          Rdf entry = new Rdf();
          data.getParameters().setProperties(entry);
          entry.save();
      }
      
      /**
       * Update a record in the database with the
       * information present in the web form.
       *
       * Again, this is merely an example. The data
       * should be checked before being allowed
       * into the database.
       */
      public void doUpdate(RunData data, Context context)
          throws Exception
      {
          Rdf entry = new Rdf();
          data.getParameters().setProperties(entry);
          entry.setModified(true);
          entry.setNew(false);
          entry.save();
      }
  
      /**
       * Delete a record from the database using
       * the unique id gleaned from the web form.
       */
      public void doDelete(RunData data, Context context)
          throws Exception
      {
          Criteria criteria = new Criteria();
          criteria.add(RdfPeer.RDF_ID, data.getParameters().getInt("rdfid"));
          RdfPeer.doDelete(criteria);
      }
  
      /**
       * This is used in the event that the doInsert
       * above fails.
       */
      public void doPerform(RunData data, Context context)
          throws Exception
      {
          data.setMessage("Can't find the button!");
      }
  }
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/src/java/modules/actions/SecureAction.java
  
  Index: SecureAction.java
  ===================================================================
  package @TARGET_PACKAGE@.modules.actions;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and 
   *    "Apache Turbine" must not be used to endorse or promote products 
   *    derived from this software without prior written permission. For 
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Turbine", nor may "Apache" appear in their name, without 
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  import org.apache.velocity.context.Context;
  
  import org.apache.turbine.modules.actions.VelocitySecureAction;
  import org.apache.turbine.modules.screens.TemplateScreen;
  import org.apache.turbine.util.RunData;
  import org.apache.turbine.services.security.TurbineSecurity;
  import org.apache.turbine.util.security.AccessControlList;
  
  /**
   * Velocity Secure action.
   *
   * Always performs a Security Check that you've defined before
   * executing the doBuildtemplate().
   * @author <a href="mailto:mbryson@mont.mindspring.com">Dave Bryson</a>
   * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a>
   * @author <a href="mailto:john@zenplex.com">John Thorhauer</a>
   * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
   */
  public class SecureAction extends VelocitySecureAction
  {
      /**
       * Implement this to add information to the context.
       *
       * @param data Turbine information.
       * @param context Context for web pages.
       * @exception Exception, a generic exception.
       */
      public void doPerform( RunData data,Context context )
          throws Exception
      {
      }
  
      /**
       * This currently only checks to make sure that user is allowed to
       * view the storage area.  If you create an action that requires more
       * security then override this method.
       *
       * @param data Turbine information.
       * @return True if the user is authorized to access the screen.
       * @exception Exception, a generic exception.
       */
      protected boolean isAuthorized( RunData data ) throws Exception
      {
          boolean isAuthorized = false;
          
          /* 
           * Get acl and check security.
           */
          AccessControlList acl = data.getACL();
          
          //if (acl == null || ! acl.hasPermission("default_view", "group"))
          if (acl == null || ! acl.hasRole("turbine_root"))
          {
              isAuthorized = false;
          }
          //else if( acl.hasPermission("default_view", "group"))
          else if(acl.hasRole("turbine_root"))
          {
              isAuthorized = true;
          }
  
          return isAuthorized;
      }
  }
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/src/java/modules/actions/Upload.java
  
  Index: Upload.java
  ===================================================================
  package @TARGET_PACKAGE@.modules.actions;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and 
   *    "Apache Turbine" must not be used to endorse or promote products 
   *    derived from this software without prior written permission. For 
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Turbine", nor may "Apache" appear in their name, without 
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  import java.io.File;
  
  import org.apache.velocity.context.Context;
  
  import org.apache.turbine.util.RunData;
  import org.apache.turbine.util.upload.FileItem;
  import org.apache.turbine.services.servlet.TurbineServlet;
  
  /**
   * Class responsible for performing the company admin actions
   * in the Tambora Storage system.
   *
   * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
   */
  public class Upload extends SecureAction
  {
      /**
       * Upload the DTDs for this company.
       */
      public void doUpload(RunData data, Context context)
          throws Exception
      {
          FileItem fileItem = data.getParameters().getFileItem("file");
          fileItem.write(TurbineServlet.getRealPath("/uploaded.file"));
      }
  
      /**
       * Default action to perform if the specified action
       * cannot be executed.
       */
      public void doPerform( RunData data,Context context )
          throws Exception
      {
          data.setMessage("Can't find the requested action! ");
      }
  }
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/src/java/modules/screens/Form.java
  
  Index: Form.java
  ===================================================================
  package @TARGET_PACKAGE@.modules.screens;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and 
   *    "Apache Turbine" must not be used to endorse or promote products 
   *    derived from this software without prior written permission. For 
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Turbine", nor may "Apache" appear in their name, without 
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  import java.util.Vector;
  
  import org.apache.turbine.modules.screens.VelocityScreen;
  import org.apache.turbine.util.RunData;
  
  import org.apache.turbine.util.db.Criteria;
  
  import @TARGET_PACKAGE@.om.Rdf;
  import @TARGET_PACKAGE@.om.RdfPeer;
  
  import org.apache.velocity.context.Context;
  
  /**
   * Grabs a record from a database and makes
   * the data available in the template.
   *
   * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
   */
  public class Form extends SecureScreen
  {
      /**
       * Grab a record from the database based on the entry_id
       * found in the form. Make the data available in the
       * template.
       */
      public void doBuildTemplate( RunData data, Context context )
      {
          try
          {
              int entry_id = data.getParameters().getInt("rdfid");
              Criteria criteria = new Criteria();
              criteria.add(RdfPeer.RDF_ID, entry_id);
              Rdf rdf = (Rdf) RdfPeer.doSelect(criteria).elementAt(0);
              context.put("entry", rdf);            
          }
          catch (Exception e)
          {
              // log something ?
          }
      }
  }
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/src/java/modules/screens/Index.java
  
  Index: Index.java
  ===================================================================
  package @TARGET_PACKAGE@.modules.screens;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and 
   *    "Apache Turbine" must not be used to endorse or promote products 
   *    derived from this software without prior written permission. For 
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Turbine", nor may "Apache" appear in their name, without 
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  import java.util.Vector;
  
  import org.apache.turbine.modules.screens.VelocityScreen;
  import org.apache.turbine.util.RunData;
  
  import org.apache.turbine.util.db.Criteria;
  import @TARGET_PACKAGE@.om.RdfPeer;
  
  import org.apache.velocity.context.Context;
  
  /**
   * Grab all the records in a table using a Peer, and
   * place the Vector of data objects in the context
   * where they can be displayed by a #foreach loop.
   *
   * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
   */
  public class Index extends SecureScreen
  {
      /**
       * Place all the data object in the context
       * for use in the template.
       */
      public void doBuildTemplate( RunData data, Context context )
      {
          context.put("entries", getEntries());
      }
  
      /**
       * This will return all the rdf records in
       * the database but they have been mapped to
       * Rdf objects so they can be directly used
       * in the Velocity template.
       */
      private Vector getEntries()
      {
          try
          {
              Criteria criteria = new Criteria();
              return RdfPeer.doSelect(criteria);
          }
          catch (Exception e)
          {
              return null;
          }
      }
  }
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/src/java/modules/screens/SecureScreen.java
  
  Index: SecureScreen.java
  ===================================================================
  package @TARGET_PACKAGE@.modules.screens;
  
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and 
   *    "Apache Turbine" must not be used to endorse or promote products 
   *    derived from this software without prior written permission. For 
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Turbine", nor may "Apache" appear in their name, without 
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  import java.util.Vector;
  
  import org.apache.turbine.modules.screens.VelocitySecureScreen;
  import org.apache.turbine.util.RunData;
  import org.apache.turbine.util.security.AccessControlList;
  import org.apache.turbine.services.resources.TurbineResources;
  
  import org.apache.velocity.context.Context;
  
  /**
   * Grab all the records in a table using a Peer, and
   * place the Vector of data objects in the context
   * where they can be displayed by a #foreach loop.
   *
   * @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
   */
  public class SecureScreen extends VelocitySecureScreen
  {
      public void doBuildTemplate(RunData data, Context context)
      {
      }
  
      /**
       * Overide this method to perform the security check needed.
       *
       * @param data Turbine information.
       * @return True if the user is authorized to access the screen.
       * @exception Exception, a generic exception.
       */
      protected boolean isAuthorized( RunData data )  throws Exception
      {
          boolean isAuthorized = false;
  
          AccessControlList acl = data.getACL();
          
          if (acl==null || ! acl.hasRole("turbine_root"))
          {
              data.getTemplateInfo().setScreenTemplate(
                  TurbineResources.getString("template.login"));
                  
              data.setScreen(TurbineResources.getString("screen.login"));
              isAuthorized = false;
          }
          else if(acl.hasRole("turbine_root"))
          {
              isAuthorized = true;
          }
          return isAuthorized;
      }
  }
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/WEB-INF/src/java/modules/tags/UserInfoTag.java
  
  Index: UserInfoTag.java
  ===================================================================
  package @TARGET_PACKAGE@.tags;
  
  import java.io.IOException;
  
  import javax.servlet.jsp.tagext.TagSupport;
  import javax.servlet.jsp.JspException;
  import javax.servlet.jsp.PageContext;
  
  import org.apache.turbine.util.RunData;
  import org.apache.turbine.services.jsp.JspService;
  import org.apache.turbine.om.security.User;
  
  /**
   * UserInfoTag is a sample JSP tag handler that displays the full
   * name of the user that is currently logged in.
   */
  
  public class UserInfoTag extends TagSupport
  {
    /**
     * Process the StartTag event
     *
     * @exception JspException
     */
  
    public int doStartTag() throws JspException
    {
  
      // Get the Turbine "RunData" object that was stuffed into the Http request.
  
      RunData data = (RunData)pageContext.getAttribute(JspService.RUNDATA, PageContext.REQUEST_SCOPE);
  
      // If we have a RunData object, get the User object
  
      if (data != null)
      {
        User user = data.getUser();
  
        // Write out the user's full name (last name, first name)
  
        try
        {
          String fullName = user.getFirstName() + " " + user.getLastName();
          pageContext.getOut().print(fullName);
        }
        catch (IOException e)
        {
          throw new JspException("I/O Exception: " + e.getMessage());
        }
      }
  
      return SKIP_BODY;
    }
  }
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/images/tdm.jpg
  
  	<<Binary file>>
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/resources/ui/skins/default/skin.props
  
  Index: skin.props
  ===================================================================
  # These are the default properties
  
  bgcolor = #ffffff
  sansSerifFonts = verdana,geneva,helvetica
  formLabelColor = #b3cc99
  formFieldColor = #b3bb99
  labelColor = #b3cc99
  dataColor = #b3bb99
  vlink = #00ff00
  alink = #0000ff
  
  tableCellSpacing = 0
  tableCellPadding = 0
  
  menuColor = #000000
  
  buttonAlignment = left
  buttonColor = #DDDDDD
  
  # Images
  alertImage = alert1.gif
  logo = tambora.gif
  poweredByImage = powered_by_tambora.gif
  line = line.gif
  
  darkColor = #000088
  lightColor = #DDDDDD
  tableColor = #AAAAAA  
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/resources/ui/skins/default/images/alert1.gif
  
  	<<Binary file>>
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/resources/ui/skins/default/images/alter2.gif
  
  	<<Binary file>>
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/resources/ui/skins/default/images/line.gif
  
  	<<Binary file>>
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/GlobalMacros.vm
  
  Index: GlobalMacros.vm
  ===================================================================
  #* ------------------------------------------------------------------
  #
  # Macros that are used for displaying input forms.
  #
  *# ------------------------------------------------------------------
  
  #macro (text $text)
    <font face="$ui.sansSerifFonts">
      $text
    </font>
  #end
  
  #macro (formLabel $label)
    <td bgcolor="$ui.formLabelColor">
      <b>
        <font face="$ui.sansSerifFonts">
          $label
        </font>
      </b>
    </td>
  #end
  
  #macro (formTextField $name $value)
    <td bgcolor="$ui.formFieldColor">
      <font face="$ui.sansSerifFonts">
        <input type="text" size="30" name="$name" value="$value">
      </font>
    </td>
  #end
  
  #macro (textField $name $value $size)
    <font face="$ui.sansSerifFonts">
      <input type="text" size="30" name="$name" value="$value">
    </font>
  #end
  
  #macro (listBox $list)
    <font face="$ui.sansSerifFonts">
      $list
    </font>
  #end
  
  #macro (formPasswordCell $label $name $value)
    <td bgcolor="$ui.formLabelColor">
      <b>
        <font face="$ui.sansSerifFonts">
          $label
        </font>
      </b>
    </td>
    <td bgcolor="$ui.formFieldColor">
      <font face="$ui.sansSerifFonts">
        <input type="password" size="30" name="$name" value="$value">
      </font>
    </td>
  #end
  
  #macro (formCell $label $name $value)
    #formLabel($label)
    #formTextField($name $value)
  #end
  
  #macro (fileUploadField $name)
    <td bgcolor="$ui.formFieldColor">
      <font face="$ui.sansSerifFonts">
        <input type="file" size="30" name="$name">
      </font>
    </td>
  #end
  
  #macro (fileUpload $label $name)
    #formLabel($label)
    #fileUploadField($name)
  #end
  
  #macro (formCheckBox $label $name $checked)
    <td bgcolor="$ui.formLabelColor">
      <b>
        <font face="$ui.sansSerifFonts">
          $label
        </font>
      </b>
    </td>
    <td bgcolor="$ui.formFieldColor">
      <input type="checkbox" name="$name" #if($checked)checked=1#end/>
    </td>
  #end
  
  #macro (formListBox $label $list)
    <td bgcolor="$ui.formLabelColor">
      <b>
        <font face="$ui.sansSerifFonts">
          $label
        </font>
      </b>
    </td>
    <td bgcolor="$ui.formFieldColor">
      $list
    </td>
  #end
  
  #* ------------------------------------------------------------------
  #
  # Macros that are used for displaying information in tables.
  #
  *# ------------------------------------------------------------------
  
  #macro (headerCell $body)
    <td bgcolor="$ui.formLabelColor">
      <b>
        <font face="$ui.sansSerifFonts">
          $body
        </font>
      </b>
    </td>
  #end
  
  #macro (entryCell $body)
    <td bgcolor="$ui.formFieldColor">
      <font face="$ui.sansSerifFonts">
        $body &nbsp;
      </font>
    </td>
  #end
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/layouts/Default.vm
  
  Index: Default.vm
  ===================================================================
  <table width="100%">
    <tr>
      <td colspan="2">
        $navigation.setTemplate("/DefaultTop.vm")
      </td>
    </tr>
    <tr>
      <td width="20" align="left" valign="top">
        $navigation.setTemplate("/Menu.vm")
      </td>
      <td align="left" valign="top">
        $screen_placeholder
      </td>
    </tr>
    <tr>
      <td colspan="2">
        $navigation.setTemplate("/DefaultBottom.vm")
      </td>
    </tr>
  </table>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/layouts/Login.vm
  
  Index: Login.vm
  ===================================================================
  <table width="100%">
    <tr>
      <td colspan="2">
        $navigation.setTemplate("/DefaultTop.vm")
      </td>
    </tr>
    <tr>
      <td align="left">
        $screen_placeholder
      </td>
    </tr>
    <tr>
      <td colspan="2">
        $navigation.setTemplate("/DefaultBottom.vm")
      </td>
    </tr>
  </table>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/navigations/DefaultBottom.vm
  
  Index: DefaultBottom.vm
  ===================================================================
  <font face="verdana,geneva,helvetica">
  
  <hr>
  
  </font>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/navigations/DefaultTop.vm
  
  Index: DefaultTop.vm
  ===================================================================
  $page.setBgColor("#ffffff")
  
  <img src="$content.getURI("images/tdm.jpg")">
  
  <hr>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/navigations/Menu.vm
  
  Index: Menu.vm
  ===================================================================
  <font face="$ui.sansSerifFonts">
  <a href="$link.setPage("Insert.vm")">Insert Entry</a>
  <p>
  <b>Flux</b>
  <br>
  <a href="$link.setPage("user,FluxUserList.vm")">Users</a>
  <br>
  <a href="$link.setPage("group,FluxGroupList.vm")">Groups</a>
  <br>
  <a href="$link.setPage("role,FluxRoleList.vm")">Roles</a>
  <br>
  <a href="$link.setPage("permission,FluxPermissionList.vm")">Permissions</a>
  <p>
  <b>Services</b>
  ##<br>
  ##<a href="">Intake Service</a>
  ##<br>
  ##<a href="">Localization Service</a>
  ##<br>
  ##<a href="">Pull Service</a>
  ##<br>
  ##<a href="">Scheduler Service</a>
  <br>
  <a href="$link.setPage("Upload.vm")">Upload Service</a>
  <br>
  ##<a href="">Servlet Service</a>
  ##<br>
  ##<a href="">Unique Id Service</a>
  ##<br>
  ##<a href="">XML-RPC Service</a>
  ##<br>
  ##<a href="">XSLT Service</a>
  <p>
  <b>Common Tasks</b>
  <br>
  <a href="">User Downloads</a>
  <p>
  <a href="$link.setPage("Index.vm")">Home</a>
  <p>
  <a href="$link.setAction("LogoutUser")">Logout</a>
  </font>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/screens/Error.vm
  
  Index: Error.vm
  ===================================================================
  $page.setTitle("Error")
  
  $page.setBgColor("#ffffff")
  
  <font face="verdana,geneva,helvetica">
  
  <h2>Error</h2>
  
  #if($data.getMessage())
  Message: $data.getMessage()
  #end
  
  </font>
  
  <br>
  
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/screens/Form.vm
  
  Index: Form.vm
  ===================================================================
  $page.setTitle("Insert")
  
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  </head>
  
  <body bgcolor="#ffffff" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  <form method="post" action="$link.setPage("Index.vm").setAction("SQL")">
    <div align="left">
      <table bgcolor="#ffffff" cellpadding="5">
        <tr>  
          #formCell ("Title" "title" $entry.Title)
        </tr>
        <tr>
          #formCell ("Author" "author" $entry.Author)
        </tr>
        <tr>
          #formCell ("Department" "dept" $entry.Dept)
        </tr>
        <tr>
          #formCell ("Url" "url" $entry.Url)
        </tr>
        <tr>
          #formCell ("Body" "body" $entry.Body)
        </tr>
      </table>
    
      <input type="hidden" name="rdfid" value="$entry.RdfId"/>
      <input type="submit" name="eventSubmit_doInsert" value="Insert"/>
      <input type="submit" name="eventSubmit_doUpdate" value="Update"/>
      <input type="submit" name="eventSubmit_doDelete" value="Delete"/>
    </div>
  </form>
  </body>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/screens/Index.vm
  
  Index: Index.vm
  ===================================================================
  $page.setTitle("Index")
  $page.setBgColor("#ffffff")
  
  #set ( $headings = ["Title", "Dept", "Author", "Url","Body"," "] )
  
  #if ($entries)
  <table>
    <tr>
      <td>
        <table cellspacing="1" cellpadding="1">
          <tr>
            #foreach ($heading in $headings)
            #headerCell ($heading)
            #end    
          </tr>
    
          #foreach ($entry in $entries)
          <tr>
            #entryCell ($entry.Title)
            #entryCell ($entry.Dept)
            #entryCell ($entry.Author)
            #entryCell ($entry.Url)
            #entryCell ($entry.Body)
            <td><a href="$link.setPage("Form.vm").addPathInfo("rdfid", $entry.RdfId)">Edit</a></td>
          </tr>        
          #end
        </table>
      </td>
    </tr>
  </table>
  #end
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/screens/Insert.vm
  
  Index: Insert.vm
  ===================================================================
  $page.setTitle("Insert")
  
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  </head>
  
  <body bgcolor="#ffffff" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  <form method="post" action="$link.setPage("Index.vm").setAction("SQL")">
    <div align="left">
      <table bgcolor="#ffffff" cellpadding="5">
        <tr>
          #formCell ("Title" "title" "")
        </tr>
        <tr>
          #formCell ("Author" "author" "")
        </tr>
        <tr>
          #formCell ("Department" "dept" "")
        </tr>
        <tr>
          #formCell ("Url" "url" "")
        </tr>
        <tr>
          #formCell ("Body" "body" "")
        </tr>
      </table>
      <input type="submit" name="eventSubmit_doInsert" value="Insert"/>
    </div>
  </form>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/screens/Login.vm
  
  Index: Login.vm
  ===================================================================
  #**
  
  @author <a href="mailto:jvanzyl@periapt.com">Jason van Zyl</a>
  @version $Id: Login.vm,v 1.1 2001/05/25 06:27:47 jvanzyl Exp $
  
  *#
  
  $page.setTitle("Please Login")
  $page.setBgColor($ui.bgcolor)
  
  <form method="post" action="$link.setAction("LoginUser")">
    <table>
      <tr>
        #formCell ("User" "username" "")
      </tr>
      <tr>
         #formPasswordCell ("Password" "password" "")
      </tr>
      <tr>
        <td>
          <font face="$ui.sansSerifFonts">
            <input type="submit" value="Login">
          </font>
        </td>
      </tr>
    </table>
  </form>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/screens/Upload.vm
  
  Index: Upload.vm
  ===================================================================
  $page.setBgColor($ui.bgcolor)
  $page.setTitle("File Upload")
  
  <form method="post" enctype="multipart/form-data" action="$link.setPage("UploadComplete.vm").setAction("Upload")">
    <div align="left">
      <table bgcolor="#ffffff" cellpadding="5">
          
        #if ($errorTemplate)
        <tr>
          <td colspan="4">
            <table bgcolor="#ffffff">
              <tr>
                <td>
                  <img src="$ui.image($ui.alertImage,$data)">
                </td>
                <td>
                  #parse ($errorTemplate)
                </td>
              </tr>
            </table>
          </td>
        </tr>
        #end
  
        <tr>
          #fileUpload ("File" "file")
        </tr>
  
        <tr>
          <td align="$ui.buttonAlignment" bgcolor="$ui.buttonColor">
            #*
              Check for a mode, the update and delete buttons
              shouldn't appear when inserting a new user.
            *#
  
            <font face="$ui.sansSerifFonts">
  
            <input type="submit" name="eventSubmit_doUpload" value="Upload"/>
      
            </font>
          </td>
        </tr>
        
      </table>
    </div>
  </form>
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/app/screens/UploadComplete.vm
  
  Index: UploadComplete.vm
  ===================================================================
  $page.setBgColor($ui.bgcolor)
  $page.setTitle("File Upload")
  
  Your file has been successfully uploaded!
  
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/jsp/screens/Index.jsp
  
  Index: Index.jsp
  ===================================================================
  <%@ taglib uri="/WEB-INF/tlds/Test.tld" prefix="tags" %>
  
  <html>
  <head>
  <title>Index.jsp</title>
  </head>
  
  <body>
  Hello <tags:UserInfo/>.
  </body>
  
  </html>
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/jsp/screens/Login.jsp
  
  Index: Login.jsp
  ===================================================================
  <html>
  <head>
  <title>Login</title>
  </head>
  
  <body>
  
  <blockquote>
  
  <form method="post">
    <input type="hidden" name="Action" value="LoginUser">
  
    <table>
    <tr>
    <td>Username</td>
    <td><input type="text" name="username"></td>
    </tr>
  
    <tr>
    <td>Password</td>
    <td><input type="password" name="password"></td>
    </tr>
  
    <tr>
    <td>&nbsp;</td>
    <td><input type="submit" value="Login"></td>
    </table>
  
  </form>
  </blockquote>
  
  </body>
  </html>
  
  
  1.1                  jakarta-turbine-tdk/src/share/sample/templates/jsp/tld/Test.tld
  
  Index: Test.tld
  ===================================================================
  <?xml version="1.0" encoding="ISO-8859-1" ?>
  <!DOCTYPE taglib PUBLIC 
    "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" 
    "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> 
  <taglib>
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>Tags</shortname>
  
    <tag>   
      <name>UserInfo</name>
      <tagclass>com.planetcad.suitex.UserInfoTag</tagclass>
      <bodycontent>empty</bodycontent>
    </tag>
  </taglib>
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: turbine-tdk-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: turbine-tdk-dev-help@jakarta.apache.org