From 416af3a5f8c49e6e8f89a62bd094eb9a29563927 Mon Sep 17 00:00:00 2001 From: Matthew Piggott Date: Tue, 12 Apr 2011 17:10:21 -0400 Subject: Added support for choosing pom in hierarchy to ignore goal --- .../internal/lifecycle/LifecycleMappingDialog.java | 143 +++++++++++++++++++++ .../lifecycle/LifecycleMappingProposal.java | 34 ++++- 2 files changed, 171 insertions(+), 6 deletions(-) create mode 100644 org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingDialog.java (limited to 'org.eclipse.m2e.editor.xml') diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingDialog.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingDialog.java new file mode 100644 index 00000000..729924a7 --- /dev/null +++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingDialog.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright (c) 2011 Sonatype, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.m2e.editor.xml.internal.lifecycle; + +import java.lang.reflect.InvocationTargetException; + +import org.apache.maven.model.Plugin; +import org.apache.maven.project.MavenProject; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.operation.IRunnableContext; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.PlatformUI; + +import org.eclipse.m2e.core.MavenPlugin; +import org.eclipse.m2e.core.internal.M2EUtils; +import org.eclipse.m2e.core.project.IMavenProjectFacade; +import org.eclipse.m2e.core.ui.internal.components.PomHierarchyComposite; + + +public class LifecycleMappingDialog extends Dialog implements ISelectionChangedListener { + + private PomHierarchyComposite pomComposite; + + private CLabel status; + + private IFile pomFile; + + private IMavenProjectFacade facade; + + private String pluginGroupId; + + private String pluginArtifactId; + + private String pluginVersion; + + private MavenProject pluginProject; + + public LifecycleMappingDialog(Shell parentShell, IFile pom, String pluginGroupId, String pluginArtifactId, + String pluginVersion) { + super(parentShell); + facade = MavenPlugin.getMavenProjectRegistry().create(pom, true, new NullProgressMonitor()); + this.pluginGroupId = pluginGroupId; + this.pluginArtifactId = pluginArtifactId; + this.pluginVersion = pluginVersion; + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite container = (Composite) super.createDialogArea(parent); + Label label = new Label(container, SWT.NONE); + label.setText("Select location to place ignore"); + pomComposite = new PomHierarchyComposite(container, SWT.BORDER); + pomComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + pomComposite.addSelectionChangedListener(this); + pomComposite.computeHeirarchy(facade, new IRunnableContext() { + + public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) + throws InvocationTargetException, InterruptedException { + runnable.run(new NullProgressMonitor()); + } + }); + status = new CLabel(container, SWT.WRAP); + status.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false)); + + pluginProject = locatePlugin(); + return container; + } + + @Override + protected void createButtonsForButtonBar(Composite parent) { + super.createButtonsForButtonBar(parent); + getButton(OK).setEnabled(false); + } + + public void selectionChanged(SelectionChangedEvent event) { + MavenProject project = pomComposite.fromSelection(); + if(getButton(OK) != null) { + getButton(OK).setEnabled(project != null && project.getFile() != null); + } + updateStatus(project); + } + + private void updateStatus(MavenProject project) { + if(project.getFile() == null) { + status.setText("Non-workspace pom"); + status.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK)); + } else if(project.equals(pluginProject)) { + status.setText("Plugin definition in selected pom."); + status.setImage(null); + } else { + status.setText(""); + status.setImage(null); + } + } + + @Override + protected void okPressed() { + pomFile = M2EUtils.getPomFile(pomComposite.fromSelection()); + super.okPressed(); + } + + /* + * Should only be called after dialog has closed with OK return code + */ + public IFile getPomFile() { + return pomFile; + } + + private MavenProject locatePlugin() { + for (MavenProject project : pomComposite.getHierarchy()) { + if (project.getOriginalModel().getBuild() != null) { + for (Plugin plugin : project.getOriginalModel().getBuild().getPlugins()) { + if(plugin.getGroupId().equals(pluginGroupId) && plugin.getArtifactId().equals(pluginArtifactId) + && (plugin.getVersion() == null || pluginVersion.equals(plugin.getVersion()))) { + return project; + } + } + } + } + return null; + } +} diff --git a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingProposal.java b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingProposal.java index 7ab80136..a07c130c 100644 --- a/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingProposal.java +++ b/org.eclipse.m2e.editor.xml/src/main/java/org/eclipse/m2e/editor/xml/internal/lifecycle/LifecycleMappingProposal.java @@ -12,6 +12,8 @@ package org.eclipse.m2e.editor.xml.internal.lifecycle; +import static org.eclipse.m2e.core.ui.internal.editing.PomEdits.performOnDOMDocument; + import java.io.IOException; import org.slf4j.Logger; @@ -26,17 +28,19 @@ import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.text.contentassist.ICompletionProposalExtension5; import org.eclipse.jface.text.contentassist.IContextInformation; import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext; +import org.eclipse.jface.window.Window; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IMarkerResolution; +import org.eclipse.ui.internal.Workbench; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.texteditor.MarkerAnnotation; import org.eclipse.m2e.core.core.IMavenConstants; import org.eclipse.m2e.core.lifecyclemapping.model.PluginExecutionAction; - -import static org.eclipse.m2e.core.ui.internal.editing.PomEdits.*; +import org.eclipse.m2e.core.ui.internal.editing.PomEdits.OperationTuple; import org.eclipse.m2e.editor.xml.internal.Messages; public class LifecycleMappingProposal implements ICompletionProposal, ICompletionProposalExtension5, IMarkerResolution { @@ -61,8 +65,7 @@ public class LifecycleMappingProposal implements ICompletionProposal, ICompletio public void apply(final IDocument doc) { try { - performOnDOMDocument(new OperationTuple(doc, createOperation())); - marker.delete(); + perform(); } catch(IOException e) { log.error("Error generating code in pom.xml", e); //$NON-NLS-1$ } catch(CoreException e) { @@ -70,6 +73,26 @@ public class LifecycleMappingProposal implements ICompletionProposal, ICompletio } } + private void perform() throws IOException, CoreException { + final IFile[] pomFile = new IFile[1]; + Workbench.getInstance().getDisplay().syncExec(new Runnable() { + + public void run() { + LifecycleMappingDialog dialog = new LifecycleMappingDialog(Display.getCurrent().getActiveShell(), + (IFile) marker.getResource(), marker.getAttribute(IMavenConstants.MARKER_ATTR_GROUP_ID, ""), marker + .getAttribute(IMavenConstants.MARKER_ATTR_ARTIFACT_ID, ""), marker.getAttribute( + IMavenConstants.MARKER_ATTR_VERSION, "")); + dialog.setBlockOnOpen(true); + if(dialog.open() == Window.OK) { + pomFile[0] = dialog.getPomFile(); + } + } + }); + if(pomFile[0] != null) { + performOnDOMDocument(new OperationTuple(pomFile[0], createOperation())); + } + } + private LifecycleMappingOperation createOperation() { String pluginGroupId = marker.getAttribute(IMavenConstants.MARKER_ATTR_GROUP_ID, ""); //$NON-NLS-1$ String pluginArtifactId = marker.getAttribute(IMavenConstants.MARKER_ATTR_ARTIFACT_ID, ""); //$NON-NLS-1$ @@ -129,8 +152,7 @@ public class LifecycleMappingProposal implements ICompletionProposal, ICompletio public void run(final IMarker marker) { try { - performOnDOMDocument(new OperationTuple((IFile) marker.getResource(), createOperation())); - marker.delete(); + perform(); } catch(IOException e) { log.error("Error generating code in pom.xml", e); //$NON-NLS-1$ } catch(CoreException e) { -- cgit v1.2.3