Skip to content

Commit c3fa2ed

Browse files
committed
Make automatic configuration updates configurable per project
And degrade problems about out-dated project configuration to severity 'info', if automatic updates are disabled for a project. Fixes #1661
1 parent 086955c commit c3fa2ed

File tree

8 files changed

+92
-33
lines changed

8 files changed

+92
-33
lines changed

RELEASE_NOTES.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88

99
Updated the embedded Maven from version 3.9.5 to 3.9.6; [Maven 3.9.6 Release Notes](https://maven.apache.org/docs/3.9.6/release-notes.html).
1010

11+
### New project preference for automated Maven project configuration updates
12+
13+
Automatic configuration updates for Maven projects can now be disabled the in the project preferences.
14+
This allows to disable these updates individually per project and to store the setting in a preference-file under version control,
15+
which is useful for projects that require special workspace configuration that doesn't exactly match the configuration in the `pom.xml`.
16+
17+
![grafik](https://github.com/eclipse-m2e/m2e-core/assets/44067969/7d27ceda-5d13-4f0e-97f0-ff34c94d7493)
1118

1219
## 2.5.0
1320

org.eclipse.m2e.core.ui/META-INF/MANIFEST.MF

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Manifest-Version: 1.0
22
Bundle-ManifestVersion: 2
33
Bundle-SymbolicName: org.eclipse.m2e.core.ui;singleton:=true
4-
Bundle-Version: 2.0.8.qualifier
4+
Bundle-Version: 2.0.800.qualifier
55
Bundle-RequiredExecutionEnvironment: JavaSE-17
66
Bundle-Name: %Bundle-Name
77
Bundle-Vendor: %Bundle-Vendor
@@ -56,3 +56,9 @@ Service-Component: OSGI-INF/component.xml,
5656
OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypeGenerator.xml,
5757
OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin.xml
5858
Automatic-Module-Name: org.eclipse.m2e.core.ui
59+
Service-Component: OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypeGenerator.xml,
60+
OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin.xml
61+
Bundle-ActivationPolicy: lazy
62+
Service-Component: OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypeGenerator.xml,
63+
OSGI-INF/org.eclipse.m2e.core.ui.internal.archetype.ArchetypePlugin.xml
64+
Bundle-ActivationPolicy: lazy

org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/preferences/MavenProjectPreferencePage.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@
3636

3737
import org.eclipse.m2e.core.MavenPlugin;
3838
import org.eclipse.m2e.core.internal.IMavenConstants;
39-
import org.eclipse.m2e.core.project.IProjectConfiguration;
39+
import org.eclipse.m2e.core.internal.preferences.MavenPreferenceInitializer;
40+
import org.eclipse.m2e.core.internal.project.ResolverConfigurationIO;
4041
import org.eclipse.m2e.core.project.IProjectConfigurationManager;
4142
import org.eclipse.m2e.core.project.ResolverConfiguration;
4243
import org.eclipse.m2e.core.ui.internal.Messages;
44+
import org.eclipse.m2e.core.ui.internal.project.MavenUpdateConfigurationChangeListener;
4345

4446

4547
/**
@@ -52,6 +54,8 @@ public class MavenProjectPreferencePage extends PropertyPage {
5254

5355
private Button resolveWorspaceProjectsButton;
5456

57+
private Button autoUpdateConfigurationButton;
58+
5559
// private Button includeModulesButton;
5660

5761
private Text selectedProfilesText;
@@ -74,10 +78,18 @@ protected Control createContents(Composite parent) {
7478
selectedProfilesText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
7579

7680
resolveWorspaceProjectsButton = new Button(composite, SWT.CHECK);
77-
GridData resolveWorspaceProjectsButtonData = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
78-
resolveWorspaceProjectsButton.setLayoutData(resolveWorspaceProjectsButtonData);
81+
resolveWorspaceProjectsButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
7982
resolveWorspaceProjectsButton.setText(Messages.MavenProjectPreferencePage_btnResolve);
8083

84+
autoUpdateConfigurationButton = new Button(composite, SWT.CHECK);
85+
autoUpdateConfigurationButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
86+
autoUpdateConfigurationButton.setText(Messages.MavenPreferencePage_autoUpdateProjectConfiguration);
87+
if(MavenUpdateConfigurationChangeListener.isAutoConfigurationUpdateDisabled()) {
88+
autoUpdateConfigurationButton.setEnabled(false);
89+
String text = autoUpdateConfigurationButton.getText() + " (disabled in workspace preferences)";
90+
autoUpdateConfigurationButton.setText(text);
91+
}
92+
8193
// includeModulesButton = new Button(composite, SWT.CHECK);
8294
// GridData gd = new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1);
8395
// gd.verticalIndent = 15;
@@ -100,16 +112,19 @@ protected Control createContents(Composite parent) {
100112

101113
init(getResolverConfiguration());
102114

115+
boolean isAutoUpdate = ResolverConfigurationIO.isAutomaticallyUpdateConfiguration(getProject());
116+
autoUpdateConfigurationButton.setSelection(isAutoUpdate);
117+
103118
return composite;
104119
}
105120

106121
@Override
107122
protected void performDefaults() {
108123
init(new ResolverConfiguration());
124+
autoUpdateConfigurationButton.setSelection(MavenPreferenceInitializer.P_AUTO_UPDATE_CONFIGURATION_DEFAULT);
109125
}
110126

111-
private void init(IProjectConfiguration configuration) {
112-
127+
private void init(ResolverConfiguration configuration) {
113128
resolveWorspaceProjectsButton.setSelection(configuration.isResolveWorkspaceProjects());
114129
// includeModulesButton.setSelection(configuration.shouldIncludeModules());
115130
selectedProfilesText.setText(configuration.getSelectedProfiles());
@@ -130,11 +145,14 @@ public boolean performOk() {
130145
final ResolverConfiguration configuration = new ResolverConfiguration(getResolverConfiguration());
131146
if(configuration.getSelectedProfiles().equals(selectedProfilesText.getText()) &&
132147
// configuration.shouldIncludeModules()==includeModulesButton.getSelection() &&
133-
configuration.isResolveWorkspaceProjects() == resolveWorspaceProjectsButton.getSelection()) {
148+
configuration.isResolveWorkspaceProjects() == resolveWorspaceProjectsButton.getSelection()
149+
&& ResolverConfigurationIO.isAutomaticallyUpdateConfiguration(project) == autoUpdateConfigurationButton
150+
.getSelection()) {
134151
return true;
135152
}
136153

137154
configuration.setResolveWorkspaceProjects(resolveWorspaceProjectsButton.getSelection());
155+
ResolverConfigurationIO.setAutomaticallyUpdateConfiguration(project, autoUpdateConfigurationButton.getSelection());
138156
// configuration.setIncludeModules(includeModulesButton.getSelection());
139157
configuration.setSelectedProfiles(selectedProfilesText.getText());
140158

@@ -165,9 +183,9 @@ public IStatus runInWorkspace(IProgressMonitor monitor) {
165183
return isSet;
166184
}
167185

168-
private IProjectConfiguration getResolverConfiguration() {
186+
private ResolverConfiguration getResolverConfiguration() {
169187
IProjectConfigurationManager projectManager = MavenPlugin.getProjectConfigurationManager();
170-
return projectManager.getProjectConfiguration(getProject());
188+
return (ResolverConfiguration) projectManager.getProjectConfiguration(getProject());
171189
}
172190

173191
private IProject getProject() {

org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/project/MavenUpdateConfigurationChangeListener.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.eclipse.core.runtime.CoreException;
2626

2727
import org.eclipse.m2e.core.MavenPlugin;
28+
import org.eclipse.m2e.core.internal.project.ResolverConfigurationIO;
2829
import org.eclipse.m2e.core.ui.internal.UpdateMavenProjectJob;
2930

3031

@@ -40,10 +41,10 @@ public class MavenUpdateConfigurationChangeListener implements IResourceChangeLi
4041

4142
@Override
4243
public void resourceChanged(IResourceChangeEvent event) {
43-
if(isDisabled()) {
44+
if(isAutoConfigurationUpdateDisabled()) {
4445
return;
4546
}
46-
List<IProject> outOfDateProjects = null;
47+
List<IProject> outOfDateProjects;
4748
try {
4849
OutOfDateConfigurationDeltaVisitor visitor = new OutOfDateConfigurationDeltaVisitor();
4950
event.getDelta().accept(visitor);
@@ -52,10 +53,12 @@ public void resourceChanged(IResourceChangeEvent event) {
5253
LOG.error("An error occurred while checking for out-of-date configuration markers", e);
5354
return;
5455
}
56+
outOfDateProjects = outOfDateProjects.stream() //
57+
.filter(ResolverConfigurationIO::isAutomaticallyUpdateConfiguration).toList();
5558
updateProjectConfiguration(outOfDateProjects);
5659
}
5760

58-
private boolean isDisabled() {
61+
public static boolean isAutoConfigurationUpdateDisabled() {
5962
return !MavenPlugin.getMavenConfiguration().isAutomaticallyUpdateConfiguration();
6063
}
6164

org.eclipse.m2e.core.ui/src/org/eclipse/m2e/core/ui/internal/project/OutOfDateConfigurationDeltaVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
*/
3636
public class OutOfDateConfigurationDeltaVisitor implements IResourceDeltaVisitor {
3737

38-
List<IProject> outOfDateProjects = new ArrayList<>();
38+
final List<IProject> outOfDateProjects = new ArrayList<>();
3939

4040
@Override
4141
public boolean visit(IResourceDelta delta) throws CoreException {

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/preferences/MavenPreferenceInitializer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
*/
2828
public class MavenPreferenceInitializer extends AbstractPreferenceInitializer {
2929

30+
public static final boolean P_AUTO_UPDATE_CONFIGURATION_DEFAULT = true;
31+
3032
@Override
3133
public void initializeDefaultPreferences() {
3234
IEclipsePreferences store = DefaultScope.INSTANCE.getNode(IMavenConstants.PLUGIN_ID);
@@ -63,7 +65,7 @@ public void initializeDefaultPreferences() {
6365
// set to null since the plugin state location is not available by the time execution reaches here
6466
store.remove(MavenPreferenceConstants.P_WORKSPACE_MAPPINGS_LOCATION);
6567

66-
store.putBoolean(MavenPreferenceConstants.P_AUTO_UPDATE_CONFIGURATION, true);
68+
store.putBoolean(MavenPreferenceConstants.P_AUTO_UPDATE_CONFIGURATION, P_AUTO_UPDATE_CONFIGURATION_DEFAULT);
6769

6870
store.putBoolean(MavenPreferenceConstants.P_ENABLE_SNAPSHOT_ARCHETYPES, false);
6971

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ProjectConfigurationManager.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -885,12 +885,16 @@ public void mavenProjectChanged(List<MavenProjectChangedEvent> events, IProgress
885885

886886
if(facade != null) {
887887
ProblemSeverity outOfDateSeverity = ProblemSeverity.get(mavenConfiguration.getOutOfDateProjectSeverity());
888-
mavenMarkerManager.deleteMarkers(facade.getProject(), IMavenConstants.MARKER_CONFIGURATION_ID);
888+
IProject project = facade.getProject();
889+
mavenMarkerManager.deleteMarkers(project, IMavenConstants.MARKER_CONFIGURATION_ID);
889890
if(!ProblemSeverity.ignore.equals(outOfDateSeverity)) {
890891
LifecycleMappingConfiguration oldConfiguration = LifecycleMappingConfiguration.restore(facade, monitor);
891892
if(oldConfiguration != null
892893
&& LifecycleMappingFactory.isLifecycleMappingChanged(facade, oldConfiguration, monitor)) {
893-
mavenMarkerManager.addMarker(facade.getProject(), IMavenConstants.MARKER_CONFIGURATION_ID,
894+
if(!ResolverConfigurationIO.isAutomaticallyUpdateConfiguration(project)) {
895+
outOfDateSeverity = ProblemSeverity.info;
896+
}
897+
mavenMarkerManager.addMarker(project, IMavenConstants.MARKER_CONFIGURATION_ID,
894898
Messages.ProjectConfigurationUpdateRequired, -1, outOfDateSeverity.getSeverity());
895899
}
896900
}

org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/project/ResolverConfigurationIO.java

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@
3030
import org.eclipse.core.resources.IProject;
3131
import org.eclipse.core.resources.ProjectScope;
3232
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
33-
import org.eclipse.core.runtime.preferences.IScopeContext;
3433

3534
import org.eclipse.m2e.core.internal.IMavenConstants;
3635
import org.eclipse.m2e.core.internal.embedder.MavenProperties;
36+
import org.eclipse.m2e.core.internal.preferences.MavenPreferenceConstants;
37+
import org.eclipse.m2e.core.internal.preferences.MavenPreferenceInitializer;
3738
import org.eclipse.m2e.core.project.IProjectConfiguration;
3839
import org.eclipse.m2e.core.project.ResolverConfiguration;
3940

@@ -55,6 +56,8 @@ public class ResolverConfigurationIO {
5556
*/
5657
private static final String P_RESOLVE_WORKSPACE_PROJECTS = "resolveWorkspaceProjects"; //$NON-NLS-1$
5758

59+
private static final String P_AUTO_UPDATE_CONFIGURATION = MavenPreferenceConstants.P_AUTO_UPDATE_CONFIGURATION;
60+
5861
/**
5962
* Active profiles project preference key. Value is comma-separated list of enabled profiles.
6063
*/
@@ -82,13 +85,11 @@ public class ResolverConfigurationIO {
8285
private static final String VERSION = "1"; //$NON-NLS-1$
8386

8487
public static boolean saveResolverConfiguration(IProject project, IProjectConfiguration configuration) {
85-
IScopeContext projectScope = new ProjectScope(project);
86-
IEclipsePreferences projectNode = projectScope.getNode(IMavenConstants.PLUGIN_ID);
88+
IEclipsePreferences projectNode = getMavenProjectPreferences(project);
8789
if(projectNode != null) {
8890
projectNode.put(P_VERSION, VERSION);
8991

9092
projectNode.putBoolean(P_RESOLVE_WORKSPACE_PROJECTS, configuration.isResolveWorkspaceProjects());
91-
9293
projectNode.put(P_SELECTED_PROFILES, configuration.getSelectedProfiles());
9394

9495
if(configuration.getLifecycleMappingId() != null) {
@@ -101,21 +102,13 @@ public static boolean saveResolverConfiguration(IProject project, IProjectConfig
101102
} else {
102103
projectNode.remove(P_PROPERTIES);
103104
}
104-
105-
try {
106-
projectNode.flush();
107-
return true;
108-
} catch(BackingStoreException ex) {
109-
log.error("Failed to save resolver configuration", ex);
110-
}
105+
return savePreferences(projectNode);
111106
}
112-
113107
return false;
114108
}
115109

116110
public static IProjectConfiguration readResolverConfiguration(IProject project) {
117-
IScopeContext projectScope = new ProjectScope(project);
118-
IEclipsePreferences projectNode = projectScope.getNode(IMavenConstants.PLUGIN_ID);
111+
IEclipsePreferences projectNode = getMavenProjectPreferences(project);
119112
if(projectNode == null) {
120113
return new ResolverConfiguration(project);
121114
}
@@ -132,6 +125,34 @@ public static IProjectConfiguration readResolverConfiguration(IProject project)
132125
return configuration;
133126
}
134127

128+
public static boolean isAutomaticallyUpdateConfiguration(IProject project) {
129+
IEclipsePreferences preferences = getMavenProjectPreferences(project);
130+
boolean defaultValue = MavenPreferenceInitializer.P_AUTO_UPDATE_CONFIGURATION_DEFAULT;
131+
return preferences != null ? preferences.getBoolean(P_AUTO_UPDATE_CONFIGURATION, defaultValue) : defaultValue;
132+
}
133+
134+
public static void setAutomaticallyUpdateConfiguration(IProject project, boolean isAutomaticallyUpdateConfiguration) {
135+
IEclipsePreferences preferences = getMavenProjectPreferences(project);
136+
if(preferences != null) {
137+
preferences.putBoolean(P_AUTO_UPDATE_CONFIGURATION, isAutomaticallyUpdateConfiguration);
138+
savePreferences(preferences);
139+
}
140+
}
141+
142+
private static IEclipsePreferences getMavenProjectPreferences(IProject project) {
143+
return new ProjectScope(project).getNode(IMavenConstants.PLUGIN_ID);
144+
}
145+
146+
private static boolean savePreferences(IEclipsePreferences node) {
147+
try {
148+
node.flush();
149+
return true;
150+
} catch(BackingStoreException ex) {
151+
log.error("Failed to save resolver configuration", ex);
152+
}
153+
return false;
154+
}
155+
135156
private static File getBasedir(IEclipsePreferences projectNode, IProject project) {
136157
String basedirSetting = projectNode.get(P_BASEDIR, null);
137158
if(basedirSetting != null) {
@@ -144,9 +165,7 @@ private static File getBasedir(IEclipsePreferences projectNode, IProject project
144165
}
145166

146167
private static String propertiesAsString(Map<?, ?> properties) {
147-
String propAsString = properties.entrySet().stream().map(e -> encodeEntry(e))
148-
.collect(Collectors.joining(PROPERTIES_SEPARATOR));
149-
return propAsString;
168+
return properties.entrySet().stream().map(e -> encodeEntry(e)).collect(Collectors.joining(PROPERTIES_SEPARATOR));
150169
}
151170

152171
private static Properties stringAsProperties(String properties) {

0 commit comments

Comments
 (0)