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