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.io.IOException;
020    
021    import org.apache.commons.configuration.PropertiesConfiguration;
022    import org.apache.commons.io.FileUtils;
023    import org.apache.maven.plugin.MojoExecutionException;
024    import org.apache.torque.task.TorqueDataModelTask;
025    import org.kuali.core.db.torque.Utils;
026    
027    /**
028     * Generates a DTD for the database tables from a schema XML file
029     * 
030     * @goal datadtd
031     * @phase generate-sources
032     */
033    public class DataDtdMojo extends DataModelTaskMojo {
034            /** The context property for the name of the project. */
035            public static final String PROJECT_CONTEXT_PROPERTY = "project";
036    
037            /**
038             * @parameter expression="${antCompatibilityMode}" antCompatibilityMode="false"
039             */
040            boolean antCompatibilityMode;
041    
042            /**
043             * Only used if antCompatibilityMode is set to true. If so, the dtd that gets generated will be copied to
044             * 
045             * @parameter expression="${copyToFile}" default-value="${basedir}/src/main/impex/data.dtd"
046             */
047            String copyToFile;
048    
049            /**
050             * Included here as a simple property to facilitate generating DTD's for other artifacts
051             * 
052             * @parameter expression="${artifactId}" default-value="${project.artifactId}"
053             */
054            String artifactId;
055    
056            /**
057             * The directory in which the DTD will be generated
058             * 
059             * @parameter expression="${outputDir}" default-value="${project.build.directory}/generated-impex"
060             */
061            @SuppressWarnings("unused")
062            private String dummy1;
063    
064            /**
065             * The location where the report file will be generated, relative to outputDir.
066             * 
067             * @parameter expression="${reportFile}" default-value="../reports/report.${project.artifactId}.datadtd.generation"
068             */
069            @SuppressWarnings("unused")
070            private String dummy2;
071    
072            /**
073             * The location where the context property file for velocity will be generated.
074             * 
075             * @parameter expression="${contextPropertiesPath}" default-value="${project.build.directory}/reports/context.datadtd.properties"
076             */
077            @SuppressWarnings("unused")
078            private String dummy3;
079    
080            /**
081             * The name of the project
082             * 
083             * @parameter expression="${projectName}" default-value="impex"
084             */
085            private String projectName;
086    
087            /**
088             * The name of the schema.xml file to process
089             * 
090             * @parameter expression="${schemaXMLFile}" default-value="${project.build.directory}/generated-impex/${project.artifactId}.xml"
091             * @required
092             */
093            private String schemaXMLFile;
094    
095            /**
096             * Returns the context properties for the Texen task.
097             * 
098             * @return The PropertiesConfiguration containing all context properties, not null.
099             */
100            @Override
101            protected PropertiesConfiguration getMojoContextProperties() {
102                    PropertiesConfiguration configuration = new PropertiesConfiguration();
103                    configuration.addProperty(PROJECT_CONTEXT_PROPERTY, getProjectName());
104                    configuration.addProperty("version", getProject().getVersion());
105                    return configuration;
106            }
107    
108            protected void showConfig() {
109                    getLog().info("Schema XML File: " + schemaXMLFile);
110                    getLog().info("Ant Compatibility Mode: " + antCompatibilityMode);
111                    getLog().info("Output Directory: " + getOutputDir());
112            }
113    
114            /**
115             * Configures the Texen task wrapped by this mojo
116             */
117            @Override
118            protected void configureTask() throws MojoExecutionException {
119                    TorqueDataModelTask task = new TorqueDataModelTask();
120                    setAntTask(task);
121                    super.configureTask();
122                    boolean exists = new Utils().isFileOrResource(getSchemaXMLFile());
123                    if (!exists) {
124                            throw new MojoExecutionException("Unable to locate: " + getSchemaXMLFile());
125                    }
126                    task.setXmlFile(getSchemaXMLFile());
127    
128            }
129    
130            /**
131             * Returns the path to the control template.
132             * 
133             * @return "data/Control.vm"
134             */
135            @Override
136            protected String getControlTemplate() {
137                    return "data/Control.vm";
138            }
139    
140            /**
141             * Returns the name of the project
142             * 
143             * @return the name of the project.
144             */
145            public String getProjectName() {
146                    return projectName;
147            }
148    
149            /**
150             * Sets the name of the project
151             * 
152             * @param project
153             *            the name of the project.
154             */
155            public void setProjectName(final String projectName) {
156                    this.projectName = projectName;
157            }
158    
159            /**
160             * Returns the name of the xml file to process.
161             * 
162             * @return the name of the xml file to process.
163             */
164            public String getSchemaXMLFile() {
165                    return schemaXMLFile;
166            }
167    
168            /**
169             * Sets the name of the xml file to process.
170             * 
171             * @param project
172             *            the name of the xml file to process.
173             */
174            public void setSchemaXMLFile(final String xmlFile) {
175                    this.schemaXMLFile = xmlFile;
176            }
177    
178            @Override
179            public void executeMojo() throws MojoExecutionException {
180                    getLog().info("------------------------------------------------------------------------");
181                    getLog().info("Generating database DTD");
182                    getLog().info("------------------------------------------------------------------------");
183                    showConfig();
184                    super.executeMojo();
185                    if (antCompatibilityMode) {
186                            File srcFile = new File(getOutputDir() + FS + getArtifactId() + ".dtd");
187                            File dstFile = new File(copyToFile);
188                            getLog().info("Creating " + dstFile.getAbsolutePath() + " for Ant compatibility mode");
189                            try {
190                                    FileUtils.copyFile(srcFile, dstFile);
191                            } catch (IOException e) {
192                                    throw new MojoExecutionException("Error copying file", e);
193                            }
194                    }
195            }
196    
197            public boolean isAntCompatibilityMode() {
198                    return antCompatibilityMode;
199            }
200    
201            public void setAntCompatibilityMode(final boolean antCompatibilityMode) {
202                    this.antCompatibilityMode = antCompatibilityMode;
203            }
204    
205            public String getCopyToFile() {
206                    return copyToFile;
207            }
208    
209            public void setCopyToFile(final String copyToFile) {
210                    this.copyToFile = copyToFile;
211            }
212    
213            public String getArtifactId() {
214                    return artifactId;
215            }
216    
217            public void setArtifactId(final String artifactId) {
218                    this.artifactId = artifactId;
219            }
220    }