com.archimatetool.csv.CSVExporter.java Source code

Java tutorial

Introduction

Here is the source code for com.archimatetool.csv.CSVExporter.java

Source

/**
 * This program and the accompanying materials
 * are made available under the terms of the License
 * which accompanies this distribution in the file LICENSE.txt
 */
package com.archimatetool.csv;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;

import com.archimatetool.editor.model.IModelExporter;
import com.archimatetool.editor.utils.StringUtils;
import com.archimatetool.model.FolderType;
import com.archimatetool.model.IArchimateElement;
import com.archimatetool.model.IArchimateModel;
import com.archimatetool.model.IFolder;
import com.archimatetool.model.INameable;
import com.archimatetool.model.IRelationship;

/**
 * Export Model to CSV
 * 
 * @author Phillip Beauvoir
 */
public class CSVExporter implements IModelExporter {

    private OutputStreamWriter writer;

    @Override
    public void export(IArchimateModel model) throws IOException {
        File file = askSaveFile();
        if (file == null) {
            return;
        }

        writer = new OutputStreamWriter(new FileOutputStream(file));

        writeHeader();

        writeFolder(model.getFolder(FolderType.BUSINESS));
        writeFolder(model.getFolder(FolderType.APPLICATION));
        writeFolder(model.getFolder(FolderType.TECHNOLOGY));
        writeFolder(model.getFolder(FolderType.MOTIVATION));
        writeFolder(model.getFolder(FolderType.IMPLEMENTATION_MIGRATION));
        writeFolder(model.getFolder(FolderType.CONNECTORS));
        writeFolder(model.getFolder(FolderType.RELATIONS));

        writer.close();
    }

    private void writeHeader() throws IOException {
        writer.write(Messages.CSVExporter_0);
    }

    private void writeFolder(IFolder folder) throws IOException {
        List<EObject> list = new ArrayList<EObject>();
        getElements(folder, list);

        sort(list);

        for (EObject eObject : list) {
            if (eObject instanceof IArchimateElement) {
                IArchimateElement element = (IArchimateElement) eObject;
                String name = normalise(element.getName());
                String s = "\"" + element.eClass().getName() + "\"," + "\"" + name + "\"," + "\"" //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$//$NON-NLS-5$
                        + normalise(element.getDocumentation() + "\","); //$NON-NLS-1$
                if (eObject instanceof IRelationship) {
                    IRelationship relationship = (IRelationship) eObject;
                    s += "\"" + relationship.getSource().eClass().getName() + "\","; //$NON-NLS-1$ //$NON-NLS-2$
                    s += "\"" + relationship.getSource().getName() + "\","; //$NON-NLS-1$ //$NON-NLS-2$
                    s += "\"" + relationship.getTarget().eClass().getName() + "\","; //$NON-NLS-1$ //$NON-NLS-2$
                    s += "\"" + relationship.getTarget().getName() + "\","; //$NON-NLS-1$ //$NON-NLS-2$
                } else {
                    s += "\"\",\"\",\"\",\"\""; //$NON-NLS-1$
                }
                writer.write(s + "\n"); //$NON-NLS-1$
            }
        }
    }

    private String normalise(String s) {
        if (s == null) {
            return ""; //$NON-NLS-1$
        }

        s = s.replaceAll("(\r\n|\r|\n|\t)", " "); //$NON-NLS-1$ //$NON-NLS-2$

        return s;
    }

    private void getElements(IFolder folder, List<EObject> list) {
        for (EObject object : folder.getElements()) {
            list.add(object);
        }

        for (IFolder f : folder.getFolders()) {
            getElements(f, list);
        }
    }

    private void sort(List<EObject> list) {
        if (list.isEmpty()) {
            return;
        }

        Collections.sort(list, new Comparator<EObject>() {
            @Override
            public int compare(EObject o1, EObject o2) {
                if (o1.eClass().equals(o2.eClass())) {
                    if (o1 instanceof INameable && o2 instanceof INameable) {
                        String name1 = StringUtils.safeString(((INameable) o1).getName()).toLowerCase().trim();
                        String name2 = StringUtils.safeString(((INameable) o2).getName()).toLowerCase().trim();
                        return name1.compareTo(name2);
                    }
                }
                String name1 = o1.eClass().getName().toLowerCase();
                String name2 = o2.eClass().getName().toLowerCase();
                return name1.compareTo(name2);
            }
        });
    }

    /**
     * Ask user for file name to save to
     */
    private File askSaveFile() {
        FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.SAVE);
        dialog.setText(Messages.CSVExporter_1);
        dialog.setFilterExtensions(new String[] { "*.csv", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
        String path = dialog.open();
        if (path == null) {
            return null;
        }

        // Only Windows adds the extension by default
        if (dialog.getFilterIndex() == 0 && !path.endsWith(".csv")) { //$NON-NLS-1$
            path += ".csv"; //$NON-NLS-1$
        }

        File file = new File(path);

        // Make sure the file does not already exist
        if (file.exists()) {
            boolean result = MessageDialog.openQuestion(Display.getCurrent().getActiveShell(),
                    Messages.CSVExporter_1, NLS.bind(Messages.CSVExporter_2, file));
            if (!result) {
                return null;
            }
        }

        return file;
    }
}