diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/configurator/AbstractProjectConfigurator.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/configurator/AbstractProjectConfigurator.java
index 2852250ac8..c901d5c1b2 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/configurator/AbstractProjectConfigurator.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/project/configurator/AbstractProjectConfigurator.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008-2010 Sonatype, Inc.
+ * Copyright (c) 2008-2022 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
@@ -14,15 +14,19 @@
package org.eclipse.m2e.core.project.configurator;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
+import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
@@ -41,9 +45,13 @@
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.IMaven;
import org.eclipse.m2e.core.embedder.IMavenConfiguration;
+import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.internal.Messages;
import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory;
import org.eclipse.m2e.core.internal.markers.IMavenMarkerManager;
+import org.eclipse.m2e.core.internal.markers.MavenProblemInfo;
+import org.eclipse.m2e.core.internal.markers.SourceLocation;
+import org.eclipse.m2e.core.internal.markers.SourceLocationHelper;
import org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata;
import org.eclipse.m2e.core.lifecyclemapping.model.PluginExecutionAction;
import org.eclipse.m2e.core.project.IMavenProjectChangedListener;
@@ -167,15 +175,43 @@ public static void addNature(IProject project, String natureId, int updateFlags,
throws CoreException {
if(!project.hasNature(natureId)) {
IProjectDescription description = project.getDescription();
- String[] prevNatures = description.getNatureIds();
- String[] newNatures = new String[prevNatures.length + 1];
- System.arraycopy(prevNatures, 0, newNatures, 1, prevNatures.length);
- newNatures[0] = natureId;
- description.setNatureIds(newNatures);
+ var natures = Stream.concat(Stream.of(natureId), Arrays.stream(description.getNatureIds()));
+ description.setNatureIds(natures.toArray(String[]::new));
project.setDescription(description, updateFlags, monitor);
}
}
+ /**
+ * Creates a problem marker in the pom.xml file at the specified element of the given Plugin-execution with the passed
+ * message and severity.
+ *
+ * If the attribute of the execution is specified in a parent pom.xml outside of the workspace the marker is created
+ * at the parent-element of the request's project.
+ *
+ *
+ * @param execution the execution
+ * @param element the XML-element to mark
+ * @param request the request of the project being build
+ * @param problemSeverity the problems severity, one of {@link IMarker#SEVERITY_INFO SEVERITY_INFO},
+ * {@link IMarker#SEVERITY_WARNING SEVERITY_WARNING} or {@link IMarker#SEVERITY_ERROR SEVERITY_ERROR}
+ * @param problemMessage the message of the created problem marker
+ */
+ protected void createProblemMarker(MojoExecution execution, String element, ProjectConfigurationRequest request,
+ int problemSeverity, String problemMessage) {
+ SourceLocation location = SourceLocationHelper.findLocation(execution.getPlugin(), element);
+
+ String[] gav = location.getResourceId().split(":");
+ IMavenProjectFacade facade = projectManager.getMavenProject(gav[0], gav[1], gav[2]);
+ if(facade == null) {
+ // attribute specifying project (probably parent) is not in the workspace.
+ // The following code returns the location of the project's parent-element.
+ location = SourceLocationHelper.findLocation(request.mavenProject(), new MojoExecutionKey(execution));
+ facade = request.mavenProjectFacade();
+ }
+ MavenProblemInfo problem = new MavenProblemInfo(problemMessage, problemSeverity, location);
+ markerManager.addErrorMarker(facade.getPom(), IMavenConstants.MARKER_CONFIGURATION_ID, problem);
+ }
+
/**
* @since 1.4
*/
@@ -216,21 +252,11 @@ public boolean equals(Object obj) {
if(this == obj) {
return true;
}
- if(obj == null) {
- return false;
- }
- if(getClass() != obj.getClass()) {
+ if(obj == null || getClass() != obj.getClass()) {
return false;
}
AbstractProjectConfigurator other = (AbstractProjectConfigurator) obj;
- if(getId() == null) {
- if(other.getId() != null) {
- return false;
- }
- } else if(!getId().equals(other.getId())) {
- return false;
- }
- return true;
+ return Objects.equals(getId(), other.getId());
}
/**
@@ -242,7 +268,7 @@ protected List getMojoExecutions(ProjectConfigurationRequest requ
Map> configuratorExecutions = getConfiguratorExecutions(projectFacade);
- ArrayList executions = new ArrayList<>();
+ List executions = new ArrayList<>();
Set executionKeys = configuratorExecutions.get(id);
if(executionKeys != null) {
@@ -259,25 +285,19 @@ protected List getMojoExecutions(ProjectConfigurationRequest requ
*/
public static Map> getConfiguratorExecutions(IMavenProjectFacade projectFacade) {
Map> configuratorExecutions = new HashMap<>();
- Map> executionMapping = projectFacade.getMojoExecutionMapping();
- for(Map.Entry> entry : executionMapping.entrySet()) {
- List metadatas = entry.getValue();
+ projectFacade.getMojoExecutionMapping().forEach((key, metadatas) -> {
if(metadatas != null) {
for(IPluginExecutionMetadata metadata : metadatas) {
if(metadata.getAction() == PluginExecutionAction.configurator) {
- String configuratorId = LifecycleMappingFactory.getProjectConfiguratorId(metadata);
- if(configuratorId != null) {
- Set executions = configuratorExecutions.get(configuratorId);
- if(executions == null) {
- executions = new LinkedHashSet<>();
- configuratorExecutions.put(configuratorId, executions);
- }
- executions.add(entry.getKey());
+ String id = LifecycleMappingFactory.getProjectConfiguratorId(metadata);
+ if(id != null) {
+ Set executions = configuratorExecutions.computeIfAbsent(id, i -> new LinkedHashSet<>());
+ executions.add(key);
}
}
}
}
- }
+ });
return configuratorExecutions;
}
diff --git a/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/PDEMavenBundlePluginConfigurator.java b/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/PDEMavenBundlePluginConfigurator.java
index fa0a3c1d85..5739114fe7 100644
--- a/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/PDEMavenBundlePluginConfigurator.java
+++ b/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/PDEMavenBundlePluginConfigurator.java
@@ -22,14 +22,9 @@
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.IMaven;
-import org.eclipse.m2e.core.internal.IMavenConstants;
-import org.eclipse.m2e.core.internal.markers.IMavenMarkerManager;
-import org.eclipse.m2e.core.internal.markers.MavenProblemInfo;
-import org.eclipse.m2e.core.internal.markers.SourceLocation;
import org.eclipse.m2e.core.internal.markers.SourceLocationHelper;
import org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
-import org.eclipse.m2e.core.project.IMavenProjectRegistry;
import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant;
import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
import org.eclipse.m2e.core.project.configurator.ILifecycleMappingConfiguration;
@@ -70,7 +65,8 @@ public void configure(ProjectConfigurationRequest request, IProgressMonitor moni
Boolean supportIncremental = maven.getMojoParameterValue(request.mavenProject(), execution,
FELIX_PARAM_SUPPORTINCREMENTALBUILD, Boolean.class, monitor);
if (supportIncremental == null || !supportIncremental.booleanValue()) {
- createWarningMarker(request, execution, SourceLocationHelper.CONFIGURATION,
+ createProblemMarker(execution, SourceLocationHelper.CONFIGURATION, request,
+ IMarker.SEVERITY_WARNING,
"Incremental updates are currently disabled, set supportIncrementalBuild=true to support automatic manifest updates for this project.");
}
@@ -82,7 +78,7 @@ public void configure(ProjectConfigurationRequest request, IProgressMonitor moni
}
if (!hasManifestExecution && !executions.isEmpty()) {
MojoExecution execution = executions.get(0);
- createWarningMarker(request, execution, "executions",
+ createProblemMarker(execution, "executions", request, IMarker.SEVERITY_WARNING,
"There is currently no execution that generates a manifest, consider adding an execution for one of the following goal: "
+ (isFelix(execution.getPlugin()) ? FELIX_MANIFEST_GOAL : BND_MANIFEST_GOALS) + ".");
}
@@ -92,27 +88,6 @@ public void configure(ProjectConfigurationRequest request, IProgressMonitor moni
PDEProjectHelper.addPDENature(facade.getProject(), metainfPath, monitor);
}
- private void createWarningMarker(ProjectConfigurationRequest request, MojoExecution execution, String attribute,
- String message) {
- createWarningMarker(projectManager, markerManager, request, execution, attribute, message);
- }
-
- static void createWarningMarker(IMavenProjectRegistry projectManager, IMavenMarkerManager markerManager,
- ProjectConfigurationRequest request, MojoExecution execution, String attribute, String message) {
- SourceLocation location = SourceLocationHelper.findLocation(execution.getPlugin(), attribute);
-
- String[] gav = location.getResourceId().split(":");
- IMavenProjectFacade facade = projectManager.getMavenProject(gav[0], gav[1], gav[2]);
- if (facade == null) {
- // attribute specifying project (probably parent) is not in the workspace.
- // The following code returns the location of the project's parent-element.
- location = SourceLocationHelper.findLocation(request.mavenProject(), new MojoExecutionKey(execution));
- facade = request.mavenProjectFacade();
- }
- MavenProblemInfo problem = new MavenProblemInfo(message, IMarker.SEVERITY_WARNING, location);
- markerManager.addErrorMarker(facade.getPom(), IMavenConstants.MARKER_LIFECYCLEMAPPING_ID, problem);
- }
-
private boolean isFelixManifestGoal(MojoExecution execution) {
return FELIX_MANIFEST_GOAL.equals(execution.getGoal());
}
diff --git a/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/TychoPackagingsConfigurator.java b/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/TychoPackagingsConfigurator.java
index ef941525d5..f9c5b50f97 100644
--- a/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/TychoPackagingsConfigurator.java
+++ b/org.eclipse.m2e.pde.connector/src/org/eclipse/m2e/pde/connector/TychoPackagingsConfigurator.java
@@ -9,7 +9,7 @@
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
- * Konrad Windszus
+ * Konrad Windszus - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.pde.connector;
@@ -18,6 +18,7 @@
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
@@ -61,10 +62,9 @@ private void applyDsConfiguration(ProjectConfigurationRequest request, IProgress
return;
}
if (mojoExecutions.size() > 1) {
- String message = String.format(
- "Found more than one execution for plugin %s:%s and goal %s, only consider configuration of this one",
- TYCHO_GROUP_ID, TYCHO_DS_PLUGIN_ARTIFACT_ID, GOAL_DECLARATIVE_SERVICES);
- createWarningMarker(request, mojoExecutions.get(0), "executions", message);
+ createProblemMarker(mojoExecutions.get(0), "executions", request, IMarker.SEVERITY_WARNING,
+ "Found more than one execution for plugin " + TYCHO_GROUP_ID + ":" + TYCHO_DS_PLUGIN_ARTIFACT_ID
+ + " and goal " + GOAL_DECLARATIVE_SERVICES + ", only consider configuration of this one");
}
// first mojo execution is relevant
Xpp3Dom dom = mojoExecutions.get(0).getConfiguration();
@@ -85,8 +85,9 @@ private void applyDsConfiguration(ProjectConfigurationRequest request, IProgress
if (version != null) {
prefs.put(org.eclipse.pde.ds.internal.annotations.Activator.PREF_SPEC_VERSION, version.name());
} else {
- String message = "Unsupported DS spec version " + versionValue + " found, using default instead";
- createWarningMarker(request, mojoExecutions.get(0), SourceLocationHelper.CONFIGURATION, message);
+ createProblemMarker(mojoExecutions.get(0), SourceLocationHelper.CONFIGURATION, request,
+ IMarker.SEVERITY_WARNING,
+ "Unsupported DS spec version " + versionValue + " found, using default instead");
}
}
Xpp3Dom path = dom.getChild("path");
@@ -124,10 +125,4 @@ private List getTychoDsPluginMojoExecutions(ProjectConfigurationR
return request.mavenProjectFacade().getMojoExecutions(TYCHO_GROUP_ID, TYCHO_DS_PLUGIN_ARTIFACT_ID, monitor,
GOAL_DECLARATIVE_SERVICES);
}
-
- private void createWarningMarker(ProjectConfigurationRequest request, MojoExecution execution, String attribute,
- String message) {
- PDEMavenBundlePluginConfigurator.createWarningMarker(projectManager, markerManager, request, execution,
- attribute, message);
- }
}