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-m1";

  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("maven-datanucleus-plugin");
    plugin.setVersion(DATANUCLEUS_VERSION);
    plugin.addDependency(enhancerApi.equals("JDO") ? JDO_DEPENDENCY : JPA_DEPENDENCY);

    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;
  }
}

@@ -1498,10 +1498,15 @@
 2.0-
-m1
+release
 %22;%0A%0A
@@ -2251,14 +2251,8 @@
 Id(%22
-maven-
 data
@@ -2259,16 +2259,22 @@
 nucleus-
+maven-
 plugin%22)
@@ -2406,16 +2406,142 @@
 DENCY);%0A
+    for (Dependency transitiveDep: mavenProject.getDependencies())%7B%0A      plugin.addDependency(transitiveDep);%0A    %7D%0A         
 %0A    Plu

Fix enhance jar dependencies and use the official enhancer 3.2.0 release