package org.appfuse.mojo.installer;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.appfuse.tool.SubversionUtils;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.codehaus.plexus.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* This mojo is used to copy FreeMarker templates from AMP into an AppFuse project.
*
* @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
* @goal copy-templates
*/
public class CopyTemplatesMojo extends AbstractMojo {
/**
* <i>Maven Internal</i>: Project to interact with.
*
* @parameter expression="${project}"
* @required
* @readonly
* @noinspection UnusedDeclaration
*/
private MavenProject project;
/**
* The directory containing the source code.
*
* @parameter expression="${appfuse.trunk}" default-value="https://github.com/appfuse/appfuse/"
*/
private String trunk;
/**
* The tag containing the source code - defaults to '/trunk', but you may want to set it to '/tags/TAGNAME'
*
* @parameter expression="${appfuse.tag}" default-value="trunk/"
*/
private String tag;
/**
* @parameter expression="${appfuse.templateDirectory}" default-value="src/test/resources/appfuse"
* @noinspection UnusedDeclaration
*/
private String templateDirectory;
public void execute() throws MojoExecutionException, MojoFailureException {
// TODO: Copy files from JAR instead of SVN
// If appfuse.version is specified as a property, and not a SNAPSHOT, use it for the tag
String appfuseVersion = project.getProperties().getProperty("appfuse.version");
if ((appfuseVersion != null) && !appfuseVersion.endsWith("SNAPSHOT") && tag.equals("trunk/")) {
tag = "tags/APPFUSE_" + appfuseVersion.toUpperCase().replaceAll("-", "_") + "/";
}
String daoFramework = project.getProperties().getProperty("dao.framework");
if (daoFramework == null) {
log("No dao.framework property specified, defaulting to 'hibernate'");
}
String webFramework = project.getProperties().getProperty("web.framework");
boolean modular = (project.getPackaging().equals("pom") && !project.hasParent());
log("Installing templates in " + templateDirectory + "...");
if (!new File(templateDirectory).exists()) {
FileUtils.mkdir(templateDirectory);
}
if (project.getPackaging().equals("jar") || (project.getPackaging().equals("war") && !project.hasParent())) {
// export model templates
log("Installing model templates...");
if (!new File(templateDirectory + "/model").exists()) {
FileUtils.mkdir(templateDirectory + "/model");
}
export("plugins/appfuse-maven-plugin/src/main/resources/appfuse/model/",
((modular) ? "core/" + templateDirectory : templateDirectory) + "/model");
// export dao templates
log("Installing " + daoFramework + " templates...");
if (!new File(templateDirectory + "/dao").exists()) {
FileUtils.mkdir(templateDirectory + "/dao");
}
export("plugins/appfuse-maven-plugin/src/main/resources/appfuse/dao",
((modular) ? "core/" + templateDirectory : templateDirectory) + "/dao");
// delete templates that aren't for current dao.framework
try {
File daoDir = new File(templateDirectory + "/dao");
String[] dirs = daoDir.list();
for (String dir : dirs) {
if (new File(templateDirectory + "/dao/" + dir).isDirectory()) {
if (!dir.equals(daoFramework)) {
FileUtils.deleteDirectory(templateDirectory + "/dao/" + dir);
}
}
}
} catch (IOException io) {
throw new MojoFailureException(io.getMessage());
}
// export manager templates
log("Installing service templates...");
if (!new File(templateDirectory + "/service").exists()) {
FileUtils.mkdir(templateDirectory + "/service");
}
export("plugins/appfuse-maven-plugin/src/main/resources/appfuse/service/",
((modular) ? "core/" + templateDirectory : templateDirectory) + "/service");
}
if (project.getPackaging().equalsIgnoreCase("war")) {
if (webFramework == null) {
getLog().error("The web.framework property is not specified - please modify your pom.xml to add " +
" this property. For example: <web.framework>struts</web.framework>.");
throw new MojoExecutionException("No web.framework property specified, please modify pom.xml to add it.");
}
// export web templates
log("Installing " + webFramework + " templates...");
if (!new File(templateDirectory + "/web").exists()) {
FileUtils.mkdir(templateDirectory + "/web");
}
export("plugins/appfuse-maven-plugin/src/main/resources/appfuse/web",
((modular) ? "web/" + templateDirectory : templateDirectory) + "/web");
// delete templates that aren't for current web.framework
try {
File webDir = new File(templateDirectory + "/web");
String[] dirs = webDir.list();
for (String dir : dirs) {
if (new File(templateDirectory + "/web/" + dir).isDirectory()) {
if (!dir.equals(webFramework)) {
FileUtils.deleteDirectory(templateDirectory + "/web/" + dir);
}
}
}
} catch (IOException io) {
throw new MojoFailureException(io.getMessage());
}
}
}
// Allow setting project from tests (AbstractAppFuseMojoTestCase)
void setProject(MavenProject project) {
this.project = project;
}
private void export(String url, String destinationDirectory) throws MojoExecutionException {
SubversionUtils svn = new SubversionUtils(trunk + tag + url, destinationDirectory);
try {
svn.export();
} catch (SVNException e) {
SVNErrorMessage err = e.getErrorMessage();
/*
* Display all tree of error messages.
* Utility method SVNErrorMessage.getFullMessage() may be used instead of the loop.
*/
while (err != null) {
getLog()
.error(err.getErrorCode().getCode() + " : " +
err.getMessage());
err = err.getChildErrorMessage();
}
throw new MojoExecutionException(e.getMessage());
}
}
private void log(String msg) {
getLog().info("[AppFuse] " + msg);
}
}