001 /** 002 * Copyright 2004-2013 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 java.io.File; 019 import java.util.List; 020 021 import org.apache.commons.configuration.PropertiesConfiguration; 022 import org.apache.maven.plugin.MojoExecutionException; 023 import org.apache.torque.util.ChangeDetector; 024 import org.apache.torque.util.SimpleScanner; 025 import org.kuali.core.db.torque.KualiTorqueDataSQLTask; 026 027 /** 028 * Generates platform specific SQL from database agnostic XML files. Each SQL file created by this goal contains data for a single table. The database platform to generate SQL for 029 * is determined by ${targetDatabase}. See also <code>impex:schemasql</code> 030 * 031 * @goal datasql 032 * @phase generate-sources 033 */ 034 public class DataSqlMojo extends DataModelTaskMojo { 035 /** 036 * The directory in which the SQL will be generated. 037 * 038 * @parameter expression="${outputDir}" default-value="${project.build.directory}/classes/sql" 039 * @required 040 */ 041 @SuppressWarnings("unused") 042 private String dummy; 043 044 /** 045 * The location where the SQL file will be generated. 046 * 047 * @parameter expression="${reportFile}" default-value="../../../reports/report.${project.artifactId}-data.sql" 048 */ 049 @SuppressWarnings("unused") 050 private String dummy2; 051 052 /** 053 * The location where the context property file for velocity will be generated. 054 * 055 * @parameter expression="${contextPropertiesPath}" default-value="${project.build.directory}/reports/context.datasql.properties" 056 */ 057 @SuppressWarnings("unused") 058 private String dummy3; 059 060 /** 061 * Only run this mojo if the data or schema has changed since the last run 062 * 063 * @parameter expression="${runOnlyOnChange}" default-value="true" 064 * @required 065 */ 066 private boolean runOnlyOnChange; 067 068 /** 069 * The XML file describing the database schema 070 * 071 * @parameter expression="${schemaXMLFile}" default-value="${basedir}/src/main/impex/${project.artifactId}.xml" 072 * @required 073 */ 074 private File schemaXMLFile; 075 076 /** 077 * The directory containing data XML files 078 * 079 * @parameter expression="${dataXMLDir}" default-value="${basedir}/src/main/impex" 080 * @required 081 */ 082 private File dataXMLDir; 083 084 /** 085 * The default set of files in that directory to include (ant style notation) 086 * 087 * @parameter expression="${dataXMLIncludes}" default-value="*.xml" 088 * @required 089 */ 090 private String dataXMLIncludes; 091 092 /** 093 * The default set of files in that directory to exclude (ant style notation) 094 * 095 * @parameter expression="${dataXMLExcludes}" default-value="${project.artifactId}.xml" 096 */ 097 private String dataXMLExcludes; 098 099 /** 100 * The DTD for the data XML files 101 * 102 * @parameter expression="${dataDTD}" default-value="${project.build.directory}/generated-impex/${project.artifactId}.dtd" 103 * @required 104 */ 105 private File dataDTD; 106 107 @Override 108 public void executeMojo() throws MojoExecutionException { 109 // loadPropertiesToMojo(); 110 updateConfiguration(); 111 validateConfiguration(); 112 generateContextProperties(); 113 configureTask(); 114 addTargetDatabaseToOutputDir(); 115 addTargetDatabaseToReportFile(); 116 ChangeDetector schema = new ChangeDetector(getCanonicalReportFile(), getSchemaFiles()); 117 ChangeDetector data = new ChangeDetector(getCanonicalReportFile(), getDataFiles()); 118 if (!schema.isChanged() && !data.isChanged() && isRunOnlyOnChange()) { 119 getLog().info("------------------------------------------------------------------------"); 120 getLog().info("Data and schema are unchanged. Skipping generation."); 121 getLog().info("------------------------------------------------------------------------"); 122 return; 123 } 124 getLog().info("------------------------------------------------------------------------"); 125 getLog().info("Generating SQL for " + getTargetDatabase() + " from data XML files"); 126 getLog().info("------------------------------------------------------------------------"); 127 getAntTask().execute(); 128 } 129 130 protected List<File> getDataFiles() { 131 return new SimpleScanner(getDataXMLDir(), getDataXMLIncludes(), getDataXMLExcludes()).getFiles(); 132 } 133 134 /** 135 * Returns the context properties for the Texen task. 136 * 137 * @return The PropertiesConfiguration containing all context properties, not null. 138 */ 139 @Override 140 protected PropertiesConfiguration getMojoContextProperties() { 141 PropertiesConfiguration configuration = new PropertiesConfiguration(); 142 configuration.addProperty(TARGET_DATABASE_CONTEXT_PROPERTY, super.getTargetDatabase()); 143 return configuration; 144 } 145 146 /** 147 * Configures the Texen task wrapped by this mojo 148 */ 149 @Override 150 protected void configureTask() throws MojoExecutionException { 151 KualiTorqueDataSQLTask task = new KualiTorqueDataSQLTask(); 152 setAntTask(task); 153 super.configureTask(); 154 task.setDataDTD(getDataDTD()); 155 task.addFileset(getAntFileSet(getDataXMLDir(), getDataXMLIncludes(), getDataXMLExcludes())); 156 task.setXmlFile(getSchemaXMLFile().getAbsolutePath()); 157 task.setTargetDatabase(getTargetDatabase()); 158 } 159 160 /** 161 * Returns the path to the control template. 162 * 163 * @return "sql/load/Control.vm" 164 */ 165 @Override 166 protected String getControlTemplate() { 167 return "sql/load/Control.vm"; 168 } 169 170 public String getDataXMLIncludes() { 171 return dataXMLIncludes; 172 } 173 174 public void setDataXMLIncludes(String dataXMLIncludes) { 175 this.dataXMLIncludes = dataXMLIncludes; 176 } 177 178 public String getDataXMLExcludes() { 179 return dataXMLExcludes; 180 } 181 182 public void setDataXMLExcludes(String dataXMLExcludes) { 183 this.dataXMLExcludes = dataXMLExcludes; 184 } 185 186 public File getDataXMLDir() { 187 return dataXMLDir; 188 } 189 190 public void setDataXMLDir(File dataXMLDir) { 191 this.dataXMLDir = dataXMLDir; 192 } 193 194 public File getSchemaXMLFile() { 195 return schemaXMLFile; 196 } 197 198 public void setSchemaXMLFile(File schemaXMLFile) { 199 this.schemaXMLFile = schemaXMLFile; 200 } 201 202 public boolean isRunOnlyOnChange() { 203 return runOnlyOnChange; 204 } 205 206 public void setRunOnlyOnChange(boolean runOnlyOnDataChange) { 207 this.runOnlyOnChange = runOnlyOnDataChange; 208 } 209 210 public File getDataDTD() { 211 return dataDTD; 212 } 213 214 public void setDataDTD(File dataDTD) { 215 this.dataDTD = dataDTD; 216 } 217 218 }