Skip to content

Commit e45eba7

Browse files
committed
Add a java like project configurator to PDE mapped projects
Fix #1457
1 parent 4fc0b42 commit e45eba7

File tree

5 files changed

+133
-4
lines changed

5 files changed

+133
-4
lines changed

org.eclipse.m2e.feature/feature.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<feature
33
id="org.eclipse.m2e.feature"
44
label="%featureName"
5-
version="2.4.0.qualifier"
5+
version="2.4.100.qualifier"
66
provider-name="%providerName"
77
plugin="org.eclipse.m2e.core"
88
license-feature="org.eclipse.license"

org.eclipse.m2e.jdt/src/org/eclipse/m2e/jdt/internal/AbstractJavaProjectConfigurator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ public void configure(ProjectConfigurationRequest request, IProgressMonitor moni
180180
MavenJdtPlugin.getDefault().getBuildpathManager().updateClasspath(project, monitor);
181181
}
182182

183-
protected IContainer getOutputLocation(ProjectConfigurationRequest request, IProject project) {
183+
@SuppressWarnings("unused")
184+
protected IContainer getOutputLocation(ProjectConfigurationRequest request, IProject project) throws CoreException {
184185
MavenProject mavenProject = request.mavenProject();
185186
return getFolder(project, mavenProject.getBuild().getOutputDirectory());
186187
}
@@ -424,7 +425,7 @@ private IPath[] toPaths(String[] values) {
424425
return paths;
425426
}
426427

427-
private void addSourceDirs(IClasspathDescriptor classpath, IProject project, List<String> sourceRoots,
428+
protected void addSourceDirs(IClasspathDescriptor classpath, IProject project, List<String> sourceRoots,
428429
IPath outputPath, IPath[] inclusion, IPath[] exclusion, String sourceEncoding, IProgressMonitor monitor,
429430
boolean addTestFlag) throws CoreException {
430431

org.eclipse.m2e.pde.connector.tests/src/org/eclipse/m2e/pde/connector/tests/TychoConnectorTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static org.junit.Assert.assertEquals;
1717
import static org.junit.Assert.assertNotNull;
1818
import static org.junit.Assert.assertTrue;
19+
import static org.junit.Assert.fail;
1920

2021
import java.io.File;
2122
import java.io.IOException;
@@ -35,6 +36,8 @@
3536
import org.eclipse.core.resources.ResourcesPlugin;
3637
import org.eclipse.core.runtime.CoreException;
3738
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
39+
import org.eclipse.jdt.core.IClasspathEntry;
40+
import org.eclipse.jdt.core.IJavaProject;
3841
import org.eclipse.jdt.core.JavaCore;
3942
import org.eclipse.m2e.core.internal.IMavenConstants;
4043
import org.eclipse.m2e.core.project.ResolverConfiguration;
@@ -69,6 +72,7 @@ public void importTychoPlugin() throws IOException, CoreException {
6972
IProject project = importTychoProject("pde.tycho.plugin/pom.xml");
7073
assertErrorFreeProjectWithBuildersAndNatures(project, PLUGIN_NATURES, PLUGIN_BUILDERS);
7174
assertPluginProjectExists(project, "pde.tycho.plugin");
75+
assertClasspathContainer(project);
7276
}
7377

7478
@Test
@@ -79,6 +83,7 @@ public void importPomlessTychoPlugin() throws IOException, CoreException {
7983
IProject project = importTychoProject("pde.tycho.pomless.plugin/.polyglot.META-INF");
8084
assertErrorFreeProjectWithBuildersAndNatures(project, PLUGIN_NATURES, PLUGIN_BUILDERS);
8185
assertPluginProjectExists(project, "pde.tycho.pomless.plugin");
86+
assertClasspathContainer(project);
8287
}
8388

8489
@Test
@@ -149,4 +154,16 @@ static void assertPluginProjectExists(IProject project, String expectedBSN) {
149154
assertNotNull("No Plug-in exists with id: " + expectedBSN, model);
150155
assertEquals(expectedBSN, model.getPluginBase().getId());
151156
}
157+
158+
void assertClasspathContainer(IProject project) throws CoreException {
159+
IJavaProject javaProject = JavaCore.create(project);
160+
IClasspathEntry[] entries = javaProject.getRawClasspath();
161+
for (IClasspathEntry entry : entries) {
162+
if ("org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER".equals(entry.getPath().toString())) {
163+
return;
164+
}
165+
}
166+
fail("M2EClasspath Container not found! ("
167+
+ Arrays.stream(entries).map(String::valueOf).collect(Collectors.joining(", ")));
168+
}
152169
}

org.eclipse.m2e.pde.connector/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
22
Bundle-ManifestVersion: 2
33
Bundle-Name: M2E PDE Connector
44
Bundle-SymbolicName: org.eclipse.m2e.pde.connector;singleton:=true
5-
Bundle-Version: 2.1.300.qualifier
5+
Bundle-Version: 2.1.400.qualifier
66
Automatic-Module-Name: org.eclipse.m2e.pde.connector
77
Bundle-RequiredExecutionEnvironment: JavaSE-17
88
Bundle-Vendor: Eclipse.org - m2e

org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/TychoLifecycleMapping.java

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,38 @@
1212
*******************************************************************************/
1313
package org.eclipse.m2e.pde.connector;
1414

15+
import java.util.ArrayList;
16+
import java.util.Arrays;
17+
import java.util.List;
18+
import java.util.Map;
19+
1520
import org.apache.maven.project.MavenProject;
21+
import org.eclipse.core.resources.IContainer;
22+
import org.eclipse.core.resources.IFile;
23+
import org.eclipse.core.resources.IFolder;
1624
import org.eclipse.core.resources.IProject;
1725
import org.eclipse.core.runtime.CoreException;
26+
import org.eclipse.core.runtime.IPath;
1827
import org.eclipse.core.runtime.IProgressMonitor;
28+
import org.eclipse.core.runtime.SubMonitor;
29+
import org.eclipse.m2e.core.internal.M2EUtils;
1930
import org.eclipse.m2e.core.project.IMavenProjectFacade;
2031
import org.eclipse.m2e.core.project.configurator.AbstractCustomizableLifecycleMapping;
32+
import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
2133
import org.eclipse.m2e.core.project.configurator.ILifecycleMapping;
2234
import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;
35+
import org.eclipse.m2e.jdt.IClasspathDescriptor;
36+
import org.eclipse.m2e.jdt.internal.AbstractJavaProjectConfigurator;
37+
import org.eclipse.pde.core.build.IBuild;
38+
import org.eclipse.pde.core.build.IBuildEntry;
39+
import org.eclipse.pde.core.build.IBuildModel;
40+
import org.eclipse.pde.core.plugin.IPluginModelBase;
41+
import org.eclipse.pde.core.plugin.PluginRegistry;
42+
import org.eclipse.pde.internal.core.ClasspathComputer;
43+
import org.eclipse.pde.internal.core.build.WorkspaceBuildModel;
44+
import org.eclipse.pde.internal.core.project.PDEProject;
2345

46+
@SuppressWarnings("restriction")
2447
public class TychoLifecycleMapping extends AbstractCustomizableLifecycleMapping implements ILifecycleMapping {
2548

2649
@Override
@@ -36,4 +59,92 @@ public void configure(ProjectConfigurationRequest request, IProgressMonitor moni
3659
}
3760
super.configure(request, monitor);
3861
}
62+
63+
@Override
64+
public List<AbstractProjectConfigurator> getProjectConfigurators(IMavenProjectFacade projectFacade,
65+
IProgressMonitor monitor) {
66+
String packaging = projectFacade.getPackaging();
67+
if ("eclipse-plugin".equals(packaging) || "eclipse-test-plugin".equals(packaging)) {
68+
List<AbstractProjectConfigurator> list = new ArrayList<>(
69+
super.getProjectConfigurators(projectFacade, monitor));
70+
list.add(new EclipsePluginProjectConfigurator());
71+
return list;
72+
} else {
73+
return super.getProjectConfigurators(projectFacade, monitor);
74+
}
75+
}
76+
77+
private static final class EclipsePluginProjectConfigurator extends AbstractJavaProjectConfigurator {
78+
79+
private static final String JAVA_SE = "JavaSE-";
80+
81+
@Override
82+
protected void addProjectSourceFolders(IClasspathDescriptor classpath, Map<String, String> options,
83+
ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {
84+
SubMonitor subMonitor = SubMonitor.convert(monitor, 100);
85+
MavenProject mavenProject = request.mavenProject();
86+
IProject project = request.mavenProjectFacade().getProject();
87+
IBuild build = getBuild(project);
88+
if (build == null) {
89+
super.addProjectSourceFolders(classpath, options, request, monitor);
90+
} else {
91+
IBuildEntry sourceEntry = build.getEntry(IBuildEntry.JAR_PREFIX + ".");
92+
if (sourceEntry == null) {
93+
return;
94+
}
95+
String outputDirectory;
96+
IBuildEntry outputEntry = build.getEntry(IBuildEntry.OUTPUT_PREFIX + ".");
97+
if (outputEntry != null && outputEntry.getTokens().length > 0) {
98+
outputDirectory = outputEntry.getTokens()[0];
99+
} else {
100+
outputDirectory = mavenProject.getBuild().getOutputDirectory();
101+
}
102+
IFolder outputFolder = getFolder(project, outputDirectory);
103+
M2EUtils.createFolder(outputFolder, true, subMonitor.split(10));
104+
IPath[] inclusion = new IPath[0];
105+
IPath[] exclusion = new IPath[0];
106+
String mainSourceEncoding = null;
107+
addSourceDirs(classpath, project, Arrays.asList(sourceEntry.getTokens()), outputFolder.getFullPath(), inclusion,
108+
exclusion, mainSourceEncoding, subMonitor.split(10), false);
109+
}
110+
}
111+
112+
@Override
113+
protected IContainer getOutputLocation(ProjectConfigurationRequest request, IProject project)
114+
throws CoreException {
115+
IBuild build = getBuild(project);
116+
if (build == null) {
117+
return super.getOutputLocation(request, project);
118+
}
119+
IBuildEntry outputEntry = build.getEntry(IBuildEntry.OUTPUT_PREFIX + ".");
120+
if (outputEntry != null && outputEntry.getTokens().length > 0) {
121+
return getFolder(project, outputEntry.getTokens()[0]);
122+
} else {
123+
return super.getOutputLocation(request, project);
124+
}
125+
}
126+
127+
@Override
128+
protected void addJavaProjectOptions(Map<String, String> options, ProjectConfigurationRequest request,
129+
IProgressMonitor monitor) throws CoreException {
130+
IProject project = request.mavenProjectFacade().getProject();
131+
IPluginModelBase model = PluginRegistry.findModel(project);
132+
if (model != null) {
133+
ClasspathComputer.setClasspath(project, model);
134+
} else {
135+
super.addJavaProjectOptions(options, request, monitor);
136+
}
137+
}
138+
139+
}
140+
141+
private static IBuild getBuild(IProject project) throws CoreException {
142+
IFile buildFile = PDEProject.getBuildProperties(project);
143+
IBuildModel buildModel = null;
144+
if (buildFile.exists()) {
145+
buildModel = new WorkspaceBuildModel(buildFile);
146+
buildModel.load();
147+
}
148+
return (buildModel != null) ? buildModel.getBuild() : null;
149+
}
39150
}

0 commit comments

Comments
 (0)