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