svn commit: r1937059 - in db/torque/trunk: . torque-build torque-build/src torque-build/src/main torque-build/src/main/java torque-build/src/main/resources torque-build/src/main/schema torque-site/src/site/xdoc/documentation/codegen-reference/generator...

[email protected]
Newsgroups gmane.comp.jakarta.turbine.torque.devel
Message-ID <178645536033.839441.2254934834343740503@svn03-he-fi>
Author: gk
Date: Tue Aug 11 13:36:00 2026
New Revision: 1937059

Log:
[TORQUE-376] - See https://issues.apache.org/jira/browse/TORQUE for the tracking issue.
- add torque-build module
- update and add documenation in torque-site: Add more information about outlets and explain generation process in workflow.xml.
- fix download for torque generator in torque tutorial/orm/step1-ant.xml

Added:
   db/torque/trunk/torque-build/
   db/torque/trunk/torque-build/README.md
   db/torque/trunk/torque-build/build-torque.xml
   db/torque/trunk/torque-build/build.properties
   db/torque/trunk/torque-build/pom.xml
   db/torque/trunk/torque-build/src/
   db/torque/trunk/torque-build/src/main/
   db/torque/trunk/torque-build/src/main/java/
   db/torque/trunk/torque-build/src/main/resources/
   db/torque/trunk/torque-build/src/main/resources/log4j2.xml
   db/torque/trunk/torque-build/src/main/schema/
   db/torque/trunk/torque-build/src/main/schema/bookstore-schema.xml
   db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/workflow.xml
Modified:
   db/torque/trunk/README.md
   db/torque/trunk/pom.xml
   db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/index.xml
   db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/outletTypes.xml
   db/torque/trunk/torque-site/src/site/xdoc/documentation/tutorial/orm/step1-ant.xml

Modified: db/torque/trunk/README.md
==============================================================================
--- db/torque/trunk/README.md	Tue Aug 11 12:45:04 2026	(r1937058)
+++ db/torque/trunk/README.md	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -45,7 +45,7 @@ or try it with default database and acti
 
 ### Modules
 
-- This project consists of six modules
+- This project consists of seven modules
 
     - torque-runtime 
     - torque-generator
@@ -54,6 +54,7 @@ or try it with default database and acti
     - torque-ant-tasks
     - torque-site 
     - torque-test (internal only)
+    - torque-build (internal only)
 
 
 ### Core modules
@@ -225,3 +226,7 @@ If voting was successfull, proceed by pu
 Check [here|https://infra-reports.apache.org/#sitesource] the source repo of the website https://db.apache.org/torque matches distributionManagement site url in torque-site pom.xml. 
 
 
+#### Torque Build - ORM artifacts (classes and SQL DDL)
+
+ *Torque-build* is an example build environment, which allows to build ORM classses and SQL DDL from a schema.xml (which may be retro generated from a databse) and provides a [README](torque-build/README.md) of its own. 
+You need the ant tool installed.
\ No newline at end of file

Modified: db/torque/trunk/pom.xml
==============================================================================
--- db/torque/trunk/pom.xml	Tue Aug 11 12:45:04 2026	(r1937058)
+++ db/torque/trunk/pom.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -652,12 +652,14 @@
                         <exclude>velocity.log</exclude>
                         <exclude>.checkstyle</exclude>
                         <exclude>checkstyle-cache.ccf</exclude>
-                        <exclude>**/derby.log</exclude>
+                        <exclude>**/*.log</exclude>
                         <exclude>**/LICENSE-EDL.txt</exclude>
                         <exclude>DEPENDENCIES</exclude>
                         <!-- special excludes for torque-test because this is not a module
                           in the normal build process -->
                         <exclude>torque-test/src/main/generated-java/**/*</exclude>
+                        <exclude>torque-build/src/main/generated-java/**/*</exclude>
+                        <exclude>torque-build/lib/**</exclude>
                         <!-- hsqldb-jenkins -->
                         <exclude>torque-test/torque-test/**</exclude>
                         <exclude>torque-test/README.md</exclude>
@@ -762,7 +764,7 @@
                 </reportSets>
                 <configuration>
                     <!-- test project javadoc is not needed in the main site and javadoc fails during the release build, so skip -->
-                    <skippedModules>torque-test</skippedModules>
+                    <skippedModules>torque-test,torque-build</skippedModules>
                 </configuration>
             </plugin>
             <plugin> 

Added: db/torque/trunk/torque-build/README.md
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ db/torque/trunk/torque-build/README.md	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -0,0 +1,221 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+-->
+
+# torque-build — Torque ORM Reference Build
+
+This module provides a ready-to-use Ant build configuration for generating Torque ORM Java
+classes and SQL DDL from an XML schema file. It packages the `build-torque.xml` Ant script
+and `build.properties` configuration file as a reference starting point for new Torque projects.
+
+A bundled bookstore schema (`Author` and `Book` tables) is included in
+`src/main/schema/bookstore-schema.xml` for self-testing without an external database.
+
+---
+
+## Prerequisites
+
+| Tool | Minimum Version |
+|------|----------------|
+| Java | 17 |
+| Apache Ant | 1.10 |
+| Apache Maven | 3.9.5 |
+
+---
+
+## Quick Start (One Command)
+
+From the repository root, run phase process-resources to resolve dependencies and generate
+ORM classes from the bundled bookstore schema using e.g. postgresql (no external database lookup 
+is needed, as the schema is already provided):
+
+```sh
+mvn clean process-resources 
+```
+
+This single command:
+1. Resolves all runtime JARs into `torque-build/libs/`
+2. Runs `ant generate` (ORM Java + SQL DDL)
+3. Runs `ant compile` (compiles generated classes)
+
+After success, check:
+- `torque-build/target/generated-sources/example/om/Base*.java` — generated base classes
+- `torque-build/src/main/generated-java/example/om/*.java` — generated header classes
+- `torque-build/target/generated-sql/bookstore-schema.sql` — generated SQL DDL
+
+---
+
+## Manual Ant Workflow
+
+If you want to run the Ant targets directly (e.g., to develop or debug):
+
+### Step 1: Resolve Dependencies
+
+Run once to populate `libs/` before using Ant directly:
+
+```sh
+cd torque-build
+mvn dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=libs
+```
+
+Or from the repository root:
+
+```sh
+mvn process-resources -Dmaven.antrun.skip=true
+```
+
+### Step 2: Run Ant Targets
+
+```sh
+cd torque-build
+
+# Generate ORM classes and SQL DDL
+ant generate -f build-torque.xml
+
+# Compile generated + hand-written Java sources
+ant compile -f build-torque.xml
+
+# Generate and compile (default target)
+ant -f build-torque.xml
+
+# List all available targets
+ant -f build-torque.xml -p
+
+# Clean build output
+ant clean -f build-torque.xml
+```
+
+---
+
+## Ant Target Reference
+
+| Target | Depends On | Description | CI-testable |
+|--------|-----------|-------------|-------------|
+| `main` (default) | `generate`, `compile` | Full build: generate ORM/SQL + compile | Yes |
+| `generate` | — | Two `torque-generator` invocations: ORM classes + SQL DDL | Yes |
+| `compile` | — | Compile all Java sources (hand-written + generated) | Yes |
+| `execute-sql` | — | Execute generated DDL against a configured database | **Manual only** |
+| `jdbc` | — | Reverse-engineer a live database into `schema.xml` | **Manual only** |
+| `clean` | — | Delete `target/` directory | Yes |
+
+> **Manual-only targets**: `execute-sql` and `jdbc` require a running database instance
+> with JDBC connection settings configured in `build.properties`. They are not part of
+> automated CI (they are not exercised by `mvn process-resources`).
+
+---
+
+## Configuring `build.properties`
+
+Open `build.properties` and set the properties for your target database. The file ships with
+Postgresql active. Uncomment the block for your database:
+
+
+No JDBC driver settings are needed for `generate` and `compile`.
+
+### MySQL
+
+```properties
+torque.database = mysql
+torque.database.driver = com.mysql.cj.jdbc.Driver
+torque.database.url = jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true
+torque.database.user = root
+torque.database.password =
+```
+
+### PostgreSQL
+
+```properties
+torque.database = postgresql
+torque.database.driver = org.postgresql.Driver
+torque.database.url = jdbc:postgresql://localhost:5432/mydb
+torque.database.user = postgres
+torque.database.password =
+```
+
+### HSQLDB
+
+```properties
+torque.database = hsqldb
+torque.database.driver = org.hsqldb.jdbcDriver
+torque.database.url = jdbc:hsqldb:hsql://localhost/mydb
+torque.database.user = sa
+torque.database.password =
+```
+
+> **Note**: The `torque.database` setting affects SQL dialect selection. The `generate`
+> and `compile` targets work with any setting. JDBC-specific settings are only used by
+> `execute-sql` and `jdbc` targets.
+
+---
+
+## Key `build.properties` Settings
+
+| Property | Default | Description |
+|----------|---------|-------------|
+| `torque.database` | `mysql` | Target SQL dialect |
+| `torque.targetPackage` | `example.om` | Java package for generated ORM classes |
+| `torque.schema.dir` | `${torque.home}/src/main/schema` | Schema XML input directory |
+| `torque.output.dir` | `${torque.home}/src` | Root output directory |
+| `torque.useManagers` | `false` | Generate Manager/cache classes |
+| `torque.generateBeans` | `false` | Generate Bean wrapper classes |
+
+---
+
+## Using Your Own Schema
+
+Replace or supplement the bundled schema:
+
+1. Put your `myproject-schema.xml` in `src/main/schema/`
+2. Set `torque.project = myproject` in `build.properties`
+3. Run `ant generate -f build-torque.xml`
+
+---
+
+## JGit Merge — Preserving Hand-Edited Files
+
+The Torque generator uses **JGit three-way merge** for files in `src/main/generated-java/`.
+These are the "header" classes (non-`Base*`) where you add custom business logic.
+
+- On **first generation**: header class files are created in `src/main/generated-java/`
+- On **re-generation**: JGit merges new generator output with your hand-edits, preserving
+  custom code in the header classes
+- `Base*` classes in `target/generated-sources/` are always fully regenerated
+
+This means you can safely re-run `ant generate` without losing customizations, as long as
+the merge strategy is `merge` (the default).
+
+---
+
+## Logging
+
+Torque does use internally Log4j2 logging. To configure Log4j2 logging for the Ant task, set `ANT_OPTS` before running Ant:
+
+```sh
+set ANT_OPTS=-Dlog4j.configurationFile=src/main/resources/log4j2.xml   # Windows
+export ANT_OPTS=-Dlog4j.configurationFile=src/main/resources/log4j2.xml # Unix
+```
+
+Another sample `log4j2.xml` may be found in the Torque generator distribution.
+
+---
+
+## Java 17 Note
+
+The `compile` target in `build-torque.xml` uses `source="17"` and `target="17"`.
+Torque 7.x requires Java 17+. If you are targeting a different Java release, adjust
+the `source` and `target` attributes in `build-torque.xml` accordingly.

Added: db/torque/trunk/torque-build/build-torque.xml
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ db/torque/trunk/torque-build/build-torque.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -0,0 +1,146 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+-->
+<project name="Torque" default="main" basedir="."><!-- requires maven: ${project.build.directory} -->
+
+  <property name="build.properties" value="build.properties"/>
+  <property name="torque.contextProperties" value="${build.properties}"/>
+  <!-- Default database: overridden by build.properties if torque.database is set there -->
+  <!--property name="torque.database" value="mysql"/-->
+  <property file="${torque.contextProperties}"/>
+
+  <path id="ant-classpath">
+    <fileset dir="libs">
+      <include name="**/*.jar"/>
+    </fileset>
+  </path>
+
+  <path id="runtime-classpath">
+    <fileset dir="libs">
+      <include name="**/*.jar"/>
+    </fileset>
+  </path>
+
+  <pathconvert property="classpathRuntime" refid="runtime-classpath"/>
+  <pathconvert property="antClasspath" refid="ant-classpath"/>
+
+  <taskdef
+    name="torque-generator"
+    classpathref="ant-classpath"
+    classname="org.apache.torque.ant.task.TorqueGeneratorTask"/>
+
+  <target name="generate" description="==> generates sql + om classes">
+    <echo>Generate with antClasspath: ${antClasspath} ...</echo>
+    <torque-generator
+        packaging="classpath"
+        configPackage="org.apache.torque.templates.om"
+        sourceDir="src/main/schema"
+        >
+
+       <!-- see also build.properties -->
+       <option key="torque.om.useManagers" value="${torque.useManagers}"/>
+       <option key="torque.om.generateBeans" value="${torque.generateBeans}"/>
+       <option key="torque.om.objectIsCaching" value="${torque.objectIsCaching}"/>
+       <option key="torque.om.save.addSaveMethods" value="${torque.addSaveMethod}"/>
+       <option key="torque.om.addGetByNameMethods" value="${torque.addGetByNameMethod}"/>
+       <option key="torque.om.complexObjectModel" value="${torque.complexObjectModel}"/>
+
+      <option key="torque.om.package" value="${torque.targetPackage}"/>
+      <option key="torque.database" value="${torque.database}"/>
+      <option key="torque.om.complexObjectModel.generateFillers" value="${torque.generateFiller}"/>
+    </torque-generator>
+    <torque-generator
+        packaging="classpath"
+        configPackage="org.apache.torque.templates.sql"
+        sourceDir="src/main/schema"
+        defaultOutputDir="target/generated-sql">
+      <option key="torque.database" value="${torque.database}"/>
+    </torque-generator>
+  </target>
+
+  <target name="compile">
+    <echo>Compiling with classpathRuntime: ${classpathRuntime} ...</echo>
+    <mkdir dir="${basedir}/src/main/java"/>
+    <mkdir dir="${basedir}/src/main/generated-java"/>
+    <mkdir dir="${basedir}/src/main/resources"/>
+    <mkdir dir="${basedir}/target/classes"/>
+    <mkdir dir="${basedir}/target/generated-sources"/>
+    <javac debug="on" source="17" target="17" destdir="${basedir}/target/classes" includeAntRuntime="false" classpathref="runtime-classpath" fork="yes">
+      <src path="${basedir}/src/main/java"/>
+      <src path="${basedir}/src/main/generated-java"/>
+      <src path="${basedir}/target/generated-sources"/>
+    </javac>
+    <copy todir="${basedir}/target/classes">
+      <fileset dir="${basedir}/src/main/resources"/>
+    </copy>
+  </target>
+
+  <!-- Manual-only: requires an existing database instance and a configured JDBC URL.
+       Run 'ant execute-sql -f build-torque.xml' only after configuring torque.database.*
+       properties in build.properties. Not applicable for Derby Embedded. -->
+  <target name="execute-sql">
+    <echo>reading ${torque.project}-schema.sql and connect to ${torque.database.url} with user ${torque.database.user}, database must exist!</echo>
+    <echo>Set password at command line with -Dtorque.database.password=xxx...</echo>
+    <!-- mysql 8: The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. -->
+    <sql classpathref="ant-classpath"
+        driver="${torque.database.driver}"
+        url="${torque.database.url}"
+        userid="${torque.database.user}"
+        password="${torque.database.password}"
+        onerror="continue"
+        src="target/generated-sql/${torque.project}-schema.sql"/>
+  </target>
+
+  <taskdef
+    name="torque-jdbc2schema"
+    classpathref="ant-classpath"
+    classname="org.apache.torque.ant.task.Torque4JDBCTransformTask"/>
+
+  <!-- Manual-only: requires a running database instance with a configured JDBC URL.
+       Run 'ant jdbc -f build-torque.xml' only after configuring torque.database.*
+       properties in build.properties. -->
+  <target name="jdbc" description="==> jdbc to xml">
+    <echo> Generating XML from JDBC connection with antClasspath: ${antClasspath} ...</echo>
+    <echo message="+-----------------------------------------------+"/>
+    <echo message="|                                               |"/>
+    <echo message="| Generating XML from JDBC connection !         |"/>
+    <echo message="|                                               |"/>
+    <echo message="+-----------------------------------------------+"/>
+
+    <torque-jdbc2schema
+      dbDriver="${torque.database.driver}"
+      dbPassword="${torque.database.password}"
+      dbUrl="${torque.database.url}"
+      dbUser="${torque.database.user}"
+      packaging="classpath"
+      configPackage="org.apache.torque.templates.jdbc2schema"
+      defaultOutputDir="target/generated-schema"
+      >
+    </torque-jdbc2schema>
+
+  </target>
+
+  <target name="clean">
+    <delete dir="target"/>
+  </target>
+
+  <target name="main" description="build all" depends="generate, compile">
+  </target>
+
+</project>

Added: db/torque/trunk/torque-build/build.properties
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ db/torque/trunk/torque-build/build.properties	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -0,0 +1,172 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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.
+
+# -------------------------------------------------------------------
+#
+# T O R Q U E  C O N F I G U R A T I O N  F I L E
+#
+# -------------------------------------------------------------------
+# This file contains the most commonly used properties. For a
+# complete list of build properties, please refer to the torque-templates
+# options.properties file.
+# -------------------------------------------------------------------
+
+torque.home = .
+
+# -------------------------------------------------------------------
+#
+#  D I R E C T O R I E S
+#
+# -------------------------------------------------------------------
+
+torque.output.dir = ${torque.home}/src
+torque.schema.dir = ${torque.home}/src/main/schema
+
+# -------------------------------------------------------------------
+#
+#  P R O J E C T
+#
+# -------------------------------------------------------------------
+# Name of your Torque project. Non-Java generated files will be named
+# using the project name (e.g. bookstore-schema.sql for project=bookstore).
+# -------------------------------------------------------------------
+
+#torque.project = myproject
+
+
+# -------------------------------------------------------------------
+#
+#  T A R G E T  D A T A B A S E
+#
+# -------------------------------------------------------------------
+# The target database for SQL generation. Possible choices include:
+#   derby, hsqldb, mysql, postgresql, mssql, oracle
+#
+# Default: mysql 
+# Uncomment one of the blocks below to switch databases.
+# -------------------------------------------------------------------
+
+#torque.database = mysql
+
+
+# --- HSQLDB ---
+#torque.database = hsqldb
+# torque.database.driver = org.hsqldb.jdbcDriver
+# torque.database.url = jdbc:hsqldb:hsql://localhost/mydb
+# torque.database.user = sa
+# torque.database.password =
+
+# --- MySQL ---
+# torque.database = mysql
+# torque.database.driver = com.mysql.cj.jdbc.Driver
+# torque.database.url = jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true
+# torque.database.user = root
+# torque.database.password =
+
+# --- PostgreSQL ---
+torque.database = postgresql
+# torque.database.driver = org.postgresql.Driver
+# torque.database.url = jdbc:postgresql://localhost:5432/mydb
+# torque.database.user = postgres
+# torque.database.password =
+
+
+# -------------------------------------------------------------------
+#
+#  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.
+# -------------------------------------------------------------------
+#
+#  Reference in Torque-templates project in
+#  /src/main/resources/org/apache/torque/templates/om/conf/options.properties
+#
+#
+# addGetByNameMethod
+#   If true, Torque adds methods to get database fields by name/position.
+#
+# addIntakeRetrievable
+#   If true, the data objects will implement Intake's Retrievable
+#   interface
+#
+# addSaveMethod
+#   If true, Torque adds tracking code to determine how to save objects.
+#
+# addTimeStamp
+#   If true, Torque true puts time stamps in generated om files.
+#
+# basePrefix
+#   A string to pre-pend to the file names of base data and peer objects.
+#
+# complexObjectModel
+#   If true, Torque generates data objects with collection support and
+#   methods to easily retreive foreign key relationships.
+#
+# targetPackage
+#   Sets the Java package the om files will generated to, e.g.
+#   "com.company.project.om".
+#
+# useClasspath
+#   If true, Torque will not look in the <code>templatePath</code> directory,
+#   for templates, but instead load them from the classpath, allowing you to
+#   use Torque without extracted it from the jar.
+#
+# useManagers
+#   If true, Torque will generate Manager classes that use JCS for caching.
+#   Still considered experimental.
+#
+# objectIsCaching
+#   If true, Torque generates data objects that cache their foreign
+#   key relationships. If this is not desired (because the underlying objects
+#   can be manipulated from other code), set this property to false. This currently
+#   cannot combined with the manager setting from above.
+#
+# silentDbFetch
+#   If true, the getXXX() methods which retrieve associated objects
+#   will fetch the associated objects silently. If false, only the
+#   methods where a connection is specified explicitly will
+#   fetch the associated objects silently; the methods where no connection
+#   is specified will not do a silent fetch and return null if no previous
+#   explicit fetch was made.
+#   This setting has no effect if objectIsCaching is set to false.
+#
+#
+# generateBeans
+#   If true, Torque will generate an additional bean for each data object,
+#   plus methods to create beans from data objects and vice versa
+#
+# beanSuffix
+#   A String to append to the class name of generated beans (if they are generated)
+#
+
+torque.targetPackage = example.om
+
+torque.generateFiller = true
+torque.addGetByNameMethod = true
+torque.addIntakeRetrievable = false
+torque.addSaveMethod = true
+torque.addTimeStamp = true
+torque.basePrefix = Base
+torque.complexObjectModel = true
+torque.useClasspath = true
+torque.useManagers = true
+torque.objectIsCaching = false
+torque.silentDbFetch = true
+torque.generateBeans = true
+torque.beanSuffix = Bean

Added: db/torque/trunk/torque-build/pom.xml
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ db/torque/trunk/torque-build/pom.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+             http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.torque</groupId>
+        <artifactId>torque</artifactId>
+        <version>7.1-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <artifactId>torque-build</artifactId>
+    <packaging>pom</packaging>
+    <name>Torque Build Example</name>
+    <description>
+        Reference Ant build module for Torque ORM code generation. Provides
+        build-torque.xml and build.properties as a ready-to-use starting point
+        for new Torque projects.
+    </description>
+
+    <dependencies>
+        <!-- Runtime scope: copied to libs/ by maven-dependency-plugin -->
+        <dependency>
+            <groupId>org.apache.torque</groupId>
+            <artifactId>torque-ant-tasks</artifactId>
+            <version>${project.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.torque</groupId>
+            <artifactId>torque-templates</artifactId>
+            <version>${project.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.torque</groupId>
+            <artifactId>torque-runtime</artifactId>
+            <version>${project.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- Step 1: Copy all runtime dependencies into libs/ so build-torque.xml can use them -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.8.1</version>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <includeScope>runtime</includeScope>
+                            <outputDirectory>${project.basedir}/libs</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- Step 2: Run Ant generate + compile via the main target -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>clean-generated-sources</id>
+                        <phase>clean</phase>
+                        <configuration>
+                            <target>
+                                <!--  remove old generated sources -->
+                                <echo message="Deleting directory src/main/generated-java" />
+                                <delete dir="src/main/generated-java" />
+                                <!--  remove old generated sources -->
+                                <echo message="Deleting directory libs" />
+                                <delete dir="libs" />
+                            </target>
+                        </configuration>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>torque-generate</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <target>
+                                <ant antfile="${basedir}/build-torque.xml" target="main"/>
+                            </target>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <!--resources>
+            <resource>
+                <directory>${basedir}/src/main/resources</directory>
+                <filtering>false</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+       </resources-->
+    </build>
+
+</project>

Added: db/torque/trunk/torque-build/src/main/resources/log4j2.xml
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ db/torque/trunk/torque-build/src/main/resources/log4j2.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+-->
+<Configuration status="warn" name="Torque">
+    <Appenders>
+        <Console name="console" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d [%t] %-5p | %c - %m%n" />
+        </Console>
+        <File name="torque" fileName="./torque-build.log">
+            <PatternLayout pattern="%d [%t] %-5p %c - %m%n" />
+        </File>
+    </Appenders>
+    <Loggers>
+        <!-- get queries: -->
+        <Logger name="org.apache.torque.util" additivity="false" level="DEBUG">
+            <AppenderRef ref="torque"/>
+            <AppenderRef ref="console" level="INFO"/>
+        </Logger> 
+        <Logger name="org.apache.torque" additivity="false" level="INFO">
+            <AppenderRef ref="torque" />
+            <AppenderRef ref="console" />
+        </Logger>
+         <Logger name="org.apache.torque.dsfactory" additivity="false" level="DEBUG">
+            <AppenderRef ref="torque" />
+            <AppenderRef ref="console" level="ERROR" />
+        </Logger>
+        <Logger name="org.apache.commons.beanutils" additivity="false" level="WARN">
+            <AppenderRef ref="console" />
+        </Logger>
+        <Logger name="org.testcontainers" additivity="false" level="DEBUG">
+            <AppenderRef ref="torque" level="DEBUG" />
+            <AppenderRef ref="console" level="INFO"/>
+        </Logger>
+        <Logger name="org.apache.torque.generator.template.velocity" additivity="false" level="DEBUG">
+          <AppenderRef ref="torque" level="DEBUG"/>
+          <AppenderRef ref="console" level="INFO"/>
+        </Logger>
+        <Logger name="org.apache.torque.generator.template.groovy" additivity="false" level="DEBUG">
+          <AppenderRef ref="torque" level="DEBUG"/>
+          <AppenderRef ref="console" level="INFO"/>
+        </Logger>
+        <Logger name="org.apache.velocity" additivity="false" level="DEBUG">
+            <AppenderRef ref="console" level="DEBUG"/>
+        </Logger>
+        <Root level="DEBUG"><!-- log4j 1.2 has DEBUG -->
+            <AppenderRef ref="console" />
+            <AppenderRef ref="torque" />
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file

Added: db/torque/trunk/torque-build/src/main/schema/bookstore-schema.xml
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ db/torque/trunk/torque-build/src/main/schema/bookstore-schema.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+-->
+<!-- implementation of torque-test bookstore-scheam.xml -->
+<database name="bookstore"
+    defaultIdMethod="native"
+    xmlns="http://db.apache.org/torque/5.0/templates/database"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://db.apache.org/torque/5.0/templates/database
+        http://db.apache.org/torque/torque-5.0/documentation/orm-reference/database-5-0-strict.xsd">
+
+  <!-- =================================================== -->
+  <!-- B O O K  T A B L E                                  -->
+  <!-- =================================================== -->
+
+  <table name="book" description="Book table">
+    <column
+      name="book_id"
+      required="true"
+      primaryKey="true"
+      type="INTEGER"
+      description="Book Id"
+    />
+    <column
+      name="isbn"
+      required="false"
+      type="VARCHAR"
+      size="15"
+      description="ISBN"
+    />
+    <column
+      name="author_id"
+      required="true"
+      type="INTEGER"
+      description="Foreign Key Author"
+    />
+    <column
+      name="title"
+      required="true"
+      type="VARCHAR"
+      size="255"
+      description="Book Title"
+    />
+
+    <foreign-key foreignTable="author">
+      <reference local="author_id" foreign="author_id"/>
+    </foreign-key>
+
+  </table>
+
+
+  <!-- =================================================== -->
+  <!-- A U T H O R  T A B L E                              -->
+  <!-- =================================================== -->
+
+  <table name="author" description="Author table">
+    <column
+      name="author_id"
+      required="true"
+      primaryKey="true"
+      type="INTEGER"
+    />
+    <column
+      name="name"
+      required="true"
+      type="VARCHAR"
+      size="50"
+    />
+
+  </table>
+
+  <!-- =================================================== -->
+  <!-- B O O K _ A U T H O R  V I E W                      -->
+  <!-- =================================================== -->
+
+  <!--view name="BOOK_AUTHORS" sqlSuffix="from book join author on book.author_id=author.author_id">
+    <column name="book_id" type="INTEGER" select="book.book_id"/>
+    <column name="author_id" type="INTEGER" select="author.author_id"/>
+    <column name="book_title" type="VARCHAR" select="book.title"/>
+    <column name="author_name" type="VARCHAR" select="author.name"/>
+  </view-->
+
+
+  <table name="database_default_values">
+    <column
+      name="id"
+      required="true"
+      primaryKey="true"
+      type="INTEGER"
+    />
+    <!-- one normal field is required otherwise one gets syntax errors
+         on inserts where no value is changed. -->
+    <column
+      name="normal_payload"
+      type="INTEGER"
+    />
+    <column
+      name="o_integer"
+      required="true"
+      type="INTEGER"
+      javaType="object"
+      default="2"
+      useDatabaseDefaultValue="true"
+    />
+    <column
+      name="p_int"
+      required="true"
+      type="INTEGER"
+      javaType="primitive"
+      default="4"
+      useDatabaseDefaultValue="true"
+    />
+    <column
+      name="varchar_field"
+      required="true"
+      type="VARCHAR"
+      size="100"
+      default="Default!"
+      useDatabaseDefaultValue="true"
+    />
+	<!--  String yyyy-MM-dd for date values -->
+    <column
+      name="date_field"
+      type="DATE"
+      default="2010-09-08"
+      useDatabaseDefaultValue="true"
+    />
+	<!-- format String HH:mm:ss.S for time values -->
+    <column
+      name="time_field"
+      type="TIME"
+      default="10:20:30.0"
+      useDatabaseDefaultValue="true"
+    />
+	<!--  format String yyyy-MM-ddTHH:mm:ss.SSSSSSSSS for date and time values -->
+    <column
+      name="timestamp_field"
+      type="TIMESTAMP"
+      default="2010-09-08T11:12:13.0"
+      useDatabaseDefaultValue="true"
+    />
+  </table>
+
+  <table name="java_default_values">
+    <column
+      name="id"
+      required="true"
+      primaryKey="true"
+      type="INTEGER"
+    />
+    <column
+      name="o_integer"
+      required="true"
+      type="INTEGER"
+      javaType="object"
+      default="2"
+    />
+    <column
+      name="p_int"
+      required="true"
+      type="INTEGER"
+      javaType="primitive"
+      default="4"
+    />
+    <column
+      name="varchar_field"
+      required="true"
+      type="VARCHAR"
+      size="100"
+      default="Default!"
+    />
+	
+	<!--  String yyyy-MM-dd for date values -->
+    <column
+      name="date_field"
+      type="DATE"
+      default="2010-09-08"
+      required="true"
+    />
+	<!-- format String HH:mm:ss.S for time values -->
+    <column
+      name="time_field"
+      type="TIME"
+      default="10:20:30.0"
+      required="true"
+    />
+	<!--  format String yyyy-MM-ddTHH:mm:ss.SSSSSSSSS for date and time values -->
+    <column
+      name="timestamp_field"
+      type="TIMESTAMP"
+      default="2010-09-08T11:12:13.0"
+      required="true"
+    />
+	
+    <column
+      name="CURRENT_DATE_VALUE"
+      type="DATE"
+      useDatabaseDefaultValue="true"
+    />
+    <column
+      name="CURRENT_TIME_VALUE"
+      type="TIME"
+      useDatabaseDefaultValue="true"
+    />
+    <column
+      name="CURRENT_TIMESTAMP_VALUE"
+      type="TIMESTAMP"
+    />
+  </table>
+
+  <table name="CURRENT_DATE_TABLE" 
+       description="Table which has a column which uses CURRENT_DATE from the database as default">
+    <column
+      name="ID"
+      required="true"
+      primaryKey="true"
+      type="INTEGER"
+    />
+    <column
+      name="PAYLOAD"
+      required="false"
+      type="INTEGER"
+    />
+    <column
+      name="CURRENT_DATE_VALUE"
+      required="true"
+      type="DATE"
+      useDatabaseDefaultValue="true"
+    />
+  </table>
+
+  <table name="CURRENT_TIME_TABLE" 
+       description="Table to test the CURRENT_TIME function">
+    <column
+      name="ID"
+      required="true"
+      primaryKey="true"
+      type="INTEGER"
+    />
+    <column
+      name="PAYLOAD"
+      required="false"
+      type="INTEGER"
+    />
+    <column
+      name="CURRENT_TIME_VALUE"
+      required="true"
+      type="TIME"
+      useDatabaseDefaultValue="true"
+    />
+  </table>
+
+  <table name="CURRENT_TIMESTAMP_TABLE" 
+       description="Table to test the CURRENT_TIMESTAMP function">
+    <column
+      name="ID"
+      required="true"
+      primaryKey="true"
+      type="INTEGER"
+    />
+    <column
+      name="PAYLOAD"
+      required="false"
+      type="INTEGER"
+    />
+    <column
+      name="CURRENT_TIMESTAMP_VALUE"
+      required="true"
+      type="TIMESTAMP"
+      useDatabaseDefaultValue="true"
+    />
+  </table>
+  
+</database>

Modified: db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/index.xml
==============================================================================
--- db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/index.xml	Tue Aug 11 12:45:04 2026	(r1937058)
+++ db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/index.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -27,10 +27,22 @@
  <body>
   <section name="Internals">
     <p>
-      The documents in this section contains explanations 
+      The documents in this section contains explanations
       how the Torque generator works internally.
       This information is not needed to just use the Torque generator.
     </p>
+    <ul>
+      <li>
+        <a href="workflow.html">Generation Workflow and Call Hierarchy</a> —
+        end-to-end pipeline from <code>TorqueGeneratorTask</code> through
+        <code>Controller</code>, <code>SourceProvider</code>, <code>Outlet</code>,
+        and <code>ExistingTargetStrategy</code>; includes reverse engineering (jdbc target).
+      </li>
+      <li>
+        <a href="outletTypes.html">Outlet Types</a> —
+        Velocity and Groovy outlet implementations.
+      </li>
+    </ul>
   </section>
 
  </body>

Modified: db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/outletTypes.xml
==============================================================================
--- db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/outletTypes.xml	Tue Aug 11 12:45:04 2026	(r1937058)
+++ db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/outletTypes.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -26,30 +26,259 @@
 
  <body>
   <section name="Introduction">
-    The Torque generator can handle different outlet types, 
-    currently velocity and java outlets.
-    The velocity outlets use templates to produce the output, 
-    the java outlets create their output directly in java.
+    <p>
+      The Torque generator supports three outlet types. Each outlet type is identified
+      by the <code>xsi:type</code> attribute in the <code>outlets/*.xml</code>
+      configuration files inside a template set JAR.
+    </p>
+
+    <table>
+      <tr>
+        <th><code>xsi:type</code> value</th>
+        <th>Template mechanism</th>
+        <th>Template file extension</th>
+        <th>Used for</th>
+      </tr>
+      <tr>
+        <td><code>velocityOutlet</code></td>
+        <td>Apache Velocity template engine</td>
+        <td><code>.vm</code></td>
+        <td>Java ORM class generation (<code>om</code> template set)</td>
+      </tr>
+      <tr>
+        <td><code>groovyOutlet</code></td>
+        <td>Groovy template/script engine</td>
+        <td><code>.groovy</code></td>
+        <td>SQL DDL generation (<code>sql</code> template set, ddl sub-set)</td>
+      </tr>
+      <tr>
+        <td><code>javaOutlet</code></td>
+        <td>Java class — no template file</td>
+        <td>(none)</td>
+        <td>JDBC reverse engineering (<code>jdbc2schema</code> template set)</td>
+      </tr>
+    </table>
   </section>
   
+  <section name="Template Set Mapping">
+    <p>
+      Each standard Torque template set uses a specific outlet type. The choice is
+      driven by the complexity of the output being generated.
+    </p>
+
+    <table>
+      <tr>
+        <th><code>configPackage (with declaration information)</code></th>
+        <th>Outlet type</th>
+        <th>Template location</th>
+        <th>Why this outlet type</th>
+      </tr>
+      <tr>
+        <td><code>org.apache.torque.templates.om 
+        (declared in multiple outlets/*.xml</code></td>
+        <td><code>velocityOutlet )</code></td>
+        <td><code>om/templates/**/*.vm</code></td>
+        <td>
+          Java ORM class structure is predictable: table&#8594;class, column&#8594;field,
+          foreign-key&#8594;accessor. Velocity's <code>${variable}</code> interpolation
+          and <code>#foreach</code> loops are sufficient for this one-to-one mapping.
+          No per-database branching is needed because the Java ORM layer is
+          database-agnostic by design.
+        </td>
+      </tr>
+      <tr>
+        <td><code>org.apache.torque.templates.sql</code> (DDL sub-set)
+        (declared in outlets/ddl.xml)</td>
+        <td><code>groovyOutlet</code></td>
+        <td><code>sql/templates/ddl/**/*.groovy</code></td>
+        <td>
+          SQL DDL syntax varies significantly across the supported databases (Derby,
+          MySQL, PostgreSQL, Oracle, MSSQL, HSQLDB). Groovy provides real
+          <code>if/else</code> branching, method calls, and dynamic dispatch, which
+          are necessary to produce correct DDL for six or more databases from a
+          single template. Velocity's scripting directives are less expressive for
+          this level of per-database variation.
+        </td>
+      </tr>
+      <tr>
+        <td><code>org.apache.torque.templates.sql</code> (createdb sub-set) 
+        (declared in createdb/outlets/createdb.xml)</td>
+        <td><code>velocityOutlet</code></td>
+        <td><code>sql/createdb/**/*.vm</code></td>
+        <td>
+          Database creation scripts are simpler in structure than DDL and use
+          Velocity templates (legacy; this sub-set predates the Groovy migration
+          for the main DDL set).
+        </td>
+      </tr>
+      <tr>
+        <td><code>org.apache.torque.templates.jdbc2schema
+        (declared in jdbc2schema/outlets/jdbc2schema.xml)</code></td>
+        <td><code>javaOutlet</code></td>
+        <td>(none)</td>
+        <td>
+          The reverse-engineering output is a single <code>schema.xml</code> with a
+          fixed structure that mirrors JDBC <code>DatabaseMetaData</code>. The Java
+          class <code>XmlOutlet</code> generates this XML directly from the source
+          element tree without a template, since the output format is fixed and the
+          mapping from JDBC metadata to XML attributes is straightforward imperative
+          code.
+        </td>
+      </tr>
+    </table>
+  </section>
+
+  <section name="Outlet Declaration Examples">
+    <p>
+      Each outlet is declared in an <code>outlets/*.xml</code> configuration file
+      inside the template set JAR. The key distinguishing attribute is
+      <code>path</code> (for template-based outlets) vs <code>class</code>
+      (for Java outlets).
+    </p>
+
+    <p><strong>velocityOutlet</strong> — uses <code>path</code> pointing to a <code>.vm</code> file:</p>
+    <source><![CDATA[
+<outlet xsi:type="velocityOutlet"
+        name="torque.om.peer.basePeer"
+        path="templates/peer/BasePeer.vm"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <!-- child elements omitted for brevity -->
+</outlet>
+]]></source>
+
+    <p><strong>groovyOutlet</strong> — uses <code>path</code> pointing to a <code>.groovy</code> file:</p>
+    <source><![CDATA[
+<outlet xsi:type="groovyOutlet"
+        name="torque.sql.ddl.table"
+        path="templates/ddl/table.groovy"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <!-- child elements omitted for brevity -->
+</outlet>
+]]></source>
+
+    <p><strong>javaOutlet</strong> — uses <code>class</code> (fully-qualified Java class) instead of <code>path</code>:</p>
+    <source><![CDATA[
+<outlet xsi:type="javaOutlet"
+        name="torque.jdbc2schema.schema"
+        class="org.apache.torque.generator.outlet.java.XmlOutlet"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <!-- child elements omitted for brevity -->
+</outlet>
+]]></source>
+  </section>
+
+  <section name="Decision Guide">
+    <p>
+      When writing a new template set, use the following criteria to choose the
+      correct outlet type:
+    </p>
+
+    <table>
+      <tr>
+        <th>Scenario</th>
+        <th>Recommended outlet type</th>
+        <th>Rationale</th>
+      </tr>
+      <tr>
+        <td>
+          Generating predictable Java or XML boilerplate where schema elements
+          (tables, columns) map directly to output structure (classes, fields)
+          with simple variable substitution and iteration
+        </td>
+        <td><code>velocityOutlet</code></td>
+        <td>
+          Velocity's <code>${var}</code> and <code>#foreach</code> are concise
+          and readable for one-to-one mapping. Use <code>.vm</code> template files.
+        </td>
+      </tr>
+      <tr>
+        <td>
+          Generating SQL or configuration that must vary significantly per target
+          database or environment, requiring conditional logic, method calls, or
+          helper object interactions
+        </td>
+        <td><code>groovyOutlet</code></td>
+        <td>
+          Groovy's full programming model handles complex branching and
+          <code>torqueGenGroovy.mergepoint()</code> invocations that Velocity
+          cannot express cleanly. Use <code>.groovy</code> template files.
+        </td>
+      </tr>
+      <tr>
+        <td>
+          Generating a fixed-structure output (e.g., XML schema, property file)
+          entirely from metadata already in the source element tree, where a
+          template would add no value over direct programmatic generation
+        </td>
+        <td><code>javaOutlet</code></td>
+        <td>
+          A Java class implementing <code>Outlet</code> generates the output
+          directly. No template file is needed; use the <code>class</code>
+          attribute instead of <code>path</code> in the outlet declaration.
+        </td>
+      </tr>
+    </table>
+
+    <p>
+      To use a custom outlet type not covered above, implement a SAX handler
+      factory and register it via the <code>ReflectionOutletSaxHandlerFactory</code>
+      naming convention (see the Configuration section below).
+    </p>
+  </section>
+
   <section name="Configuration">
-    As the different outlet types need different configurations, a
-    custom configuration parser is needed for each outlet type. 
-    (The generator type is determined by the "xsi:type" attribute of the
-    outlet and filenameOutlet elements in the project configuration).
-    The Torque generator needs to be told which parser it should use for which 
-    outlet type. This is done by registering a outletHandlerFactory
-    for each generator type, see the register methods in the
-    <code>org.apache.torque.generator.configuration.OutletTypes</code> class.
-    The outletTypes instance is accessible via the ConfigurationHandlers
-    instance in the Configuration object. 
-    This could in principle be used to plug in new outlet types,
-    but alas, the configuration object is hidden in the controller instance
-    and not accessible from the outside :-(. However, there is one
-    handler factory registered by default, the 
-    <code>org.apache.torque.generator.configuration.outlet.ReflectionOutletSaxHandlerFactory</code>,
-    which can be used to access new outlet types using a naming convention;
-    which suffices to register new outlet types.
+    <p>
+      Because each outlet type needs a different configuration parser, a
+      <em>SAX handler factory</em> is registered for each outlet type via the
+      <code>register</code> methods in
+      <code>org.apache.torque.generator.configuration.OutletTypes</code>.
+      The outlet type is determined by the <code>xsi:type</code> attribute of
+      the <code>outlet</code> and <code>filenameOutlet</code> elements in the
+      project configuration.
+    </p>
+
+    <p>
+      Three outlet SAX handler factories are registered by default:
+    </p>
+    <ul>
+      <li>
+        <code>org.apache.torque.generator.configuration.outlet.VelocityOutletSaxHandlerFactory</code>
+        — handles <code>xsi:type="velocityOutlet"</code>; reads the <code>path</code> attribute
+        and loads the referenced <code>.vm</code> Velocity template from the classpath.
+      </li>
+      <li>
+        <code>org.apache.torque.generator.configuration.outlet.GroovyOutletSaxHandlerFactory</code>
+        — handles <code>xsi:type="groovyOutlet"</code>; reads the <code>path</code> attribute
+        and loads the referenced <code>.groovy</code> script.
+      </li>
+      <li>
+        <code>org.apache.torque.generator.configuration.outlet.JavaOutletSaxHandlerFactory</code>
+        — handles <code>xsi:type="javaOutlet"</code>; reads the <code>class</code> attribute
+        and instantiates the named Java class directly (no template file involved).
+      </li>
+    </ul>
+
+    <p>
+      In addition, a fourth factory is registered as an extension mechanism:
+    </p>
+    <ul>
+      <li>
+        <code>org.apache.torque.generator.configuration.outlet.ReflectionOutletSaxHandlerFactory</code>
+        — a dynamic dispatcher. Given a novel <code>xsi:type</code> value
+        (e.g., <code>"foo"</code>), it constructs the expected handler class name by
+        naming convention (e.g., <code>FooSaxHandler</code>) and loads it via reflection.
+        This allows new outlet types to be added without modifying <code>OutletTypes.java</code>
+        — the new SAX handler class just needs to be on the classpath.
+      </li>
+    </ul>
+
+    <p>
+      The <code>OutletTypes</code> instance is accessible from the
+      <code>ConfigurationHandlers</code> held by the <code>Configuration</code> object.
+      Note that the configuration object is encapsulated inside the controller instance;
+      the reflection-based factory is therefore the practical way to register custom outlet
+      types at runtime.
+    </p>
   </section>
   
  </body>

Added: db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/workflow.xml
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ db/torque/trunk/torque-site/src/site/xdoc/documentation/codegen-reference/generator-internals/workflow.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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>Generation Workflow and Call Hierarchy</title>
+  </properties>
+
+  <body>
+
+    <section name="Generation Workflow Overview">
+
+      <p>
+        The Torque code-generation pipeline processes XML schema files and produces Java ORM
+        classes and SQL DDL through a four-stage pipeline. The entry point is either an Ant
+        task (<code>TorqueGeneratorTask</code>) or a Maven mojo (<code>TorqueGeneratorMojo</code>);
+        both delegate to the same internal <code>Controller</code>.
+      </p>
+
+      <p>
+        The full call chain from an Ant invocation:
+      </p>
+
+      <source><![CDATA[
+User build (Ant build.xml or Maven pom.xml)
+  └── TorqueGeneratorTask.execute()      [torque-ant-tasks]
+        └── Controller.run()             [torque-generator]
+              ├── Configuration          reads templates + generator config from classpath/jar
+              │     └── UnitConfiguration  per generation unit (om, sql, jdbc2schema)
+              ├── SourceProvider         reads XML schema files from sourceDir
+              │     └── FileSourceProvider → parses schema XML → SourceElement tree
+              ├── SourceTransformer      optional pre-processing of source model
+              ├── Outlet (template engine)
+              │     └── configPackage selects template set:
+              │           • org.apache.torque.templates.om   → Java ORM Base* + header classes
+              │           • org.apache.torque.templates.sql  → *-schema.sql DDL files
+              │           • org.apache.torque.templates.jdbc2schema → schema.xml from live DB
+              └── ExistingTargetStrategy   merge / replace / skip for already-generated files
+                    └── MergeTargetFileStrategy uses JGit three-way merge to preserve hand-edits
+]]></source>
+
+      <p>
+        Two <code>torque-generator</code> invocations are required for each project:
+      </p>
+      <ol>
+        <li>
+          <strong>ORM generation</strong> (<code>configPackage=org.apache.torque.templates.om</code>)
+          — writes <code>Base*</code> classes to <code>target/generated-sources/</code> and
+          editable header classes to <code>src/main/generated-java/</code>.
+        </li>
+        <li>
+          <strong>SQL generation</strong> (<code>configPackage=org.apache.torque.templates.sql</code>)
+          — writes DDL files to <code>target/generated-sql/</code>.
+        </li>
+      </ol>
+
+    </section>
+
+    <section name="Stage 1: Source Reading">
+
+      <p>
+        The <code>SourceProvider</code> interface abstracts how schema data enters the pipeline.
+        The standard implementation is <code>FileSourceProvider</code>, which reads XML schema
+        files from the directory specified by <code>sourceDir</code> in the Ant task or
+        <code>schemaDir</code> in the Maven mojo.
+      </p>
+
+      <p>
+        Each schema file is parsed into a <code>SourceElement</code> tree — a generic
+        node-attribute model that the template engine traverses. The root element corresponds
+        to the <code>&lt;database&gt;</code> element of the schema XML, with child elements
+        for each <code>&lt;table&gt;</code>, <code>&lt;column&gt;</code>,
+        <code>&lt;foreign-key&gt;</code>, and <code>&lt;view&gt;</code>.
+      </p>
+
+      <p>
+        Key classes in <code>torque-generator</code>:
+      </p>
+      <ul>
+        <li>
+          <code>org.apache.torque.generator.source.SourceProvider</code> — interface
+        </li>
+        <li>
+          <code>org.apache.torque.generator.source.file.PropertiesSourceProvider</code> — for
+          properties files (used internally for options)
+        </li>
+        <li>
+          <code>org.apache.torque.generator.source.stream.FileSourceProvider</code> — reads
+          schema XML from the filesystem
+        </li>
+      </ul>
+
+    </section>
+
+    <section name="Stage 2: Source Transformation">
+
+      <p>
+        After reading, the <code>SourceElement</code> tree may be pre-processed by one or
+        more <code>SourceTransformer</code> implementations. Transformers can add, remove, or
+        modify nodes before template rendering begins. This stage is optional; the ORM and SQL
+        template sets include transformers that compute derived attributes (e.g., Java class
+        names from SQL table names, column getter/setter names).
+      </p>
+
+      <p>
+        Transformers are declared in the generator configuration XML bundled inside the
+        <code>torque-templates</code> JAR. Custom transformers can be contributed via the
+        generator configuration.
+      </p>
+
+    </section>
+
+    <section name="Stage 3: Template Rendering">
+
+      <p>
+        The <code>Outlet</code> interface represents a template engine invocation. Two
+        implementations are used:
+      </p>
+      <ul>
+        <li>
+          <strong>Velocity outlets</strong> — most ORM and SQL templates use Apache Velocity
+          (files with <code>.vm</code> extension inside the template JAR).
+        </li>
+        <li>
+          <strong>Groovy outlets</strong> — some helper outputs use Groovy scripts for
+          programmatic control.
+        </li>
+      </ul>
+
+      <p>
+        The <code>configPackage</code> attribute on the Ant task selects which template set
+        to apply. The generator locates templates either from the classpath (when
+        <code>packaging="classpath"</code>) or from a directory on the filesystem (when
+        <code>packaging="directory"</code>).
+      </p>
+
+      <p>
+        <strong>classpath packaging</strong> (recommended): the template resources are loaded
+        from the <code>torque-templates</code> JAR on the Ant classpath. The generator finds
+        the generator configuration XML at
+        <code>org/apache/torque/templates/om/generator.xml</code> (for the om template set)
+        inside the JAR. This is the standard deployment mode used in
+        <code>build-torque.xml</code>.
+      </p>
+
+      <p>
+        <strong>directory packaging</strong>: the template resources are read from a local
+        directory. This mode is used during template development or when customising templates
+        without rebuilding the JAR.
+      </p>
+
+      <p>
+        For each output file, the <code>Controller</code> calls
+        <code>Outlet.generate(SourceElement, GeneratorContext)</code>, which renders the
+        template against the current schema element and returns the generated content as a
+        string.
+      </p>
+
+      <p>
+        For a full breakdown of which outlet type each standard template set uses, how to
+        choose the correct outlet type for a new template set, and the declaration syntax
+        for each type, see <a href="outletTypes.html">Outlet Types</a>.
+      </p>
+
+    </section>
+
+    <section name="Stage 4: Output Merge">
+
+      <p>
+        After rendering, the <code>ExistingTargetStrategy</code> decides what to do when the
+        target output file already exists. Three strategies are available:
+      </p>
+
+      <ul>
+        <li>
+          <strong>replace</strong> — always overwrite the existing file. Used for
+          <code>Base*</code> classes in <code>target/generated-sources/</code>.
+        </li>
+        <li>
+          <strong>skip</strong> — never overwrite. Used when a file has been manually
+          customised and should not be touched by the generator again.
+        </li>
+        <li>
+          <strong>merge</strong> — perform a JGit three-way merge between the previous
+          generated content, the current generated content, and the user's hand-edited
+          version. Used for header classes in <code>src/main/generated-java/</code>.
+          The implementation is <code>MergeTargetFileStrategy</code>, which uses
+          Eclipse JGit to compute the merge without requiring a Git repository on disk.
+        </li>
+      </ul>
+
+      <p>
+        The merge strategy means that developers can safely add custom methods and fields
+        to header classes and re-run generation without losing their changes, as long as
+        those changes do not overlap with sections modified by the generator.
+      </p>
+
+      <p>
+        The strategy for each output is declared in the generator configuration XML inside
+        <code>torque-templates</code>. To inspect which strategy a given output uses, look
+        at the <code>&lt;existingTargetStrategy&gt;</code> element in the relevant
+        <code>generator.xml</code> file inside the JAR.
+      </p>
+
+    </section>
+
+    <section name="Reverse Engineering (jdbc target)">
+
+      <p>
+        The reverse-engineering pipeline reuses the same <code>Controller</code> infrastructure
+        but uses a different entry point and template set:
+      </p>
+
+      <ul>
+        <li>
+          <strong>Entry point</strong>: <code>Torque4JDBCTransformTask</code> (Ant) →
+          <code>TorqueJDBCTransformTask</code> (internal) — these tasks connect to a live
+          database via JDBC and build a <code>SourceElement</code> tree from the JDBC metadata
+          (tables, columns, primary keys, foreign keys).
+        </li>
+        <li>
+          <strong>Template set</strong>: <code>configPackage=org.apache.torque.templates.jdbc2schema</code>
+          — renders the JDBC metadata tree into a <code>schema.xml</code> file written to
+          <code>target/generated-schema/</code>.
+        </li>
+        <li>
+          <strong>Output strategy</strong>: replace (the generated <code>schema.xml</code>
+          is always overwritten on each invocation).
+        </li>
+      </ul>
+
+      <p>
+        After reverse engineering, the generated <code>schema.xml</code> is a starting point
+        for hand-editing. Copy it to <code>src/main/schema/</code>, rename it to match
+        <code>torque.project</code>, and then run <code>ant generate</code> to produce ORM
+        classes and SQL DDL from it.
+      </p>
+
+      <p>
+        Because reverse engineering requires a running database instance with JDBC credentials,
+        the <code>jdbc</code> Ant target is a manual-only operation and is not part of
+        automated CI.
+      </p>
+
+    </section>
+
+  </body>
+
+</document>

Modified: db/torque/trunk/torque-site/src/site/xdoc/documentation/tutorial/orm/step1-ant.xml
==============================================================================
--- db/torque/trunk/torque-site/src/site/xdoc/documentation/tutorial/orm/step1-ant.xml	Tue Aug 11 12:45:04 2026	(r1937058)
+++ db/torque/trunk/torque-site/src/site/xdoc/documentation/tutorial/orm/step1-ant.xml	Tue Aug 11 13:36:00 2026	(r1937059)
@@ -199,6 +199,81 @@
 
 </section>
 
+<section name="Using the torque-build Reference Module">
+
+<p>
+  Instead of crafting the <code>build.xml</code> Ant file by hand, you can use the
+  <strong>torque-build</strong> reference module that ships with the Torque source
+  distribution. It provides a ready-to-use <code>build-torque.xml</code> with all
+  generation and compilation targets pre-configured, plus a <code>build.properties</code>
+  file where you set your database-specific settings.
+</p>
+
+<p>
+  The reference module uses <code>torque.database=postgresql</code> as its default,
+  so you can test generation without an external database. To switch databases, open
+  <code>build.properties</code>, comment out the PostgreSQL line, and uncomment the
+  block for your database (MySQL, HSQLDB).
+</p>
+
+<p>
+  To use <code>torque-build</code> as your starting point:
+</p>
+
+<ol>
+  <li>
+    Copy <code>torque-build/build-torque.xml</code> and
+    <code>torque-build/build.properties</code> into your project root.
+  </li>
+  <li>
+    Place your schema XML file in <code>src/main/schema/</code>.
+  </li>
+  <li>
+    Edit <code>build.properties</code>: set <code>torque.database</code> and
+    (for non-Derby databases) the JDBC driver, URL, user, and password.
+  </li>
+  <li>
+    Resolve all runtime dependencies and run generation with one command:
+    <source>mvn process-resources -Pexamples</source>
+    Or, if you prefer to invoke Ant directly, first resolve dependencies:
+    <source>mvn dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=libs</source>
+    then run:
+    <source>ant generate -f build-torque.xml
+ant compile -f build-torque.xml</source>
+  </li>
+</ol>
+
+<p>
+  After generation you will find:
+</p>
+
+<ul>
+  <li>
+    Generated Java ORM base classes in <code>target/generated-sources/</code>
+  </li>
+  <li>
+    Editable header classes in <code>src/main/generated-java/</code>
+  </li>
+  <li>
+    Generated SQL DDL in <code>target/generated-sql/</code>
+  </li>
+</ul>
+
+<p>
+  <strong>JGit merge</strong>: the Torque generator uses a JGit three-way merge strategy
+  for files in <code>src/main/generated-java/</code>. This means you can safely add custom
+  logic to the header classes and re-run <code>ant generate</code> without losing your
+  hand-edits — the generator merges new output with your changes.
+</p>
+
+<p>
+  See <code>torque-build/README.md</code> in the source distribution for the full
+  configuration guide, including database-specific property blocks, the complete Ant
+  target reference, and logging configuration.
+</p>
+
+</section>
+
 <section name="Library set-up">
 <p>
   For the Torque generator/jdbc and SQL ant tasks to work correctly,
@@ -224,8 +299,8 @@
     Put the torque-generator-tasks-${version}.jar from its root directory to the directory of your project containing your dependency libraries ("libs" in this example).
   </li>
   <li>
-   Download the <a href="http://www.apache.org/dyn/closer.cgi/db/torque/torque-5.0/">sources</a>  and run from the source repo's sub folder 
-   <code>cd torque-5.0/torque-generator</code> the following command, which copies all dependencies if Torque Generator to libs.
+   Download the <a href="http://www.apache.org/dyn/closer.cgi/db/torque/torque-7.0/">sources</a>  and run from the source repo's sub folder 
+   <code>cd torque-7.0/torque-generator</code> the following command, which copies all dependencies if Torque Generator to libs.
     <code>mvn clean dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=libs -DexcludeScope=test</code>)
   </li>
   <li>To configure Logging (Log4j2) set e.g.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.