diff --git a/maven.persistence/nbproject/project.xml b/maven.persistence/nbproject/project.xml
--- a/maven.persistence/nbproject/project.xml
+++ b/maven.persistence/nbproject/project.xml
@@ -110,6 +110,15 @@
+ org.netbeans.modules.maven.model
+
+
+
+ 1
+ 1.6
+
+
+
org.netbeans.modules.project.ant
@@ -146,6 +155,15 @@
+ org.netbeans.modules.xml.xam
+
+
+
+ 1
+ 1.9
+
+
+
org.openide.filesystems
diff --git a/maven.persistence/src/org/netbeans/modules/maven/persistence/CPExtender.java b/maven.persistence/src/org/netbeans/modules/maven/persistence/CPExtender.java
--- a/maven.persistence/src/org/netbeans/modules/maven/persistence/CPExtender.java
+++ b/maven.persistence/src/org/netbeans/modules/maven/persistence/CPExtender.java
@@ -42,6 +42,9 @@
import java.io.IOException;
import java.net.URI;
import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+import javax.xml.namespace.QName;
import org.netbeans.modules.maven.api.customizer.ModelHandle;
import org.netbeans.modules.maven.spi.customizer.ModelHandleUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
@@ -50,6 +53,15 @@
import org.netbeans.api.project.ant.AntArtifact;
import org.netbeans.api.project.libraries.Library;
import org.netbeans.modules.maven.api.ModelUtils;
+import org.netbeans.modules.maven.api.NbMavenProject;
+import org.netbeans.modules.maven.model.ModelOperation;
+import org.netbeans.modules.maven.model.pom.Build;
+import org.netbeans.modules.maven.model.pom.Configuration;
+import org.netbeans.modules.maven.model.pom.POMExtensibilityElement;
+import org.netbeans.modules.maven.model.pom.POMModel;
+import org.netbeans.modules.maven.model.pom.Plugin;
+import org.netbeans.modules.maven.model.pom.PluginExecution;
+import org.netbeans.modules.maven.model.pom.Repository;
import org.netbeans.spi.java.project.classpath.ProjectClassPathExtender;
import org.netbeans.spi.java.project.classpath.ProjectClassPathModifierImplementation;
import org.netbeans.spi.project.ProjectServiceProvider;
@@ -65,20 +77,29 @@
public class CPExtender extends ProjectClassPathModifierImplementation implements ProjectClassPathExtender {
private static final String SL_15 = "1.5"; //NOI18N
private Project project;
+ private static final String POM_XML = "pom.xml"; //NOI18N
+
+ public static final String GROUP_BSC = "org.bsc.maven"; // NOI18N
+ public static final String PLUGIN_PROCESSOR = "maven-processor-plugin"; // NOI18N
+ public static final String PLUGINREPO_PROCESSOR = "http://maven-annotation-plugin.googlecode.com/svn/trunk/mavenrepo";
+
/** Creates a new instance of CPExtender */
public CPExtender(Project project) {
this.project = project;
}
+ @Override
protected SourceGroup[] getExtensibleSourceGroups() {
//the default one privides them.
return new SourceGroup[0];
}
+ @Override
protected String[] getExtensibleClassPathTypes(SourceGroup arg0) {
return new String[0];
}
+ @Override
protected boolean addLibraries(Library[] libs, SourceGroup arg1, String arg2) throws IOException,
UnsupportedOperationException {
boolean added = false;
@@ -88,35 +109,41 @@
return added;
}
+ @Override
protected boolean removeLibraries(Library[] arg0, SourceGroup arg1,
String arg2) throws IOException,
UnsupportedOperationException {
return false;
}
+ @Override
protected boolean addRoots(URL[] arg0, SourceGroup arg1, String arg2) throws IOException,
UnsupportedOperationException {
return false;
}
+ @Override
protected boolean removeRoots(URL[] arg0, SourceGroup arg1, String arg2) throws IOException,
UnsupportedOperationException {
return false;
}
+ @Override
protected boolean addAntArtifacts(AntArtifact[] arg0, URI[] arg1,
SourceGroup arg2, String arg3) throws IOException,
UnsupportedOperationException {
return false;
}
+ @Override
protected boolean removeAntArtifacts(AntArtifact[] arg0, URI[] arg1,
SourceGroup arg2, String arg3) throws IOException,
UnsupportedOperationException {
return false;
}
- public boolean addLibrary(Library library) throws IOException {
+ @Override
+ public boolean addLibrary(final Library library) throws IOException {
if ("toplink".equals(library.getName())) { //NOI18N
//TODO would be nice if the toplink lib shipping with netbeans be the same binary
// then we could just copy the pieces to local repo.
@@ -137,13 +164,113 @@
Exceptions.printStackTrace(ex);
}
}
+ if ("eclipselink".equals(library.getName())) { //NOI18N
+ final Boolean[] added = new Boolean[1];
+ ModelOperation operation = new ModelOperation() {
+ @Override
+ public void performOperation(POMModel model) {
+ try {
+ added[0] = addEclipseLinkAnnotationProcessor(library, model);
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ added[0] = Boolean.FALSE;
+ }
+ }
+
+ };
+ FileObject pom = project.getProjectDirectory().getFileObject(POM_XML);//NOI18N
+ org.netbeans.modules.maven.model.Utilities.performPOMModelOperations(pom, Collections.singletonList(operation));
+ //TODO is the manual reload necessary if pom.xml file is being saved?
+ // NbMavenProject.fireMavenProjectReload(project);
+ if (added[0]) {
+ project.getLookup().lookup(NbMavenProject.class).triggerDependencyDownload();
+ }
+
+ //shall not return true, needs processing by the fallback impl as well.
+ return false;
+ }
return false;
}
-
+
+ public static boolean checkProcessorPlugin(POMModel mdl) {
+ boolean result = false;
+ List pluginRepositories = mdl.getProject().getPluginRepositories();
+ Repository myRepo = null;
+ if (pluginRepositories != null) {
+ for (Repository r : pluginRepositories) {
+ if (PLUGINREPO_PROCESSOR.equals(r.getUrl())) {
+ myRepo = r;
+ }
+ }
+ }
+ if (myRepo == null) {
+ myRepo = mdl.getFactory().createPluginRepository();
+ myRepo.setUrl(PLUGINREPO_PROCESSOR);
+ myRepo.setId("maven-annotation-plugin");
+ mdl.getProject().addPluginRepository(myRepo);
+ result = true;
+ }
+
+ Plugin old = null;
+ Plugin plugin;
+ Build bld = mdl.getProject().getBuild();
+ if (bld != null) {
+ old = bld.findPluginById(GROUP_BSC, PLUGIN_PROCESSOR);
+ } else {
+ mdl.getProject().setBuild(mdl.getFactory().createBuild());
+ }
+ if (old != null) {
+ plugin = old;
+ } else {
+ plugin = mdl.getFactory().createPlugin();
+ plugin.setGroupId(GROUP_BSC);
+ plugin.setArtifactId(PLUGIN_PROCESSOR);
+ //plugin.setVersion(MavenVersionSettings.getDefault().getVersion(MavenVersionSettings.VERSION_COMPILER));
+ mdl.getProject().getBuild().addPlugin(plugin);
+ result = true;
+ }
+ List execs = plugin.getExecutions();
+ PluginExecution myExec = null;
+ if (execs != null) {
+ for (PluginExecution exec : execs) {
+ if ("process".equals(exec.getId())) {
+ myExec = exec;
+ }
+ }
+ }
+ if (myExec == null) {
+ myExec = mdl.getFactory().createExecution();
+ myExec.setId("process");
+ myExec.addGoal("process");
+ myExec.setPhase("generate-sources");
+ Configuration myExecConf = mdl.getFactory().createConfiguration();
+ myExecConf.setSimpleParameter("outputDirectory", "${project.build.directory}/generated-sources/apt");
+ myExecConf.setSimpleParameter("compilerArguments", "-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml");
+ POMExtensibilityElement processorsElem = mdl.getFactory().createPOMExtensibilityElement(new QName("processors"));
+ POMExtensibilityElement processorElem = mdl.getFactory().createPOMExtensibilityElement(new QName("processor"));
+ processorElem.setElementText("org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor");
+ processorsElem.addExtensibilityElement(processorElem);
+ myExecConf.addExtensibilityElement(processorsElem);
+ myExec.setConfiguration(myExecConf);
+ plugin.addExecution(myExec);
+ result = true;
+ }
+
+ return result;
+ }
+
+
+ private boolean addEclipseLinkAnnotationProcessor(Library library, POMModel model) throws IOException {
+ return checkProcessorPlugin(model);
+ }
+
+
+ @Override
public boolean addArchiveFile(FileObject arg0) throws IOException {
return false;
}
+ @Override
public boolean addAntArtifact(AntArtifact arg0, URI arg1) throws IOException {
return false;
}