com.salesforce.ide.ui.refactoring.ResourceDeleteParticipant.java Source code

Java tutorial

Introduction

Here is the source code for com.salesforce.ide.ui.refactoring.ResourceDeleteParticipant.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Salesforce.com, 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:
 *     Salesforce.com, inc. - initial API and implementation
 ******************************************************************************/
package com.salesforce.ide.ui.refactoring;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.DeleteParticipant;
import org.eclipse.ltk.core.refactoring.participants.ISharableParticipant;
import org.eclipse.ltk.core.refactoring.participants.RefactoringArguments;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;

import com.salesforce.ide.core.factories.FactoryException;
import com.salesforce.ide.core.internal.utils.Constants;
import com.salesforce.ide.core.internal.utils.Utils;
import com.salesforce.ide.core.model.Component;
import com.salesforce.ide.core.project.ForceProjectException;
import com.salesforce.ide.ui.dialogs.WebOnlyDeleteMessageDialog;
import com.salesforce.ide.ui.internal.Messages;

/**
 * Handles refactor Force.com package and component delete function.
 * 
 * Note: "If an exception occurs while creating the change the refactoring can not be carried out and the participant
 * will be disabled for the rest of the eclipse session."
 * 
 * @author cwall
 */
public class ResourceDeleteParticipant extends DeleteParticipant implements ISharableParticipant {
    private static final Logger logger = Logger.getLogger(ResourceDeleteParticipant.class);

    private DeleteChange deleteChange = null;
    private boolean cancelFlag = false;

    //   C O N S T R U C T O R
    public ResourceDeleteParticipant() {
        super();
    }

    //   M E T H O D S

    @Override
    public RefactoringStatus checkConditions(IProgressMonitor monitor, CheckConditionsContext context)
            throws OperationCanceledException {
        // REVIEWME: what to do w/ ResourceChangeChecker and/or ValidateEditChecker

        Display.getDefault().syncExec(new Runnable() {
            public void run() {
                Set<IResource> deletedResources = deleteChange.getRefactorController().getRefactorModel()
                        .getChangeResources();
                List<IResource> resources = new ArrayList<IResource>();
                StringBuffer buffer = new StringBuffer();
                try {
                    Component workflow = deleteChange.getComponentFactory()
                            .getComponentByComponentType(Constants.WORKFLOW);
                    Component portal = deleteChange.getComponentFactory()
                            .getComponentByComponentType(Constants.PORTAL);
                    Component site = deleteChange.getComponentFactory()
                            .getComponentByComponentType(Constants.CUSTOM_SITE);

                    List<IResource> workflows = new ArrayList<IResource>();
                    List<IResource> sites = new ArrayList<IResource>();
                    List<IResource> portals = new ArrayList<IResource>();

                    for (Object o : deletedResources) {
                        if (o instanceof IFile) {
                            IFile file = (IFile) o;

                            if (file.getFileExtension().equals(portal.getFileExtension())) {
                                resources.add(file);
                                portals.add(file);
                            }

                            else if (file.getFileExtension().equals(site.getFileExtension())) {
                                resources.add(file);
                                sites.add(file);
                            }

                            else if (file.getFileExtension().equals(workflow.getFileExtension())) {
                                resources.add(file);
                                workflows.add(file);
                            }
                        }
                    }

                    Collections.sort(portals, new Comparator<IResource>() {
                        public int compare(IResource o1, IResource o2) {
                            return o1.getName().compareToIgnoreCase(o2.getName());
                        }
                    });

                    Collections.sort(sites, new Comparator<IResource>() {
                        public int compare(IResource o1, IResource o2) {
                            return o1.getName().compareToIgnoreCase(o2.getName());
                        }
                    });

                    Collections.sort(workflows, new Comparator<IResource>() {
                        public int compare(IResource o1, IResource o2) {
                            return o1.getName().compareToIgnoreCase(o2.getName());
                        }
                    });

                    for (IResource file : portals) {
                        addBullet(buffer,
                                NLS.bind(Messages.ResourceDeleteParticipant_fileLocallyDeleted_message,
                                        file.getName()),
                                NLS.bind(Messages.ResourceDeleteParticipant_remotePortalConfirmation_message,
                                        resources.indexOf(file),
                                        file.getFullPath().removeFileExtension().lastSegment()));
                    }

                    for (IResource file : sites) {
                        addBullet(buffer,
                                NLS.bind(Messages.ResourceDeleteParticipant_fileLocallyDeleted_message,
                                        file.getName()),
                                NLS.bind(Messages.ResourceDeleteParticipant_remoteSiteConfirmation_message,
                                        resources.indexOf(file),
                                        file.getFullPath().removeFileExtension().lastSegment()));
                    }

                    if (workflows.size() == 1) {
                        IResource file = workflows.get(0);

                        addBullet(buffer,
                                NLS.bind(Messages.ResourceDeleteParticipant_fileLocallyDeleted_message,
                                        file.getName()),
                                NLS.bind(Messages.ResourceDeleteParticipant_remoteWorkflowConfirmation_message,
                                        resources.indexOf(file)));
                    }

                    else if (workflows.size() > 0) {
                        for (IResource file : workflows) {
                            addBullet(buffer, NLS.bind(
                                    Messages.ResourceDeleteParticipant_fileLocallyDeleted_message, file.getName()));
                        }

                        addBullet(buffer,
                                NLS.bind(Messages.ResourceDeleteParticipant_remoteWorkflowConfirmation_message,
                                        resources.indexOf(workflows.get(0))));
                    }

                } catch (FactoryException e) {
                    logger.error("Could not get Workflow component", e); //$NON-NLS-1$
                }

                boolean showWarning = true;
                if (resources.size() != deletedResources.size()
                        && !MessageDialog.openQuestion(Display.getDefault().getActiveShell(),
                                Messages.ResourceDeleteParticipant_remoteConfirmation_title,
                                Messages.ResourceDeleteParticipant_remoteConfirmation_message)) {
                    cancelFlag = true;
                    showWarning = false;
                }

                if (resources.size() > 0 && showWarning) {
                    WebOnlyDeleteMessageDialog.openWarning(Display.getDefault().getActiveShell(), Messages.WARNING,
                            buffer.toString(), resources);

                    if (resources.size() == deletedResources.size()) {
                        cancelFlag = true;
                    }
                }
            }
        });

        if (cancelFlag) {
            deleteChange.setRemoteDeleteCanceled(true);
            return null;
        }

        if (deleteChange.getRefactorController().getRefactorModel().isChangeResourcesEmpty()) {
            logger.warn("Change elements for delete are null or empty");
            return null;
        }

        RefactoringStatus refactoringStatus = null;
        try {
            refactoringStatus = deleteChange.getRefactorController().validateDelete(monitor);
        } catch (InterruptedException e) {
            logger.warn("Operation canceled by user");
            throw new OperationCanceledException(e.getMessage());
        }

        return refactoringStatus;
    }

    private void addBullet(StringBuffer buffer, String... msgs) {
        buffer.append("<li>"); //$NON-NLS-1$
        for (String msg : msgs) {
            buffer.append(msg);
        }
        buffer.append("</li>"); //$NON-NLS-1$
    }

    /**
     * Evaluates copy candidate and aggregates sub-elements.
     * 
     * Always return true so that this participant is involved in all copy transactions.
     */
    @Override
    protected boolean initialize(Object element) {
        if (logger.isDebugEnabled()) {
            logger.debug("*** " + getName() + " initiated ***");
        }

        // change elements will equate to a root resource move and a project package list containing
        // all affected elements
        if (element instanceof IResource) {
            IResource resource = (IResource) element;

            try {
                deleteChange = new DeleteChange();
                deleteChange.initialize(resource, new NullProgressMonitor());
            } catch (ForceProjectException e) {
                // catch exception because exceptions cause the participant to become deactivated for future refactorings
                logger.error("Unable to create delete instance", e);
            } catch (FactoryException e) {
                // catch exception because exceptions cause the participant to become deactivated for future refactorings
                logger.error(
                        "Unable to handle resource '" + resource.getProjectRelativePath().toPortableString() + "'",
                        e);
            } catch (CoreException e) {
                String logMessage = Utils.generateCoreExceptionLog(e);
                // catch exception because exceptions cause the participant to become deactivated for future refactorings
                logger.warn("Unable to handle resource '" + resource.getProjectRelativePath().toPortableString()
                        + "': " + logMessage, e);
            } catch (InterruptedException e) {
                logger.warn("Operation canceled by user");
            } catch (Exception e) {
                // catch exception because exceptions cause the participant to become deactivated for future refactorings
                logger.warn(e.getClass().getSimpleName() + " occurred while initializing delete change", e);
            }
        }

        // always return true so that this participant is involved in all copy transactions
        return true;
    }

    @Override
    public Change createChange(IProgressMonitor monitor) throws CoreException, OperationCanceledException {
        if (deleteChange == null) {
            try {
                deleteChange = new DeleteChange();
            } catch (ForceProjectException e) {
                // catch exception because exceptions cause the participant to become deactivated for future refactorings
                logger.error("Unable to create delete instance", e);
            }
        }
        return deleteChange;
    }

    @Override
    public String getName() {
        return Constants.PLUGIN_NAME + " Delete Resource Participant";
    }

    public void addElement(Object element, RefactoringArguments arguments) {
        if (element instanceof IResource == false || ((IResource) element).getType() != IResource.FILE) {
            return;
        }

        IResource resource = (IResource) element;
        try {
            deleteChange.addChangeResource(resource, new NullProgressMonitor());
        } catch (FactoryException e) {
            // catch exception because exceptions cause the participant to become deactivated for future refactorings
            logger.error("Unable to handle resource '" + resource.getProjectRelativePath().toPortableString() + "'",
                    e);
        } catch (CoreException e) {
            String logMessage = Utils.generateCoreExceptionLog(e);
            // catch exception because exceptions cause the participant to become deactivated for future refactorings
            logger.error("Unable to handle resource '" + resource.getProjectRelativePath().toPortableString()
                    + "': " + logMessage, e);
        } catch (InterruptedException e) {
            logger.warn("Operation canceled by user");
        }
    }
}