ca.mcgill.cs.swevo.qualyzer.handlers.DeleteMemoHandler.java Source code

Java tutorial

Introduction

Here is the source code for ca.mcgill.cs.swevo.qualyzer.handlers.DeleteMemoHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2010 McGill University
 * 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:
 *     Jonathan Faubert
 *******************************************************************************/
package ca.mcgill.cs.swevo.qualyzer.handlers;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.navigator.CommonNavigator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ca.mcgill.cs.swevo.qualyzer.QualyzerActivator;
import ca.mcgill.cs.swevo.qualyzer.dialogs.MemoDeleteDialog;
import ca.mcgill.cs.swevo.qualyzer.editors.IDialogTester;
import ca.mcgill.cs.swevo.qualyzer.editors.NullTester;
import ca.mcgill.cs.swevo.qualyzer.model.Code;
import ca.mcgill.cs.swevo.qualyzer.model.CodeEntry;
import ca.mcgill.cs.swevo.qualyzer.model.Facade;
import ca.mcgill.cs.swevo.qualyzer.model.Fragment;
import ca.mcgill.cs.swevo.qualyzer.model.Memo;
import ca.mcgill.cs.swevo.qualyzer.model.Project;
import ca.mcgill.cs.swevo.qualyzer.model.Transcript;

/**
 * Verifies that the memos can be deleted and then prompts for confirmation and deletes them.
 *
 */
public class DeleteMemoHandler extends AbstractHandler implements ITestableHandler {
    private static final String MEMO = File.separator + "memos" + File.separator; //$NON-NLS-1$
    private final Logger fLogger = LoggerFactory.getLogger(DeleteMemoHandler.class);
    private IDialogTester fTester = new NullTester();
    private boolean fTesting = false;

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        CommonNavigator view = (CommonNavigator) page.findView(QualyzerActivator.PROJECT_EXPLORER_VIEW_ID);
        ISelection selection = view.getCommonViewer().getSelection();
        Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();

        if (selection != null && selection instanceof IStructuredSelection) {
            List<Memo> toDelete = new ArrayList<Memo>();
            List<Project> projects = new ArrayList<Project>();

            for (Object element : ((IStructuredSelection) selection).toArray()) {
                if (element instanceof Memo) {
                    Memo memo = (Memo) element;

                    if (!projects.contains(memo.getProject())) {
                        projects.add(memo.getProject());
                    }

                    toDelete.add(memo);
                }
            }

            if (projects.size() > 1) {
                String warningMessage = Messages.getString("handlers.DeleteMemoHandler.tooManyProjects"); //$NON-NLS-1$
                fLogger.warn(warningMessage);
                MessageDialog.openError(shell, Messages.getString("handlers.DeleteMemoHandler.unableToDelete"), //$NON-NLS-1$
                        warningMessage);
            } else {
                proceedWithDeletion(page, shell, toDelete);
            }
        }
        return null;
    }

    /**
     * @param page
     * @param shell
     * @param toDelete
     */
    private void proceedWithDeletion(IWorkbenchPage page, Shell shell, List<Memo> toDelete) {
        MemoDeleteDialog dialog = new MemoDeleteDialog(shell, toDelete.size() > 1);
        dialog.create();
        dialog.setBlockOnOpen(!fTesting);
        dialog.open();
        fTester.execute(dialog);

        if (dialog.getReturnCode() == Window.OK) {
            CommonNavigator view;
            view = (CommonNavigator) page.findView(QualyzerActivator.PROJECT_EXPLORER_VIEW_ID);

            for (Memo memo : toDelete) {
                delete(memo, shell, dialog.deleteCodes());
                view.getCommonViewer().refresh();
            }

            view.getCommonViewer().refresh();
        }
    }

    /**
     * @param memo
     * @param shell
     */
    private void delete(Memo memo, Shell shell, boolean deleteCodes) {
        Project project = memo.getProject();
        IProject wProject = ResourcesPlugin.getWorkspace().getRoot().getProject(project.getFolderName());

        File file = new File(wProject.getLocation() + MEMO + memo.getFileName());
        if (!file.delete()) {
            String warningMessage = Messages.getString("handlers.DeleteMemoHandler.deleteFailed"); //$NON-NLS-1$
            fLogger.warn(warningMessage);
            MessageDialog.openWarning(shell, Messages.getString("handlers.DeleteMemoHandler.fileError"), //$NON-NLS-1$
                    warningMessage);
        }

        ArrayList<Code> codes = null;
        if (deleteCodes) {
            codes = findCodesToDelete(memo);
        }

        Facade.getInstance().deleteMemo(memo);

        if (codes != null) {
            for (Code code : codes) {
                Facade.getInstance().deleteCode(code);
            }
        }
    }

    /**
     * @param memo
     * @return
     */
    private ArrayList<Code> findCodesToDelete(Memo memo) {
        ArrayList<Code> codes = new ArrayList<Code>();
        Memo lMemo = Facade.getInstance().forceMemoLoad(memo);
        Project project = lMemo.getProject();
        for (Fragment fragment : lMemo.getFragments().values()) {
            for (CodeEntry entry : fragment.getCodeEntries()) {
                Code code = entry.getCode();
                if (!codes.contains(code)) {
                    codes.add(code);
                }
            }
        }
        for (Transcript transcript : project.getTranscripts()) {
            Transcript lTrans = Facade.getInstance().forceTranscriptLoad(transcript);
            for (Fragment fragment : lTrans.getFragments().values()) {
                for (CodeEntry entry : fragment.getCodeEntries()) {
                    Code code = entry.getCode();
                    if (codes.contains(code)) {
                        codes.remove(code);
                    }
                }
            }
        }
        for (Memo pMemo : project.getMemos()) {
            if (!pMemo.equals(memo)) {
                Memo lMem = Facade.getInstance().forceMemoLoad(pMemo);
                for (Fragment fragment : lMem.getFragments().values()) {
                    for (CodeEntry entry : fragment.getCodeEntries()) {
                        Code code = entry.getCode();
                        if (codes.contains(code)) {
                            codes.remove(code);
                        }
                    }
                }
            }
        }
        return codes;
    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.handlers.ITestableHandler#getTester()
     */
    @Override
    public IDialogTester getTester() {
        return fTester;
    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.handlers.ITestableHandler#isWindowsBlock()
     */
    @Override
    public boolean isTesting() {
        return fTesting;
    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.handlers.ITestableHandler#setTester(
     * ca.mcgill.cs.swevo.qualyzer.editors.IDialogTester)
     */
    @Override
    public void setTester(IDialogTester tester) {
        fTester = tester;
    }

    /* (non-Javadoc)
     * @see ca.mcgill.cs.swevo.qualyzer.handlers.ITestableHandler#setWindowsBlock(boolean)
     */
    @Override
    public void setTesting(boolean windowsBlock) {
        fTesting = windowsBlock;
    }

}