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