Skip to content

Commit 3e2bb80

Browse files
committed
Use a ProjectConfigurator extension to configure Gradle projects
Previously, the plugin listened to a Gradle project's settings being refreshed to apply its settings to the project. This only worked if the plugin had been previously activated by one of its other extensions (m2e or code formatting). In situations where the plugin had not already been activated, the refresh would be missed and the plugin's settings were not applied to the project. This commit switches from the listener-based approach to using a ProjectConfigurator extension. Buildship automatically calls the extension when a Gradle project is being configured, either because it's being imported into the workspace for the first time or because its settings are being refreshed. The use of an extension means that the plugin is automatically activated if needed when Buildship calls the extension. Closes gh-123
1 parent c51c0fa commit 3e2bb80

File tree

5 files changed

+36
-209
lines changed

5 files changed

+36
-209
lines changed

spring-javaformat-eclipse/io.spring.javaformat.eclipse/plugin.xml

+8-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<extension
1212
point="org.eclipse.m2e.core.projectConfigurators">
1313
<configurator
14-
class="io.spring.javaformat.eclipse.m2e.ProjectSettingsConfigurator"
14+
class="io.spring.javaformat.eclipse.m2e.MavenProjectSettingsConfigurator"
1515
id="io.spring.javaformat.eclipse.m2e.configurator"
1616
runsAfter="org.eclipse.m2e.jdt.javaConfigurator">
1717
</configurator>
@@ -31,4 +31,11 @@
3131
name="Spring Built-in Checks">
3232
</check-configuration>
3333
</extension>
34+
<extension
35+
point="org.eclipse.buildship.core.projectconfigurators">
36+
<configurator
37+
id="io.spring.javaformat.eclipse.gradle.ProjectSettingsConfigurator"
38+
class="io.spring.javaformat.eclipse.gradle.GradleProjectSettingsConfigurator">
39+
</configurator>
40+
</extension>
3441
</plugin>

spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/Activator.java

-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import org.eclipse.ui.plugin.AbstractUIPlugin;
2020
import org.osgi.framework.BundleContext;
2121

22-
import io.spring.javaformat.eclipse.gradle.RefreshProjectSettingsListeners;
23-
2422
/**
2523
* The activator class controls the plug-in life cycle.
2624
*
@@ -41,7 +39,6 @@ public Activator() {
4139
@Override
4240
public void start(BundleContext context) throws Exception {
4341
super.start(context);
44-
RefreshProjectSettingsListeners.attach();
4542
plugin = this;
4643
}
4744

Original file line numberDiff line numberDiff line change
@@ -18,95 +18,71 @@
1818

1919
import java.io.File;
2020
import java.io.IOException;
21-
import java.util.Arrays;
22-
import java.util.Collection;
2321
import java.util.LinkedHashSet;
2422
import java.util.Optional;
2523
import java.util.Set;
2624

2725
import org.eclipse.buildship.core.GradleBuild;
26+
import org.eclipse.buildship.core.InitializationContext;
27+
import org.eclipse.buildship.core.ProjectConfigurator;
28+
import org.eclipse.buildship.core.ProjectContext;
2829
import org.eclipse.buildship.core.internal.CorePlugin;
2930
import org.eclipse.buildship.core.internal.workspace.FetchStrategy;
3031
import org.eclipse.buildship.core.internal.workspace.InternalGradleBuild;
3132
import org.eclipse.buildship.core.internal.workspace.InternalGradleWorkspace;
3233
import org.eclipse.buildship.core.internal.workspace.ModelProviderUtil;
3334
import org.eclipse.core.resources.IProject;
34-
import org.eclipse.core.resources.ResourcesPlugin;
3535
import org.eclipse.core.runtime.CoreException;
3636
import org.eclipse.core.runtime.IProgressMonitor;
37-
import org.eclipse.core.runtime.IStatus;
38-
import org.eclipse.core.runtime.Status;
39-
import org.eclipse.core.runtime.jobs.Job;
4037
import org.gradle.tooling.CancellationTokenSource;
4138
import org.gradle.tooling.GradleConnector;
4239
import org.gradle.tooling.model.GradleTask;
4340
import org.gradle.tooling.model.eclipse.EclipseProject;
4441

45-
import io.spring.javaformat.eclipse.Executor;
46-
import io.spring.javaformat.eclipse.Messages;
4742
import io.spring.javaformat.eclipse.projectsettings.ProjectSettingsFilesLocator;
4843

4944
/**
50-
* Job to trigger refresh of project specific settings when the gradle plugin is used.
45+
* {@link ProjectConfigurator} to apply project-specific settings to Gradle projects.
5146
*
47+
* @author Andy Wilkinson
5248
* @author Phillip Webb
5349
*/
5450
@SuppressWarnings("restriction")
55-
public class RefreshProjectsSettingsJob extends Job {
51+
public class GradleProjectSettingsConfigurator implements ProjectConfigurator {
5652

5753
private static final Object TASK_NAME = "checkFormatMain";
5854

59-
private final CancellationTokenSource tokenSource;
55+
private CancellationTokenSource tokenSource;
6056

61-
private final Set<IProject> projects;
62-
63-
public RefreshProjectsSettingsJob() {
64-
this(null);
65-
}
66-
67-
public RefreshProjectsSettingsJob(Set<IProject> projects) {
68-
super("Refresh spring-javaformat project settings");
57+
@Override
58+
public void init(InitializationContext context, IProgressMonitor monitor) {
6959
this.tokenSource = GradleConnector.newCancellationTokenSource();
70-
this.projects = projects;
60+
7161
}
7262

7363
@Override
74-
protected IStatus run(IProgressMonitor monitor) {
64+
public void configure(ProjectContext context, IProgressMonitor monitor) {
7565
try {
76-
new Executor(Messages.springFormatSettingsImportError).run(() -> {
77-
configureProjects(monitor);
78-
});
66+
configureProject(context.getProject(), monitor);
7967
}
80-
catch (CoreException ex) {
81-
return ex.getStatus();
68+
catch (Exception ex) {
69+
context.error("Failed to apply project settings", ex);
8270
}
83-
return Status.OK_STATUS;
8471
}
8572

86-
private void configureProjects(IProgressMonitor monitor) throws CoreException, IOException {
73+
private void configureProject(IProject project, IProgressMonitor monitor) throws CoreException, IOException {
8774
InternalGradleWorkspace workspace = CorePlugin.internalGradleWorkspace();
88-
Collection<IProject> projects = this.projects;
89-
if (projects == null) {
90-
projects = Arrays.asList(ResourcesPlugin.getWorkspace().getRoot().getProjects());
91-
}
92-
for (IProject project : projects) {
93-
Optional<GradleBuild> build = workspace.getBuild(project);
94-
if (build.isPresent()) {
95-
configureProject(project, (InternalGradleBuild) build.get(), monitor);
75+
Optional<GradleBuild> build = workspace.getBuild(project);
76+
if (build.isPresent()) {
77+
Set<EclipseProject> projects = ModelProviderUtil.fetchAllEclipseProjects((InternalGradleBuild) build.get(),
78+
this.tokenSource, FetchStrategy.FORCE_RELOAD, monitor);
79+
if (hasSpringFormatPlugin(projects)) {
80+
ProjectSettingsFilesLocator locator = new ProjectSettingsFilesLocator(getSearchFolders(projects));
81+
locator.locateSettingsFiles().applyToProject(project, monitor);
9682
}
9783
}
9884
}
9985

100-
private void configureProject(IProject project, InternalGradleBuild build, IProgressMonitor monitor)
101-
throws CoreException, IOException {
102-
Set<EclipseProject> projects = ModelProviderUtil.fetchAllEclipseProjects(build, this.tokenSource,
103-
FetchStrategy.FORCE_RELOAD, monitor);
104-
if (hasSpringFormatPlugin(projects)) {
105-
ProjectSettingsFilesLocator locator = new ProjectSettingsFilesLocator(getSearchFolders(projects));
106-
locator.locateSettingsFiles().applyToProject(project, monitor);
107-
}
108-
}
109-
11086
private boolean hasSpringFormatPlugin(Set<EclipseProject> projects) {
11187
for (EclipseProject project : projects) {
11288
for (GradleTask task : project.getGradleProject().getTasks()) {
@@ -133,4 +109,8 @@ private Set<File> getSearchFolders(Set<EclipseProject> projects) {
133109
return searchFolders;
134110
}
135111

112+
@Override
113+
public void unconfigure(ProjectContext context, IProgressMonitor monitor) {
114+
}
115+
136116
}

spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/gradle/RefreshProjectSettingsListeners.java

-157
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@
3232
import io.spring.javaformat.eclipse.projectsettings.ProjectSettingsFilesLocator;
3333

3434
/**
35-
* Configurator to apply project specific settings.
35+
* Configurator to apply project-specific settings to Maven projects.
3636
*
3737
* @author Phillip Webb
3838
*/
39-
public class ProjectSettingsConfigurator extends AbstractProjectConfigurator {
39+
public class MavenProjectSettingsConfigurator extends AbstractProjectConfigurator {
4040

4141
@Override
4242
public void configure(ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {

0 commit comments

Comments
 (0)