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