001 package org.apache.torque.mojo; 002 003 import java.io.File; 004 import java.util.Iterator; 005 import java.util.Map; 006 007 import org.apache.commons.configuration.ConfigurationException; 008 import org.apache.commons.configuration.FileConfiguration; 009 import org.apache.commons.configuration.PropertiesConfiguration; 010 import org.apache.maven.plugin.MojoExecutionException; 011 import org.apache.texen.ant.TexenTask; 012 013 /** 014 * The base class for mojos that wrap Texen Ant Tasks 015 */ 016 public abstract class TexenTaskMojo extends AntTaskMojo { 017 /** 018 * The directory where the generator output is written 019 * 020 * @required 021 */ 022 private String outputDir; 023 024 /** 025 * The base path where the templates are read from, if they are not read from the classpath. 026 * 027 * @parameter expression="${templatePath}" default-value="${basedir}/src/main/impex/templates" 028 */ 029 private String templatePath; 030 031 /** 032 * Whether the templates should be loaded from the classpath. 033 * 034 * @parameter expression="${useClasspath}" default-value="true" 035 */ 036 private boolean useClasspath; 037 038 /** 039 * A map where all user-defined context properties can be set. Overrides all other mojo configuration settings which 040 * are mapped to context properties. 041 * 042 * @parameter 043 */ 044 private Map<?, ?> userContextProperties; 045 046 /** 047 * The path to the generated context property file. 048 * 049 * @required 050 */ 051 private String contextPropertiesPath; 052 053 /** 054 * Sets the path to Torque's output directory. 055 * 056 * @param outputDir 057 * the path to Torque's output directory. 058 */ 059 public void setOutputDir(String outputDir) { 060 this.outputDir = outputDir; 061 } 062 063 /** 064 * Returns the path to Torque's output directory. 065 * 066 * @return the path to Torque's output directory. Not null if initialized correctly. 067 */ 068 public String getOutputDir() { 069 return this.outputDir; 070 } 071 072 /** 073 * Sets the path to Torque's templates, if the classpath is not used to load the templates. 074 * 075 * @param templatePath 076 * the path to Torque's templates. 077 */ 078 public void setTemplatePath(String templatePath) { 079 this.templatePath = templatePath; 080 } 081 082 /** 083 * Returns the path to Torque's templates, if the classpath is not used to load the templates. 084 * 085 * @return the path to Torque's templates. 086 */ 087 public String getTemplatePath() { 088 return this.templatePath; 089 } 090 091 /** 092 * Sets whether the classpath should be used to locate the templates. 093 * 094 * @param templatePath 095 * the path to Torque's templates. 096 */ 097 public void setUseClasspath(boolean useClasspath) { 098 this.useClasspath = useClasspath; 099 } 100 101 /** 102 * Returns whether the classpath is used to locate the templates. 103 * 104 * @return true if the classpath is used to locate the templates, false otherwise 105 */ 106 public boolean getUseClasspath() { 107 return this.useClasspath; 108 } 109 110 /** 111 * Sets the path to the generated property file used as Texen's context properties. 112 * 113 * @param generatedPropertyFilePath 114 * the path to the generated context properties file. 115 */ 116 public void setContextPropertiesPath(String contextPropertiesPath) { 117 this.contextPropertiesPath = contextPropertiesPath; 118 } 119 120 /** 121 * Returns the path to the generated property file used as Texen's context properties. 122 * 123 * @return the path to the generated context properties file. 124 */ 125 public String getContextPropertiesPath() { 126 return this.contextPropertiesPath; 127 } 128 129 /** 130 * Sets the map which defines user-defined context properties. The settings override all other mojo configuration 131 * settings which are mapped to context properties. 132 * 133 * @param contextProperties 134 * the user-defined context properties. 135 */ 136 public void setUserContextProperties(Map<?, ?> userContextProperties) { 137 this.userContextProperties = userContextProperties; 138 } 139 140 /** 141 * Returns the map which defines user-defined context properties. 142 * 143 * @return the map containing user-defined context properties, or null if not set. 144 */ 145 public Map<?, ?> getUserContextProperties() { 146 return userContextProperties; 147 } 148 149 /** 150 * returns the generator Task for this mojo. 151 * 152 * @return the generator Task, not null. 153 */ 154 protected TexenTask getGeneratorTask() { 155 return (TexenTask) getAntTask(); 156 } 157 158 /** 159 * Generates the context properties file for Texen. The file is written to the path contextPropertiesPath. 160 * 161 * @throws MojoExecutionException 162 * if an error occurs. 163 */ 164 protected void generateContextProperties() throws MojoExecutionException { 165 try { 166 FileConfiguration configuration = getMojoContextProperties(); 167 if (userContextProperties != null) { 168 for (Iterator<?> contextPropertyIt = userContextProperties.entrySet().iterator(); contextPropertyIt.hasNext();) { 169 Map.Entry<?, ?> entry = (Map.Entry<?, ?>) contextPropertyIt.next(); 170 configuration.addProperty(entry.getKey().toString(), entry.getValue().toString()); 171 } 172 } 173 configuration.save(contextPropertiesPath); 174 } catch (ConfigurationException e) { 175 getLog().error("Error writing temporary context properties: " + e.getMessage()); 176 throw new MojoExecutionException(e.getMessage()); 177 } 178 } 179 180 /** 181 * Configures the Texen task wrapped by this mojo. 182 */ 183 protected void configureTask() throws MojoExecutionException { 184 super.configureTask(); 185 TexenTask task = getGeneratorTask(); 186 task.setContextProperties(contextPropertiesPath); 187 task.setUseClasspath(useClasspath); 188 try { 189 task.setTemplatePath(templatePath); 190 } catch (Exception e) { 191 throw new MojoExecutionException("Error setting template path", e); 192 } 193 194 File outputDirectory = new File(outputDir); 195 outputDirectory.mkdirs(); 196 getGeneratorTask().setOutputDirectory(outputDirectory); 197 } 198 199 /** 200 * Executes the wrapped Texen task. Before this is done, the context properties file is generated and the Texen task 201 * is configured. 202 * 203 * @throws MojoExecutionException 204 * if an error occurs during execution. 205 * 206 * @see org.apache.maven.plugin.Mojo#execute() 207 */ 208 public void executeMojo() throws MojoExecutionException { 209 generateContextProperties(); 210 super.executeMojo(); 211 } 212 213 /** 214 * Returns the context properties for the Texen task which are defined in the configuration of the child mojo. This 215 * method needs to be overwritten in subclasses. 216 * 217 * @return The PropertiesConfiguration containing all context properties, not null. 218 */ 219 protected abstract PropertiesConfiguration getMojoContextProperties(); 220 }