package com.google.appengine;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.BuildPluginManager;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.Xpp3DomUtils;
/**
* Runs the datanucleus enhancer.
*
* @author Matt Stephenson <mattstep@google.com>
* @goal enhance
* @phase compile
*/
public class AppengineEnhancerMojo extends AbstractMojo {
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject mavenProject;
/**
* The Maven Session Object
*
* @parameter expression="${session}"
* @required
* @readonly
*/
protected MavenSession session;
/**
* The Maven PluginManager Object
*
* @component
* @required
*/
protected BuildPluginManager pluginManager;
/**
* The api to use ( JDO or JPA ) for enhancement
*
* @parameter expression="${appengine.enhancerApi}" default-value="JDO"
*/
private String enhancerApi;
private static final String DATANUCLEUS_VERSION = "3.2.0-release";
private static final Dependency JDO_DEPENDENCY = new Dependency() {
{
setGroupId("org.datanucleus");
setArtifactId("datanucleus-api-jdo");
setVersion(DATANUCLEUS_VERSION);
}
};
private static final Dependency JPA_DEPENDENCY = new Dependency() {
{
setGroupId("org.datanucleus");
setArtifactId("datanucleus-api-jpa");
setVersion(DATANUCLEUS_VERSION);
}
};
@Override
public void execute() throws MojoExecutionException {
if(!enhancerApi.equals("JDO") && !enhancerApi.equals("JPA")) {
throw new MojoExecutionException("enhancerApi must be either JPA or JDO");
}
Plugin plugin = new Plugin();
plugin.setGroupId("org.datanucleus");
plugin.setArtifactId("datanucleus-maven-plugin");
plugin.setVersion(DATANUCLEUS_VERSION);
plugin.addDependency(enhancerApi.equals("JDO") ? JDO_DEPENDENCY : JPA_DEPENDENCY);
for (Dependency transitiveDep: mavenProject.getDependencies()){
plugin.addDependency(transitiveDep);
}
PluginDescriptor pluginDescriptor = null;
try {
pluginDescriptor = pluginManager.loadPlugin(
plugin,
mavenProject.getRemotePluginRepositories(),
session.getRepositorySession());
} catch (Exception e) {
throw new MojoExecutionException("Could not load the datanucleus plugin.", e);
}
MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo("enhance");
Xpp3Dom configuration = new Xpp3Dom("configuration");
Xpp3Dom apiElement = new Xpp3Dom("api");
apiElement.setValue(enhancerApi);
Xpp3Dom verboseElement = new Xpp3Dom("verbose");
verboseElement.setValue("true");
configuration.addChild(apiElement);
configuration.addChild(verboseElement);
configuration = Xpp3DomUtils.mergeXpp3Dom(configuration, convertPlexusConfiguration(mojoDescriptor.getMojoConfiguration()));
MojoExecution exec = new MojoExecution(mojoDescriptor, configuration);
try {
pluginManager.executeMojo(session, exec);
} catch (Exception e) {
throw new MojoExecutionException("Could not execute datanucleus enhancer.", e);
}
}
private Xpp3Dom convertPlexusConfiguration(PlexusConfiguration config) {
Xpp3Dom xpp3DomElement = new Xpp3Dom(config.getName());
xpp3DomElement.setValue(config.getValue());
for (String name : config.getAttributeNames()) {
xpp3DomElement.setAttribute(name, config.getAttribute(name));
}
for (PlexusConfiguration child : config.getChildren()) {
xpp3DomElement.addChild(convertPlexusConfiguration(child));
}
return xpp3DomElement;
}
}