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