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 property="outputDir" expression="${outputDir}"
060         * default-value="${project.build.directory}/generated-impex"
061         */
062        @SuppressWarnings("unused")
063        private String dummy1;
064    
065        /**
066         * The location where the report file will be generated, relative to outputDir.
067         *
068         * @parameter property="reportFile" expression="${reportFile}"
069         * default-value="../reports/report.${project.artifactId}.datadtd.generation"
070         */
071        @SuppressWarnings("unused")
072        private String dummy2;
073    
074        /**
075         * The location where the context property file for velocity will be generated.
076         *
077         * @parameter property="contextPropertiesPath" expression="${contextPropertiesPath}"
078         * default-value="${project.build.directory}/reports/context.datadtd.properties"
079         */
080        @SuppressWarnings("unused")
081        private String dummy3;
082    
083        /**
084         * The name of the project
085         *
086         * @parameter expression="${projectName}" default-value="impex"
087         */
088        private String projectName;
089    
090        /**
091         * The name of the schema.xml file to process
092         *
093         * @parameter expression="${schemaXMLFile}"
094         * default-value="${project.build.directory}/generated-impex/${project.artifactId}.xml"
095         * @required
096         */
097        private String schemaXMLFile;
098    
099        /**
100         * Returns the context properties for the Texen task.
101         *
102         * @return The PropertiesConfiguration containing all context properties, not null.
103         */
104        @Override
105        protected PropertiesConfiguration getMojoContextProperties() {
106            PropertiesConfiguration configuration = new PropertiesConfiguration();
107            configuration.addProperty(PROJECT_CONTEXT_PROPERTY, getProjectName());
108            configuration.addProperty("version", getProject().getVersion());
109            return configuration;
110        }
111    
112        protected void showConfig() {
113            getLog().info("Schema XML File: " + schemaXMLFile);
114            getLog().info("Ant Compatibility Mode: " + antCompatibilityMode);
115            getLog().info("Output Directory: " + getOutputDir());
116        }
117    
118        /**
119         * Configures the Texen task wrapped by this mojo
120         */
121        @Override
122        protected void configureTask() throws MojoExecutionException {
123            TorqueDataModelTask task = new TorqueDataModelTask();
124            setAntTask(task);
125            super.configureTask();
126            boolean exists = new Utils().isFileOrResource(getSchemaXMLFile());
127            if (!exists) {
128                throw new MojoExecutionException("Unable to locate: " + getSchemaXMLFile());
129            }
130            task.setXmlFile(getSchemaXMLFile());
131    
132        }
133    
134        /**
135         * Returns the path to the control template.
136         *
137         * @return "data/Control.vm"
138         */
139        @Override
140        protected String getControlTemplate() {
141            return "data/Control.vm";
142        }
143    
144        /**
145         * Returns the name of the project
146         *
147         * @return the name of the project.
148         */
149        public String getProjectName() {
150            return projectName;
151        }
152    
153        /**
154         * Sets the name of the project
155         *
156         * @param project
157         * the name of the project.
158         */
159        public void setProjectName(final String projectName) {
160            this.projectName = projectName;
161        }
162    
163        /**
164         * Returns the name of the xml file to process.
165         *
166         * @return the name of the xml file to process.
167         */
168        public String getSchemaXMLFile() {
169            return schemaXMLFile;
170        }
171    
172        /**
173         * Sets the name of the xml file to process.
174         *
175         * @param project
176         * the name of the xml file to process.
177         */
178        public void setSchemaXMLFile(final String xmlFile) {
179            this.schemaXMLFile = xmlFile;
180        }
181    
182        @Override
183        public void executeMojo() throws MojoExecutionException {
184            getLog().info("------------------------------------------------------------------------");
185            getLog().info("Generating database DTD");
186            getLog().info("------------------------------------------------------------------------");
187            showConfig();
188            super.executeMojo();
189            if (antCompatibilityMode) {
190                File srcFile = new File(getOutputDir() + FS + getArtifactId() + ".dtd");
191                File dstFile = new File(copyToFile);
192                getLog().info("Creating " + dstFile.getAbsolutePath() + " for Ant compatibility mode");
193                try {
194                    FileUtils.copyFile(srcFile, dstFile);
195                } catch (IOException e) {
196                    throw new MojoExecutionException("Error copying file", e);
197                }
198            }
199        }
200    
201        public boolean isAntCompatibilityMode() {
202            return antCompatibilityMode;
203        }
204    
205        public void setAntCompatibilityMode(final boolean antCompatibilityMode) {
206            this.antCompatibilityMode = antCompatibilityMode;
207        }
208    
209        public String getCopyToFile() {
210            return copyToFile;
211        }
212    
213        public void setCopyToFile(final String copyToFile) {
214            this.copyToFile = copyToFile;
215        }
216    
217        public String getArtifactId() {
218            return artifactId;
219        }
220    
221        public void setArtifactId(final String artifactId) {
222            this.artifactId = artifactId;
223        }
224    }