Skip to content

Commit

Permalink
Cascade project configuration changes to child projects
Browse files Browse the repository at this point in the history
Signed-off-by: Snjezana Peco <[email protected]>
  • Loading branch information
snjeza committed Sep 27, 2018
1 parent 8f3d63f commit 98b4699
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,26 @@
package org.eclipse.jdt.ls.core.internal.managers;

import java.nio.file.Path;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
import org.eclipse.jdt.ls.core.internal.ProjectUtils;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.internal.MavenPluginActivator;
import org.eclipse.m2e.core.internal.project.ProjectConfigurationManager;
import org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.IMavenProjectRegistry;
import org.eclipse.m2e.core.project.IProjectConfigurationManager;
import org.eclipse.m2e.core.project.MavenUpdateRequest;

Expand All @@ -28,11 +40,17 @@
*/
public class MavenBuildSupport implements IBuildSupport {
private IProjectConfigurationManager configurationManager;
private ProjectRegistryManager projectManager;
private DigestStore digestStore;
private IMavenProjectRegistry registry;
private boolean shouldCollectProjects;

public MavenBuildSupport() {
this.configurationManager = MavenPlugin.getProjectConfigurationManager();
this.projectManager = MavenPluginActivator.getDefault().getMavenProjectManagerImpl();
this.digestStore = JavaLanguageServerPlugin.getDigestStore();
this.registry = MavenPlugin.getMavenProjectRegistry();
this.shouldCollectProjects = true;
}

@Override
Expand All @@ -48,9 +66,35 @@ public void update(IProject project, boolean force, IProgressMonitor monitor) th
Path pomPath = project.getFile("pom.xml").getLocation().toFile().toPath();
if (digestStore.updateDigest(pomPath) || force) {
JavaLanguageServerPlugin.logInfo("Starting Maven update for " + project.getName());
//TODO collect dependent projects and update them as well? i.e in case a parent project was modified
MavenUpdateRequest request = new MavenUpdateRequest(project, MavenPlugin.getMavenConfiguration().isOffline(), true);
configurationManager.updateProjectConfiguration(request, monitor);
if (shouldCollectProjects()) {
Set<IProject> projectSet = new LinkedHashSet<>();
collectProjects(projectSet, project, monitor);
IProject[] projects = projectSet.toArray(new IProject[0]);
MavenUpdateRequest request = new MavenUpdateRequest(projects, MavenPlugin.getMavenConfiguration().isOffline(), true);
((ProjectConfigurationManager) configurationManager).updateProjectConfiguration(request, true, true, monitor);
} else {
MavenUpdateRequest request = new MavenUpdateRequest(project, MavenPlugin.getMavenConfiguration().isOffline(), true);
configurationManager.updateProjectConfiguration(request, monitor);
}
}
}

public void collectProjects(Collection<IProject> projects, IProject project, IProgressMonitor monitor) {
if (!ProjectUtils.isMavenProject(project)) {
return;
}
projects.add(project);
IMavenProjectFacade projectFacade = registry.create(project, monitor);
if ("pom".equals(projectFacade.getPackaging())) {
List<String> modules = projectFacade.getMavenProjectModules();
for (String module : modules) {
IPath pomPath = ResourcesPlugin.getWorkspace().getRoot().getFullPath().append(module).append("pom.xml");
IFile pom = ResourcesPlugin.getWorkspace().getRoot().getFile(pomPath);
IProject p = pom.getProject();
if (p.isOpen()) {
collectProjects(projects, p, monitor);
}
}
}
}

Expand All @@ -60,4 +104,12 @@ public boolean isBuildFile(IResource resource) {
//Check pom.xml is at the root of the project
&& resource.getProject().equals(resource.getParent());
}

public boolean shouldCollectProjects() {
return shouldCollectProjects;
}

public void setShouldCollectProjects(boolean shouldCollectProjects) {
this.shouldCollectProjects = shouldCollectProjects;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ private void updateProjects(Collection<IProject> projects, long lastWorkspaceSta
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
MavenBuildSupport mavenBuildSupport = new MavenBuildSupport();
mavenBuildSupport.setShouldCollectProjects(false);
for (IProject project : projects) {
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo.bar</groupId>
<artifactId>module1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo.bar</groupId>
<artifactId>module2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

</project>
12 changes: 12 additions & 0 deletions org.eclipse.jdt.ls.tests/projects/maven/multimodule/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo.bar</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
<module>module1</module>
<module>module2</module>
</modules>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,13 @@
import static org.junit.Assert.assertFalse;

import java.net.URI;
import java.util.LinkedHashSet;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
Expand Down Expand Up @@ -82,6 +85,14 @@ public void testCompileWithEclipseTychoJdt() throws Exception {
testNonStandardCompilerId("compile-with-tycho-jdt");
}

@Test
public void testMultipleProjects() throws Exception {
IProject project = importMavenProject("multimodule");
Set<IProject> projects = new LinkedHashSet<>();
new MavenBuildSupport().collectProjects(projects, project, new NullProgressMonitor());
assertEquals(projects.size(), 3);
}

@Test
public void testIgnoreInnerPomChanges() throws Exception {
IProject project = importMavenProject("archetyped");
Expand Down

0 comments on commit 98b4699

Please sign in to comment.