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