Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPascal Rapicault2011-01-14 22:26:12 +0000
committerPascal Rapicault2011-01-14 22:26:12 +0000
commitd7c9342b0b86bf701e8b7b1a044e975437ce37de (patch)
tree3288900ec1eb9fbcff773a918a2d740873d7a751 /org.eclipse.m2e.discovery/src
parentdaedd420d63434e847dcd107d89c99f10e3f117e (diff)
downloadm2e-core-d7c9342b0b86bf701e8b7b1a044e975437ce37de.tar.gz
m2e-core-d7c9342b0b86bf701e8b7b1a044e975437ce37de.tar.xz
m2e-core-d7c9342b0b86bf701e8b7b1a044e975437ce37de.zip
Support for discovering missing plugin executions
Signed-off-by: Pascal Rapicault <pascal@sonatype.com>
Diffstat (limited to 'org.eclipse.m2e.discovery/src')
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/MavenDiscovery.java7
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/Messages.java3
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/handlers/MavenDiscoveryHandler.java3
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/DiscoveryWizardProposal.java88
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/MavenDiscoveryMarkerResolutionGenerator.java11
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/messages.properties13
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogConfiguration.java22
-rw-r--r--org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogViewer.java64
8 files changed, 182 insertions, 29 deletions
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/MavenDiscovery.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/MavenDiscovery.java
index f8a02144..04652ab4 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/MavenDiscovery.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/MavenDiscovery.java
@@ -41,16 +41,16 @@ public class MavenDiscovery {
private static final String PATH = "http://download.eclipse.org/technology/m2e/discovery/directory.xml"; //$NON-NLS-1$
- public static void launchWizard(final Collection<String> packagingTypes, Collection<MojoExecution> mojos) {
+ public static void launchWizard(final Collection<String> packagingTypes, final Collection<MojoExecution> mojos) {
final Display display = Workbench.getInstance().getDisplay();
display.asyncExec(new Runnable() {
public void run() {
- launchWizard(display.getActiveShell(), packagingTypes);
+ launchWizard(display.getActiveShell(), packagingTypes, mojos);
}
});
}
- public static void launchWizard(Shell shell, Collection<String> packagingTypes) {
+ public static void launchWizard(Shell shell, Collection<String> packagingTypes, Collection<MojoExecution> mojos) {
Catalog catalog = new Catalog();
catalog.setEnvironment(DiscoveryCore.createEnvironment());
catalog.setVerifyUpdateSiteAvailability(false);
@@ -82,6 +82,7 @@ public class MavenDiscovery {
}
configuration.setShowInstalledFilter(false);
configuration.setSelectedPackagingTypes(packagingTypes);
+ configuration.setSelectedMojos(mojos);
MavenDiscoveryWizard wizard = new MavenDiscoveryWizard(catalog, configuration);
WizardDialog dialog = new WizardDialog(shell, wizard);
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/Messages.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/Messages.java
index f60984c2..ece40044 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/Messages.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/Messages.java
@@ -17,6 +17,7 @@ import org.eclipse.osgi.util.NLS;
public class Messages extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.m2e.internal.discovery.messages"; //$NON-NLS-1$
+
public static String DiscoveryWizardProposal_Label;
public static String MavenCatalogPage_Descripton;
@@ -25,6 +26,8 @@ public class Messages extends NLS {
public static String MavenCatalogViewer_Error_loading_lifecycle;
+ public static String MavenCatalogViewer_Missing_mojo_execution;
+
public static String MavenCatalogViewer_Missing_packaging_type;
public static String MavenDiscoveryWizard_Title;
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/handlers/MavenDiscoveryHandler.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/handlers/MavenDiscoveryHandler.java
index 933caa95..36cf6455 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/handlers/MavenDiscoveryHandler.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/handlers/MavenDiscoveryHandler.java
@@ -24,7 +24,8 @@ public class MavenDiscoveryHandler extends AbstractHandler {
@SuppressWarnings("unchecked")
public Object execute(ExecutionEvent event) throws ExecutionException {
- MavenDiscovery.launchWizard(HandlerUtil.getActiveWorkbenchWindowChecked(event).getShell(), Collections.EMPTY_LIST);
+ MavenDiscovery.launchWizard(HandlerUtil.getActiveWorkbenchWindowChecked(event).getShell(), Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST);
return null;
}
}
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/DiscoveryWizardProposal.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/DiscoveryWizardProposal.java
index 3cd6d150..1f71dbb3 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/DiscoveryWizardProposal.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/DiscoveryWizardProposal.java
@@ -8,29 +8,97 @@
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
+
package org.eclipse.m2e.internal.discovery.markers;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.List;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.MojoExecution;
import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.m2e.core.core.IMavenConstants;
import org.eclipse.m2e.internal.discovery.MavenDiscovery;
import org.eclipse.m2e.internal.discovery.Messages;
-import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
-class DiscoveryWizardProposal implements IMarkerResolution {
+class DiscoveryWizardProposal extends WorkbenchMarkerResolution {
static final DiscoveryWizardProposal PROPOSAL = new DiscoveryWizardProposal();
- public String getLabel() {
- return Messages.DiscoveryWizardProposal_Label;
- }
+ @SuppressWarnings("unchecked")
+ public void run(IMarker marker) {
+ String type = marker.getAttribute(IMavenConstants.MARKER_ATTR_EDITOR_HINT, null);
+ if(IMavenConstants.EDITOR_HINT_UNKNOWN_PACKAGING.equals(type)) {
+ MavenDiscovery.launchWizard(Arrays.asList(new String[] {getPackageType(marker)}), Collections.EMPTY_LIST);
+ } else if(IMavenConstants.EDITOR_HINT_NOT_COVERED_MOJO_EXECUTION.equals(type)) {
+ MavenDiscovery
+ .launchWizard(Collections.EMPTY_LIST, Arrays.asList(new MojoExecution[] {getMojoExecution(marker)}));
+ }
+
+ }
+
+ public String getDescription() {
+ return Messages.DiscoveryWizardProposal_Label;
+ }
+
+ public Image getImage() {
+ return null;
+ }
+
+ @Override
+ public void run(IMarker[] markers, IProgressMonitor monitor) {
+ List<String> packagingTypes = new ArrayList<String>();
+ List<MojoExecution> mojos = new ArrayList<MojoExecution>();
+ for(IMarker marker : markers) {
+ String type = marker.getAttribute(IMavenConstants.MARKER_ATTR_EDITOR_HINT, null);
+ if(IMavenConstants.EDITOR_HINT_UNKNOWN_PACKAGING.equals(type)) {
+ packagingTypes.add(getPackageType(marker));
+ } else if(IMavenConstants.EDITOR_HINT_NOT_COVERED_MOJO_EXECUTION.equals(type)) {
+ mojos.add(getMojoExecution(marker));
+ }
+ }
+ MavenDiscovery.launchWizard(packagingTypes, mojos);
+ }
+
+ private MojoExecution getMojoExecution(IMarker marker) {
+ // TODO Which of these are actually required?
+ String groupId = marker.getAttribute("groupId", null);
+ String artifactId = marker.getAttribute("artifactId", null);
+ String executionId = marker.getAttribute("executionId", null);
+ String version = marker.getAttribute("version", null);
+ String goal = marker.getAttribute("goal", null);
+ if(goal != null && executionId != null && artifactId != null && groupId != null) {
+ Plugin plugin = new Plugin();
+ plugin.setArtifactId(artifactId);
+ plugin.setGroupId(groupId);
+ plugin.setVersion(version);
+ return new MojoExecution(plugin, goal, executionId);
+ }
+ return null;
+ }
+
+ private String getPackageType(IMarker marker) {
+ return marker.getAttribute(IMavenConstants.MARKER_ATTR_PACKAGING, null);
+ }
+
+ @Override
+ public IMarker[] findOtherMarkers(IMarker[] markers) {
+ List<IMarker> handled = new ArrayList<IMarker>();
+ for(IMarker marker : markers) {
+ if(MavenDiscoveryMarkerResolutionGenerator.canResolve(marker)) {
+ handled.add(marker);
+ }
+ }
+ return handled.toArray(new IMarker[handled.size()]);
+ }
- public void run(IMarker marker) {
- String packaging = marker.getAttribute(IMavenConstants.MARKER_ATTR_PACKAGING, null);
- if (packaging != null)
- MavenDiscovery.launchWizard(Arrays.asList(new String[] {packaging}), Collections.EMPTY_LIST);
- }
+ public String getLabel() {
+ return Messages.DiscoveryWizardProposal_Label;
+ }
} \ No newline at end of file
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/MavenDiscoveryMarkerResolutionGenerator.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/MavenDiscoveryMarkerResolutionGenerator.java
index 8e278c5a..6242c9f2 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/MavenDiscoveryMarkerResolutionGenerator.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/markers/MavenDiscoveryMarkerResolutionGenerator.java
@@ -8,6 +8,7 @@
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
+
package org.eclipse.m2e.internal.discovery.markers;
import org.eclipse.core.resources.IMarker;
@@ -20,9 +21,7 @@ import org.eclipse.ui.IMarkerResolutionGenerator2;
public class MavenDiscoveryMarkerResolutionGenerator implements IMarkerResolutionGenerator, IMarkerResolutionGenerator2 {
public boolean hasResolutions(IMarker marker) {
- String type = marker.getAttribute(IMavenConstants.MARKER_ATTR_EDITOR_HINT, null);
- return IMavenConstants.EDITOR_HINT_UNKNOWN_PACKAGING.equals(type)
- || IMavenConstants.EDITOR_HINT_NOT_COVERED_MOJO_EXECUTION.equals(type);
+ return canResolve(marker);
}
public IMarkerResolution[] getResolutions(IMarker marker) {
@@ -34,4 +33,10 @@ public class MavenDiscoveryMarkerResolutionGenerator implements IMarkerResolutio
}
return new IMarkerResolution[0];
}
+
+ public static boolean canResolve(IMarker marker) {
+ String type = marker.getAttribute(IMavenConstants.MARKER_ATTR_EDITOR_HINT, null);
+ return IMavenConstants.EDITOR_HINT_UNKNOWN_PACKAGING.equals(type)
+ || IMavenConstants.EDITOR_HINT_NOT_COVERED_MOJO_EXECUTION.equals(type);
+ }
}
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/messages.properties b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/messages.properties
index e7b3665f..2c40230d 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/messages.properties
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/messages.properties
@@ -5,12 +5,13 @@
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
-DiscoveryWizardProposal_Label=Discover new m2e add-ons
-MavenCatalogPage_Descripton=Select updates and add-ons to install. Press Finish to proceed with installation.\nPress the information button to see a detailed overview and a link to more information.
-MavenCatalogPage_Title=Install m2e add-ons
-MavenCatalogViewer_Error_loading_lifecycle=An error occurred loading lifecycle data for catalog item: {0}.
-MavenCatalogViewer_Missing_packaging_type=No relevant CatalogItem found for packaging type: {0}.
-MavenDiscoveryWizard_Title=M2e store
+DiscoveryWizardProposal_Label=Discover new maven plugins
+MavenCatalogPage_Descripton=Select updates and extensions to install. Press Finish to proceed with installation.\nPress the information button to see a detailed overview and a link to more information.
+MavenCatalogPage_Title=Install Maven Plugins
+MavenCatalogViewer_Error_loading_lifecycle=An error occurred loading lifecycle data for catalog item: {0}
+MavenCatalogViewer_Missing_packaging_type=No relevant CatalogItem found for packaging type: {0}
+MavenCatalogViewer_Missing_mojo_execution=No relevant CatalogItem found for MojoExecution {0} {1} {2} {3}
+MavenDiscoveryWizard_Title=Maven Discovery
MavenDiscovery_Wizard_Applicable_Tag=Applicable
MavenDiscovery_Wizard_ExtrasTag=Extras
MavenDiscovery_Wizard_LifecyclesTag=Lifecycles
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogConfiguration.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogConfiguration.java
index a837d664..3af0ea3f 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogConfiguration.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogConfiguration.java
@@ -15,6 +15,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
+import org.apache.maven.plugin.MojoExecution;
import org.eclipse.equinox.internal.p2.ui.discovery.wizards.CatalogConfiguration;
@@ -23,11 +24,19 @@ public class MavenCatalogConfiguration extends CatalogConfiguration {
private Set<String> selectedPackagingTypes;
+ private Set<MojoExecution> selectedMojos;
+
+ public Collection<MojoExecution> getSelectedMojos() {
+ return selectedMojos;
+ }
+
public Collection<String> getSelectedPackagingTypes() {
return selectedPackagingTypes;
}
- // IDs for catalog items which should be selected when the wizard is presented
+ /*
+ * Set the packaging types that should be selected in the UI
+ */
public void setSelectedPackagingTypes(Collection<String> packagingTypes) {
if(selectedPackagingTypes == null) {
selectedPackagingTypes = new HashSet<String>(packagingTypes);
@@ -35,4 +44,15 @@ public class MavenCatalogConfiguration extends CatalogConfiguration {
selectedPackagingTypes.addAll(packagingTypes);
}
}
+
+ /*
+ * Set the mojos that should be selected in the UI
+ */
+ public void setSelectedMojos(Collection<MojoExecution> mojos) {
+ if(selectedMojos == null) {
+ selectedMojos = new HashSet<MojoExecution>(mojos);
+ } else {
+ selectedMojos.addAll(mojos);
+ }
+ }
}
diff --git a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogViewer.java b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogViewer.java
index 5babbcc7..84239ba3 100644
--- a/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogViewer.java
+++ b/org.eclipse.m2e.discovery/src/org/eclipse/m2e/internal/discovery/wizards/MavenCatalogViewer.java
@@ -19,6 +19,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import org.apache.maven.plugin.MojoExecution;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.discovery.Catalog;
@@ -31,7 +32,9 @@ import org.eclipse.m2e.core.core.MavenLogger;
import org.eclipse.m2e.core.internal.lifecycle.LifecycleMappingFactory;
import org.eclipse.m2e.core.internal.lifecycle.model.LifecycleMappingMetadata;
import org.eclipse.m2e.core.internal.lifecycle.model.LifecycleMappingMetadataSource;
+import org.eclipse.m2e.core.internal.lifecycle.model.PluginExecutionMetadata;
import org.eclipse.m2e.internal.discovery.MavenDiscovery;
+import org.eclipse.m2e.internal.discovery.MavenDiscoveryIcons;
import org.eclipse.m2e.internal.discovery.Messages;
import org.eclipse.osgi.util.NLS;
@@ -43,7 +46,7 @@ public class MavenCatalogViewer extends CatalogViewer {
private static final String EXT = ".xml"; //$NON-NLS-1$
- private static final String ID = "org.eclipse.m2e.discovery"; //$NON-NLS-1$
+ private Map<CatalogItem, LifecycleMappingMetadataSource> lifecycleCache = new HashMap<CatalogItem, LifecycleMappingMetadataSource>();
public MavenCatalogViewer(Catalog catalog, IShellProvider shellProvider, IRunnableContext context,
CatalogConfiguration configuration) {
@@ -56,11 +59,12 @@ public class MavenCatalogViewer extends CatalogViewer {
final MavenCatalogConfiguration config = (MavenCatalogConfiguration) getConfiguration();
final Collection<String> selectedPackagingTypes = config.getSelectedPackagingTypes();
+ final Collection<MojoExecution> selectedMojos = config.getSelectedMojos();
shellProvider.getShell().getDisplay().syncExec(new Runnable() {
@SuppressWarnings("synthetic-access")
public void run() {
- Map<String, Set<CatalogItem>> map = new HashMap<String, Set<CatalogItem>>();
+ Map<String, Set<CatalogItem>> map = new HashMap<String, Set<CatalogItem>>(selectedPackagingTypes.size());
for(String packagingType : selectedPackagingTypes) {
map.put(packagingType, new HashSet<CatalogItem>());
@@ -73,6 +77,19 @@ public class MavenCatalogViewer extends CatalogViewer {
}
}
+ Map<MojoExecution, Set<CatalogItem>> mojoMap = new HashMap<MojoExecution, Set<CatalogItem>>(selectedMojos
+ .size());
+ // Mojo
+ for(MojoExecution mojoExecution : selectedMojos) {
+ mojoMap.put(mojoExecution, new HashSet<CatalogItem>());
+ for(CatalogItem ci : getCatalog().getItems()) {
+ LifecycleMappingMetadataSource src = getLifecycleMappingMetadataSource(ci);
+ if(src != null && matchesFilter(src, mojoExecution)) {
+ mojoMap.get(mojoExecution).add(ci);
+ }
+ }
+ }
+
// Select relevant CatalogItems
// TODO Make selection smarter
for(Entry<String, Set<CatalogItem>> type : map.entrySet()) {
@@ -84,15 +101,52 @@ public class MavenCatalogViewer extends CatalogViewer {
ci.addTag(MavenDiscovery.APPLICABLE_TAG);
}
}
+
+ for(Entry<MojoExecution, Set<CatalogItem>> type : mojoMap.entrySet()) {
+ if(type.getValue().isEmpty()) {
+ MavenLogger.log(NLS.bind(Messages.MavenCatalogViewer_Missing_mojo_execution, new String[] {
+ type.getKey().getGroupId(), type.getKey().getArtifactId(), type.getKey().getExecutionId(),
+ type.getKey().getGoal()}));
+ }
+ for(CatalogItem ci : type.getValue()) {
+ modifySelection(ci, true);
+ ci.addTag(MavenDiscovery.APPLICABLE_TAG);
+ }
+ }
}
});
}
+
+ private static boolean matchesFilter(LifecycleMappingMetadataSource src, MojoExecution mojoExecution) {
+ for(PluginExecutionMetadata p : src.getPluginExecutions()) {
+ if(p.getFilter().match(mojoExecution)) {
+ return true;
+ }
+ }
+ for(LifecycleMappingMetadata m : src.getLifecycleMappings()) {
+ for(PluginExecutionMetadata p : m.getPluginExecutions()) {
+ if(p.getFilter().match(mojoExecution)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
- private static LifecycleMappingMetadataSource getLifecycleMappingMetadataSource(CatalogItem ci) {
+ private LifecycleMappingMetadataSource getLifecycleMappingMetadataSource(CatalogItem ci) {
try {
- return LifecycleMappingFactory.createLifecycleMappingMetadataSource(getLifecycleMappingMetadataSourceURL(ci));
+ if(lifecycleCache.get(ci) != null) {
+ return lifecycleCache.get(ci);
+ }
+ LifecycleMappingMetadataSource source = LifecycleMappingFactory
+ .createLifecycleMappingMetadataSource(getLifecycleMappingMetadataSourceURL(ci));
+ if(source != null) {
+ lifecycleCache.put(ci, source);
+ }
+ return source;
} catch(Exception e) {
- MavenLogger.log(new Status(IStatus.WARNING, ID, NLS.bind(Messages.MavenCatalogViewer_Error_loading_lifecycle,
+ MavenLogger.log(new Status(IStatus.WARNING, MavenDiscoveryIcons.PLUGIN_ID, NLS.bind(
+ Messages.MavenCatalogViewer_Error_loading_lifecycle,
ci.getId()), e));
return null;
}

Back to the top