org.eclipse.m2e.editor.xml.internal.lifecycle.WorkspaceLifecycleMappingProposal.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.m2e.editor.xml.internal.lifecycle.WorkspaceLifecycleMappingProposal.java

Source

/*******************************************************************************
 * Copyright (c) 2008-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.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.repository.internal.DefaultVersionRangeResolver;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.IDocument;
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.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.MarkerAnnotation;
import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;

import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.internal.MavenPluginActivator;
import org.eclipse.m2e.core.internal.lifecyclemapping.model.LifecycleMappingMetadataSource;
import org.eclipse.m2e.core.internal.lifecyclemapping.model.PluginExecutionFilter;
import org.eclipse.m2e.core.internal.lifecyclemapping.model.PluginExecutionMetadata;
import org.eclipse.m2e.core.internal.lifecyclemapping.model.io.xpp3.LifecycleMappingMetadataSourceXpp3Reader;
import org.eclipse.m2e.core.internal.lifecyclemapping.model.io.xpp3.LifecycleMappingMetadataSourceXpp3Writer;
import org.eclipse.m2e.core.lifecyclemapping.model.PluginExecutionAction;
import org.eclipse.m2e.core.project.configurator.MojoExecutionKey;
import org.eclipse.m2e.core.ui.internal.UpdateConfigurationJob;
import org.eclipse.m2e.editor.xml.internal.Messages;

public class WorkspaceLifecycleMappingProposal extends WorkbenchMarkerResolution
        implements ICompletionProposal, ICompletionProposalExtension5, IMarkerResolution {
    private static final Logger log = LoggerFactory.getLogger(WorkspaceLifecycleMappingProposal.class);

    private IQuickAssistInvocationContext context;
    private final IMarker marker;

    private final PluginExecutionAction action;

    public WorkspaceLifecycleMappingProposal(IQuickAssistInvocationContext context, MarkerAnnotation mark,
            PluginExecutionAction action) {
        this.context = context;
        marker = mark.getMarker();
        this.action = action;
    }

    public WorkspaceLifecycleMappingProposal(IMarker marker, PluginExecutionAction action) {
        this.marker = marker;
        this.action = action;
    }

    public void apply(final IDocument doc) {
        run(marker);
    }

    /**
     * @return
     */
    private static LifecycleMappingMetadataSource getWorkspacePreferencesMetadataSources() {
        LifecycleMappingMetadataSource source = new LifecycleMappingMetadataSource();
        String mapp = MavenPluginActivator.getDefault().getPluginPreferences().getString("XXX_mappings");
        if (mapp != null) {
            LifecycleMappingMetadataSourceXpp3Reader reader = new LifecycleMappingMetadataSourceXpp3Reader();
            try {
                source = reader.read(new StringReader(mapp));
            } catch (IOException ex) {
                // TODO Auto-generated catch block
                log.error(ex.getMessage(), ex);
            } catch (XmlPullParserException ex) {
                // TODO Auto-generated catch block
                log.error(ex.getMessage(), ex);
            }
        }
        return source;
    }

    private static void performIgnore(IMarker mark, LifecycleMappingMetadataSource source)
            throws IOException, CoreException {
        String pluginGroupId = mark.getAttribute(IMavenConstants.MARKER_ATTR_GROUP_ID, ""); //$NON-NLS-1$
        String pluginArtifactId = mark.getAttribute(IMavenConstants.MARKER_ATTR_ARTIFACT_ID, ""); //$NON-NLS-1$
        String pluginVersion = mark.getAttribute(IMavenConstants.MARKER_ATTR_VERSION, ""); //$NON-NLS-1$
        String goal = mark.getAttribute(IMavenConstants.MARKER_ATTR_GOAL, ""); //$NON-NLS-1$
        String id = pluginGroupId + ":" + pluginArtifactId;
        MojoExecutionKey key = new MojoExecutionKey(pluginGroupId, pluginArtifactId, pluginVersion, goal, null,
                null);
        boolean found = false;
        for (PluginExecutionMetadata pem : source.getPluginExecutions()) {
            PluginExecutionFilter filter = pem.getFilter();
            if (PluginExecutionAction.ignore.equals(pem.getAction())) {
                if (filter.getGroupId().equals(pluginGroupId) && filter.getArtifactId().equals(pluginArtifactId)) {
                    found = true;
                    try {
                        VersionRange range = VersionRange.createFromVersionSpec(filter.getVersionRange());
                        DefaultArtifactVersion version = new DefaultArtifactVersion(pluginVersion);
                        if (!range.containsVersion(version)) {
                            filter.setVersionRange("[" + pluginVersion + ",)");
                        }
                    } catch (InvalidVersionSpecificationException e) {
                        log.error(e.getMessage(), e);
                    }
                    if (!filter.getGoals().contains(goal)) {
                        filter.addGoal(goal);
                    }
                    break;
                }
            }
        }
        if (!found) {
            PluginExecutionMetadata pe = new PluginExecutionMetadata();
            PluginExecutionFilter fil = new PluginExecutionFilter(pluginGroupId, pluginArtifactId,
                    "[" + pluginVersion + ",)", goal);
            pe.setFilter(fil);
            source.addPluginExecution(pe);
            Xpp3Dom actionDom = new Xpp3Dom("action");
            actionDom.addChild(new Xpp3Dom(PluginExecutionAction.ignore.name()));
            pe.setActionDom(actionDom);
        }

    }

    public String getAdditionalProposalInfo() {
        return null;
    }

    public IContextInformation getContextInformation() {
        return null;
    }

    public String getDisplayString() {
        String goal = marker.getAttribute(IMavenConstants.MARKER_ATTR_GOAL, ""); //$NON-NLS-1$
        return PluginExecutionAction.ignore.equals(action)
                ? NLS.bind("Mark goal {0} in workspace as ignored in Eclipse build", goal)
                : NLS.bind(Messages.LifecycleMappingProposal_execute_label, goal);
    }

    public Image getImage() {
        return PluginExecutionAction.ignore.equals(action)
                ? PlatformUI.getWorkbench().getSharedImages().getImage(org.eclipse.ui.ISharedImages.IMG_TOOL_DELETE)
                : PlatformUI.getWorkbench().getSharedImages()
                        .getImage(org.eclipse.ui.ISharedImages.IMG_TOOL_FORWARD);
    }

    public Point getSelection(IDocument arg0) {
        return null;
    }

    public Object getAdditionalProposalInfo(IProgressMonitor monitor) {
        if (context == null) {
            //no context in markerresolution, just to be sure..
            return null;
        }
        String pluginGroupId = marker.getAttribute(IMavenConstants.MARKER_ATTR_GROUP_ID, ""); //$NON-NLS-1$
        String pluginArtifactId = marker.getAttribute(IMavenConstants.MARKER_ATTR_ARTIFACT_ID, ""); //$NON-NLS-1$
        String pluginVersion = marker.getAttribute(IMavenConstants.MARKER_ATTR_VERSION, ""); //$NON-NLS-1$
        String goal = marker.getAttribute(IMavenConstants.MARKER_ATTR_GOAL, ""); //$NON-NLS-1$
        String execution = marker.getAttribute(IMavenConstants.MARKER_ATTR_EXECUTION_ID, "-"); //$NON-NLS-1$
        String phase = marker.getAttribute(IMavenConstants.MARKER_ATTR_LIFECYCLE_PHASE, "-"); //$NON-NLS-1$
        String info = NLS.bind(Messages.LifecycleMappingProposal_all_desc, new Object[] { goal, execution, phase,
                pluginGroupId + ":" + pluginArtifactId + ":" + pluginVersion, //$NON-NLS-1$ //$NON-NLS-2$
                (PluginExecutionAction.ignore.equals(action)
                        ? "This quickfix generates a plugin configuration snippet recognized by the m2e integration during project configuration. It marks the given goal as ignored for the purposes of the Eclipse build."
                        : Messages.LifecycleMappingProposal_execute_desc) });

        return info;
    }

    public String getLabel() {
        return getDisplayString();
    }

    public void run(final IMarker marker) {
        try {
            if (PluginExecutionAction.ignore.equals(action)) {
                LifecycleMappingMetadataSource source = getWorkspacePreferencesMetadataSources();
                performIgnore(marker, source);
                LifecycleMappingMetadataSourceXpp3Writer writer = new LifecycleMappingMetadataSourceXpp3Writer();
                StringWriter sw = new StringWriter();
                writer.write(sw, source);
                MavenPluginActivator.getDefault().getPluginPreferences().setValue("XXX_mappings", sw.toString());

                //now update the project
                new UpdateConfigurationJob(new IProject[] { marker.getResource().getProject() }).schedule();
                MavenPluginActivator.getDefault().savePluginPreferences();

            }
        } catch (IOException e) {
            log.error("Error generating code in pom.xml", e); //$NON-NLS-1$
        } catch (CoreException e) {
            log.error(e.getMessage(), e);
        }
    }

    public String getDescription() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public IMarker[] findOtherMarkers(IMarker[] markers) {
        List<IMarker> handled = new ArrayList<IMarker>();

        for (IMarker marker : markers) {
            if (marker == this.marker) {
                continue;
            }
            String hint = marker.getAttribute(IMavenConstants.MARKER_ATTR_EDITOR_HINT, null);
            if (hint != null && hint.equals(IMavenConstants.EDITOR_HINT_NOT_COVERED_MOJO_EXECUTION)) {
                handled.add(marker);
            }
        }
        return handled.toArray(new IMarker[handled.size()]);
    }

    @Override
    public void run(IMarker[] markers, IProgressMonitor monitor) {
        try {
            if (PluginExecutionAction.ignore.equals(action)) {
                Set<IProject> prjs = new HashSet<IProject>();
                LifecycleMappingMetadataSource source = getWorkspacePreferencesMetadataSources();
                for (IMarker mark : markers) {
                    performIgnore(mark, source);
                    prjs.add(mark.getResource().getProject());
                }
                LifecycleMappingMetadataSourceXpp3Writer writer = new LifecycleMappingMetadataSourceXpp3Writer();
                StringWriter sw = new StringWriter();
                writer.write(sw, source);
                MavenPluginActivator.getDefault().getPluginPreferences().setValue("XXX_mappings", sw.toString());

                MavenPluginActivator.getDefault().savePluginPreferences();
                for (IMarker mark : markers) {
                    mark.delete();
                }
                //now update the projects
                new UpdateConfigurationJob(prjs.toArray(new IProject[0])).schedule();

            }
        } catch (IOException e) {
            log.error("Error generating code in pom.xml", e); //$NON-NLS-1$
        } catch (CoreException e) {
            log.error(e.getMessage(), e);
        }
    }

}