View Javadoc

1   package org.apache.torque.mojo;
2   
3   import java.io.File;
4   import java.util.Iterator;
5   import java.util.Map;
6   
7   import org.apache.commons.configuration.ConfigurationException;
8   import org.apache.commons.configuration.FileConfiguration;
9   import org.apache.commons.configuration.PropertiesConfiguration;
10  import org.apache.maven.plugin.MojoExecutionException;
11  import org.apache.texen.ant.TexenTask;
12  
13  /**
14   * The base class for mojos that wrap Texen Ant Tasks
15   */
16  public abstract class TexenTaskMojo extends AntTaskMojo {
17  	/**
18  	 * The directory where the generator output is written
19  	 * 
20  	 * @required
21  	 */
22  	private String outputDir;
23  
24  	/**
25  	 * The base path where the templates are read from, if they are not read from the classpath.
26  	 * 
27  	 * @parameter expression="${templatePath}" default-value="${basedir}/src/main/impex/templates"
28  	 */
29  	private String templatePath;
30  
31  	/**
32  	 * Whether the templates should be loaded from the classpath.
33  	 * 
34  	 * @parameter expression="${useClasspath}" default-value="true"
35  	 */
36  	private boolean useClasspath;
37  
38  	/**
39  	 * A map where all user-defined context properties can be set. Overrides all other mojo configuration settings which
40  	 * are mapped to context properties.
41  	 * 
42  	 * @parameter
43  	 */
44  	private Map<?, ?> userContextProperties;
45  
46  	/**
47  	 * The path to the generated context property file.
48  	 * 
49  	 * @required
50  	 */
51  	private String contextPropertiesPath;
52  
53  	/**
54  	 * Sets the path to Torque's output directory.
55  	 * 
56  	 * @param outputDir
57  	 *            the path to Torque's output directory.
58  	 */
59  	public void setOutputDir(String outputDir) {
60  		this.outputDir = outputDir;
61  	}
62  
63  	/**
64  	 * Returns the path to Torque's output directory.
65  	 * 
66  	 * @return the path to Torque's output directory. Not null if initialized correctly.
67  	 */
68  	public String getOutputDir() {
69  		return this.outputDir;
70  	}
71  
72  	/**
73  	 * Sets the path to Torque's templates, if the classpath is not used to load the templates.
74  	 * 
75  	 * @param templatePath
76  	 *            the path to Torque's templates.
77  	 */
78  	public void setTemplatePath(String templatePath) {
79  		this.templatePath = templatePath;
80  	}
81  
82  	/**
83  	 * Returns the path to Torque's templates, if the classpath is not used to load the templates.
84  	 * 
85  	 * @return the path to Torque's templates.
86  	 */
87  	public String getTemplatePath() {
88  		return this.templatePath;
89  	}
90  
91  	/**
92  	 * Sets whether the classpath should be used to locate the templates.
93  	 * 
94  	 * @param templatePath
95  	 *            the path to Torque's templates.
96  	 */
97  	public void setUseClasspath(boolean useClasspath) {
98  		this.useClasspath = useClasspath;
99  	}
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 }