View Javadoc

1   /**
2    * Copyright 2004-2012 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.apache.torque.mojo;
17  
18  import org.apache.maven.plugin.MojoExecutionException;
19  import org.apache.torque.util.ChangeDetector;
20  
21  /**
22   * Generates platform specific SQL from database agnostic XML files.<br>
23   * <br>
24   * There are two types of SQL files created by this goal:<br>
25   * <br>
26   * Type 1: DDL statements for creating tables, primary keys, indexes, and unique constraints. Does not contain DDL for
27   * enforcing relationships between tables.<br>
28   * Type 2: DDL statements for creating and enforcing relationships between tables<br>
29   * <br>
30   * This allows data to be imported into multiple tables concurrently. Running the first type of SQL file will create the
31   * empty tables without any foreign key constraints. Data can then be loaded concurrently into the tables (using
32   * optimized high speed tools if desired) without needing to worry about the order in which the tables are loaded. After
33   * data has been loaded, the second type of SQL file can be run to add the relationships between the tables. As long as
34   * the data set is consistent and correct, all the relationships will get created correctly.<br>
35   * <br>
36   * The database platform to generate SQL for is determined by ${targetDatabase}. See also <code>impex:datasql</code>
37   *
38   * @goal schemasql
39   * @phase generate-sources
40   */
41  public class SchemaSqlMojo extends SqlMojoBase {
42  
43      /**
44       * The directory in which the SQL will be generated.
45       *
46       * @parameter property="outputDir" expression="${outputDir}" default-value="${project.build.directory}/classes/sql"
47       */
48      @SuppressWarnings("unused")
49      private String dummy1;
50  
51      /**
52       * The location where the report file will be generated.
53       *
54       * @parameter property="reportFile" expression="${reportFile}" default-value=
55       * "../../../reports/report.${project.artifactId}.sql.generation"
56       */
57      @SuppressWarnings("unused")
58      private String dummy2;
59  
60      /**
61       * The location where the context property file for velocity will be generated.
62       *
63       * @parameter property="contextPropertiesPath" expression="${contextPropertiesPath}"
64       * default-value="${project.build.directory}/reports/context.sql.properties"
65       */
66      @SuppressWarnings("unused")
67      private String dummy3;
68  
69      /**
70       * The suffix of the generated sql files.
71       *
72       * @parameter property="suffix" expression="${suffix}"
73       */
74      @SuppressWarnings("unused")
75      private String dummy4;
76  
77      protected void showConfig() {
78          getLog().info("Schema Dir: " + getSchemaDir());
79          getLog().info("Includes: " + getSchemaIncludes());
80          getLog().info("Excludes: " + getSchemaExcludes());
81      }
82  
83      /**
84       * Generate SQL from schema XML files
85       */
86      @Override
87      public void executeMojo() throws MojoExecutionException {
88          updateConfiguration();
89          validateConfiguration();
90          generateContextProperties();
91          configureTask();
92          addTargetDatabaseToOutputDir();
93          addTargetDatabaseToReportFile();
94          showConfig();
95          ChangeDetector detector = new ChangeDetector(getCanonicalReportFile(), getSchemaFiles());
96          if (!detector.isChanged() && isRunOnlyOnSchemaChange()) {
97              getLog().info("Schema has not changed.  Skipping generation");
98              return;
99          }
100         getLog().info("------------------------------------------------------------------------");
101         getLog().info("Generating SQL for " + getTargetDatabase() + " from schema XML files");
102         getLog().info("------------------------------------------------------------------------");
103         getAntTask().execute();
104     }
105 }