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

Java tutorial

Introduction

Here is the source code for ca.mcgill.cs.swevo.qualyzer.handlers.DeleteTranscriptHandler.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.TranscriptDeleteDialog;
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.Participant;
import ca.mcgill.cs.swevo.qualyzer.model.Project;
import ca.mcgill.cs.swevo.qualyzer.model.Transcript;

/**
 * Hander for the delete transcript command.
 *
 */
public class DeleteTranscriptHandler extends AbstractHandler implements ITestableHandler {
    private static final String TRANSCRIPT = File.separator + "transcripts" + File.separator; //$NON-NLS-1$

    private final Logger fLogger = LoggerFactory.getLogger(DeleteTranscriptHandler.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<Transcript> toDelete = new ArrayList<Transcript>();
            List<Project> projects = new ArrayList<Project>();
            List<String> conflicts = new ArrayList<String>();
            for (Object element : ((IStructuredSelection) selection).toArray()) {
                if (element instanceof Transcript) {
                    Transcript transcript = (Transcript) element;

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

                    String conflict = checkForConflicts(transcript);
                    if (conflict != null) {
                        conflicts.add(conflict);
                    }
                    toDelete.add(transcript);
                }
            }
            if (projects.size() > 1) {
                String warningMessage = Messages.getString("handlers.DeleteTranscriptHandler.multipleProjects"); //$NON-NLS-1$
                fLogger.warn(warningMessage);
                MessageDialog.openError(shell, Messages.getString("handlers.DeleteTranscriptHandler.deleteFailed"), //$NON-NLS-1$
                        warningMessage);
            } else if (!conflicts.isEmpty()) {
                String message = buildString(conflicts);
                MessageDialog.openError(shell,
                        Messages.getString("handlers.DeleteTranscriptHandler.unableToDelete"), message); //$NON-NLS-1$
            } else {
                proceedWithDeletion(page, shell, toDelete);
            }
        }
        return null;
    }

    /**
     * @param conflicts
     * @return
     */
    private String buildString(List<String> conflicts) {
        String message = Messages.getString("handlers.DeleteTranscriptHandler.conflicts"); //$NON-NLS-1$

        for (String string : conflicts) {
            message += string;
        }

        return message;
    }

    /**
     * Checks that no Memos reference the transcript.
     * @param transcript
     * @return
     */
    private String checkForConflicts(Transcript transcript) {
        String conflict = ""; //$NON-NLS-1$

        for (Memo memo : transcript.getProject().getMemos()) {
            if (transcript.equals(memo.getTranscript())) {
                if (!conflict.isEmpty()) {
                    conflict += "\n"; //$NON-NLS-1$
                }
                conflict += Messages.getString("handlers.DeleteTranscriptHandler.transcript") //$NON-NLS-1$
                        + transcript.getName();
                conflict += Messages.getString("handlers.DeleteTranscriptHandler.memo") + memo.getName(); //$NON-NLS-1$
            }
        }

        return conflict.isEmpty() ? null : conflict;
    }

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

        fTester.execute(dialog);

        if (dialog.getReturnCode() == Window.OK) {
            for (Transcript transcript : toDelete) {
                delete(transcript, dialog.getDeleteCodes(), dialog.getDeleteParticipants(), shell);

                CommonNavigator view;
                view = (CommonNavigator) page.findView(QualyzerActivator.PROJECT_EXPLORER_VIEW_ID);
                view.getCommonViewer().refresh();
            }
        }

    }

    /**
     * @param transcript
     * @param deleteAudio
     * @param deleteCodes
     * @param deleteParticipants
     */
    private void delete(Transcript transcript, boolean deleteCodes, boolean deleteParticipants, Shell shell) {
        Project project = transcript.getProject();
        IProject wProject = ResourcesPlugin.getWorkspace().getRoot().getProject(project.getFolderName());
        ArrayList<Participant> participants = null;
        ArrayList<Code> codes = null;

        if (deleteParticipants) {
            participants = deleteParticipants(transcript);
        }

        if (deleteCodes) {
            codes = deleteCodes(transcript);
        }

        File audioFile = null;
        if (transcript.getAudioFile() != null) {
            audioFile = new File(wProject.getLocation() + transcript.getAudioFile().getRelativePath());
        }

        File file = new File(wProject.getLocation() + TRANSCRIPT + transcript.getFileName());
        if (!file.delete()) {
            String warningMessage = Messages.getString("handlers.DeleteTranscriptHandler.transcriptDeleteFailed"); //$NON-NLS-1$
            fLogger.warn(warningMessage);
            MessageDialog.openWarning(shell, Messages.getString("handlers.DeleteTranscriptHandler.fileAccess"), //$NON-NLS-1$
                    warningMessage);
        }

        Facade.getInstance().deleteTranscript(transcript);
        deleteCodesAndParticipants(codes, participants);

        if (audioFile != null && !audioFile.delete()) {
            String warningMessage = Messages.getString("handlers.DeleteTranscriptHandler.audioDeleteFailed"); //$NON-NLS-1$
            fLogger.warn(warningMessage);
            MessageDialog.openWarning(shell, Messages.getString("handlers.DeleteTranscriptHandler.fileAccess"), //$NON-NLS-1$
                    warningMessage);
        }
    }

    /**
     * @param codes
     * @param participants
     */
    private void deleteCodesAndParticipants(ArrayList<Code> codes, ArrayList<Participant> participants) {
        if (participants != null) {
            for (Participant p : participants) {
                Facade.getInstance().deleteParticipant(p);
            }
        }

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

    }

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

    /**
     * @param transcript
     * @param project
     * @param manager 
     */
    private ArrayList<Participant> deleteParticipants(Transcript transcript) {
        ArrayList<Participant> toDelete = new ArrayList<Participant>();

        Transcript lTranscript = Facade.getInstance().forceTranscriptLoad(transcript);
        Project project = lTranscript.getProject();
        for (Participant participant : lTranscript.getParticipants()) {
            boolean found = false;
            for (Transcript otherTranscript : project.getTranscripts()) {
                if (!otherTranscript.equals(transcript)) {
                    Transcript lOtherTranscript = Facade.getInstance().forceTranscriptLoad(otherTranscript);

                    for (Participant otherParticipant : lOtherTranscript.getParticipants()) {
                        if (otherParticipant.equals(participant)) {
                            found = true;
                            break;
                        }
                    }
                }
            }
            if (!found) {
                toDelete.add(participant);
            }
        }

        return toDelete;
    }

    /* (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;
    }

}