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 }