001 package org.apache.torque.mojo;
002
003 import org.apache.maven.plugin.MojoExecutionException;
004 import org.apache.torque.util.ChangeDetector;
005
006 /**
007 * Generates platform specific SQL from database agnostic XML files.<br>
008 * <br>
009 * There are two types of SQL files created by this goal:<br>
010 * <br>
011 * Type 1: DDL statements for creating tables, primary keys, indexes, and unique constraints. Does not contain DDL for
012 * enforcing relationships between tables.<br>
013 * Type 2: DDL statements for creating and enforcing relationships between tables<br>
014 * <br>
015 * This allows data to be imported into multiple tables concurrently. Running the first type of SQL file will create the
016 * empty tables without any foreign key constraints. Data can then be loaded concurrently into the tables (using
017 * optimized high speed tools if desired) without needing to worry about the order in which the tables are loaded. After
018 * data has been loaded, the second type of SQL file can be run to add the relationships between the tables. As long as
019 * the data set is consistent and correct, all the relationships will get created correctly.<br>
020 * <br>
021 * The database platform to generate SQL for is determined by ${targetDatabase}. See also <code>impex:datasql</code>
022 *
023 * @goal schemasql
024 * @phase generate-sources
025 */
026 public class SchemaSqlMojo extends SqlMojoBase {
027
028 /**
029 * The directory in which the SQL will be generated.
030 *
031 * @parameter property="outputDir" expression="${outputDir}" default-value="${project.build.directory}/classes/sql"
032 */
033 @SuppressWarnings("unused")
034 private String dummy1;
035
036 /**
037 * The location where the report file will be generated.
038 *
039 * @parameter property="reportFile" expression="${reportFile}" default-value=
040 * "../../../reports/report.${project.artifactId}.sql.generation"
041 */
042 @SuppressWarnings("unused")
043 private String dummy2;
044
045 /**
046 * The location where the context property file for velocity will be generated.
047 *
048 * @parameter property="contextPropertiesPath" expression="${contextPropertiesPath}"
049 * default-value="${project.build.directory}/reports/context.sql.properties"
050 */
051 @SuppressWarnings("unused")
052 private String dummy3;
053
054 /**
055 * The suffix of the generated sql files.
056 *
057 * @parameter property="suffix" expression="${suffix}"
058 */
059 @SuppressWarnings("unused")
060 private String dummy4;
061
062 protected void showConfig() {
063 getLog().info("Schema Dir: " + getSchemaDir());
064 getLog().info("Includes: " + getSchemaIncludes());
065 getLog().info("Excludes: " + getSchemaExcludes());
066 }
067
068 /**
069 * Generate SQL from schema XML files
070 */
071 @Override
072 public void executeMojo() throws MojoExecutionException {
073 updateConfiguration();
074 validateConfiguration();
075 generateContextProperties();
076 configureTask();
077 addTargetDatabaseToOutputDir();
078 addTargetDatabaseToReportFile();
079 showConfig();
080 ChangeDetector detector = new ChangeDetector(getCanonicalReportFile(), getSchemaFiles());
081 if (!detector.isChanged() && isRunOnlyOnSchemaChange()) {
082 getLog().info("Schema has not changed. Skipping generation");
083 return;
084 }
085 getLog().info("------------------------------------------------------------------------");
086 getLog().info("Generating SQL for " + getTargetDatabase() + " from schema XML files");
087 getLog().info("------------------------------------------------------------------------");
088 getAntTask().execute();
089 }
090 }