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

Java tutorial

Introduction

Here is the source code for ca.mcgill.cs.swevo.qualyzer.handlers.ExportCodesHandler.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.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;

import ca.mcgill.cs.swevo.qualyzer.QualyzerException;
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;
import ca.mcgill.cs.swevo.qualyzer.providers.WrapperCode;

/**
 * 
 *
 */
public class ExportCodesHandler extends AbstractHandler {

    /**
     * 
     */
    private static final String CSV = ".csv"; //$NON-NLS-1$
    /**
     * 
     */
    private static final String COMMA = ","; //$NON-NLS-1$

    /* (non-Javadoc)
     * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
     */
    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
        ISelection selection = page.getSelection();

        if (selection != null && selection instanceof IStructuredSelection) {
            IStructuredSelection structured = (IStructuredSelection) selection;
            Object element = structured.getFirstElement();

            if (element instanceof WrapperCode) {
                Project project = ((WrapperCode) element).getProject();
                Facade facade = Facade.getInstance();

                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();

                FileDialog dialog = new FileDialog(shell, SWT.SAVE);
                dialog.setText(Messages.getString("handlers.ExportCodesHandler.exportDestination")); //$NON-NLS-1$
                dialog.setFilterExtensions(new String[] { "*.csv" }); //$NON-NLS-1$
                String fileName = dialog.open();

                if (fileName != null) {
                    int index = fileName.indexOf('.');
                    if (index == -1 || !fileName.substring(index).equals(CSV)) {
                        fileName += CSV;
                    }

                    Map<String, List<String>> documentMap = new HashMap<String, List<String>>();
                    Map<String, List<Integer>> freqMap = new HashMap<String, List<Integer>>();
                    Map<String, String> codeMap = buildCodeMap(project);

                    detectDocuments(project, facade, documentMap, freqMap);
                    StringBuilder buffer = buildStringBuilder(documentMap, freqMap, codeMap);

                    writeFile(shell, fileName, buffer);
                }
            }
        }
        return null;
    }

    /**
     * Does something.
     *
     * @param project
     * @return
     */
    private Map<String, String> buildCodeMap(Project project) {
        Map<String, String> codeMap = new HashMap<String, String>();
        for (Code code : project.getCodes()) {
            codeMap.put(code.getCodeName(), code.getDescription());
        }
        return codeMap;
    }

    /**
     * @param shell
     * @param fileName
     * @param buffer
     */
    private void writeFile(Shell shell, String fileName, StringBuilder buffer) {
        File file = new File(fileName);
        FileWriter writer = null;
        try {
            writer = new FileWriter(file);
            writer.write(buffer.toString());
            MessageDialog.openInformation(shell, Messages.getString("handlers.ExportCodesHandler.exportSucessful"), //$NON-NLS-1$
                    Messages.getString("handlers.ExportCodesHandler.exportMessage") + fileName);
        } catch (IOException e) {
            throw new QualyzerException(Messages.getString("handlers.ExportCodesHandler.writeFailed")); //$NON-NLS-1$
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                throw new QualyzerException(Messages.getString("handlers.ExportCodesHandler.closeFailed")); //$NON-NLS-1$
            }
        }
    }

    /**
     * @param transcriptMap
     * @param freqMap
     * @return
     */
    private StringBuilder buildStringBuilder(Map<String, List<String>> transcriptMap,
            Map<String, List<Integer>> freqMap, Map<String, String> codeMap) {
        StringBuilder builder = new StringBuilder();
        for (String codeName : transcriptMap.keySet()) {
            int totalFreq = sum(freqMap.get(codeName));
            builder.append(codeName);
            builder.append(COMMA);
            builder.append(codeMap.get(codeName));
            builder.append(COMMA);
            builder.append(totalFreq);
            builder.append(COMMA);
            List<String> transcripts = transcriptMap.get(codeName);
            List<Integer> frequencies = freqMap.get(codeName);

            for (int i = 0; i < transcripts.size(); i++) {
                String transcriptName = transcripts.get(i);
                Integer frequency = frequencies.get(i);
                builder.append(transcriptName + COMMA + frequency + COMMA);
            }
            builder.append("\n"); //$NON-NLS-1$
        }
        return builder;
    }

    /**
     * @param project
     * @param facade
     * @param documentMap
     * @param freqMap
     */
    private void detectDocuments(Project project, Facade facade, Map<String, List<String>> documentMap,
            Map<String, List<Integer>> freqMap) {
        for (Code code : project.getCodes()) {
            List<String> documents = new ArrayList<String>();
            List<Integer> frequencies = new ArrayList<Integer>();

            detectTranscripts(project, facade, code, documents, frequencies);

            detectMemos(project, facade, code, documents, frequencies);

            documentMap.put(code.getCodeName(), documents);
            freqMap.put(code.getCodeName(), frequencies);
        }
    }

    /**
     * @param project
     * @param facade
     * @param code
     * @param documents
     * @param frequencies
     */
    private void detectMemos(Project project, Facade facade, Code code, List<String> documents,
            List<Integer> frequencies) {
        for (Memo memo : project.getMemos()) {
            Memo lMemo = facade.forceMemoLoad(memo);
            int freq = 0;

            for (Fragment fragment : lMemo.getFragments().values()) {
                for (CodeEntry entry : fragment.getCodeEntries()) {
                    if (entry.getCode().equals(code)) {
                        freq++;
                        break;
                    }
                }
            }

            if (freq > 0) {
                documents.add(Messages.getString("handlers.ExportCodesHandler.memo") + memo.getName()); //$NON-NLS-1$
                frequencies.add(freq);
            }
        }
    }

    /**
     * @param project
     * @param facade
     * @param code
     * @param documents
     * @param frequencies
     */
    private void detectTranscripts(Project project, Facade facade, Code code, List<String> documents,
            List<Integer> frequencies) {
        for (Transcript transcript : project.getTranscripts()) {
            Transcript lTranscript = facade.forceTranscriptLoad(transcript);
            int freq = 0;

            for (Fragment fragment : lTranscript.getFragments().values()) {
                for (CodeEntry entry : fragment.getCodeEntries()) {
                    if (entry.getCode().equals(code)) {
                        freq++;
                        break;
                    }
                }
            }

            if (freq > 0) {
                documents.add(Messages.getString("handlers.ExportCodesHandler.transcript") + //$NON-NLS-1$
                        transcript.getName());
                frequencies.add(freq);
            }
        }
    }

    /**
     * @param list
     * @return
     */
    private int sum(List<Integer> list) {
        int sum = 0;

        for (Integer val : list) {
            sum += val;
        }

        return sum;
    }

}