diff options
author | Pascal Rapicault | 2011-01-14 22:26:12 +0000 |
---|---|---|
committer | Pascal Rapicault | 2011-01-14 22:26:12 +0000 |
commit | d7c9342b0b86bf701e8b7b1a044e975437ce37de (patch) | |
tree | 3288900ec1eb9fbcff773a918a2d740873d7a751 /org.eclipse.m2e.discovery/src | |
parent | daedd420d63434e847dcd107d89c99f10e3f117e (diff) | |
download | m2e-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')
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; } |