org.eclipse.emf.ecp.navigator.handler.ExportModelHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.ecp.navigator.handler.ExportModelHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 ******************************************************************************/
package org.eclipse.emf.ecp.navigator.handler;

import java.io.File;
import java.io.IOException;
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.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecp.common.util.DialogHandler;
import org.eclipse.emf.ecp.common.util.PreferenceHelper;
import org.eclipse.emf.ecp.common.util.UiUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
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.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;

/**
 * Handles the export of ModelElements from a project.
 */
public class ExportModelHandler extends AbstractHandler {

    private static final String FILE_EXTENSION = "ecm";

    /**
     * These filter names are used to filter which files are displayed.
     */
    public static final String[] FILTER_NAMES = { "EMFStore Project Files (*." + FILE_EXTENSION + ")",
            "All Files (*.*)" };

    /**
     * These filter extensions are used to filter which files are displayed.
     */
    public static final String[] FILTER_EXTS = { "*." + FILE_EXTENSION + ", *.*" };

    private static final String EXPORT_MODEL_PATH = "org.eclipse.emf.emfstore.client.ui.exportModelPath";

    /**
     * {@inheritDoc}
     * 
     * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent)
     */
    public Object execute(ExecutionEvent event) throws ExecutionException {

        final List<EObject> exportModelElements = getSelfContainedModelElementTree(event);

        if (exportModelElements.size() > 0) {

            String filePath = getFilePathByFileDialog(UiUtil.getNameForModelElement(exportModelElements.get(0)));

            if (filePath == null) {
                return null;
            }

            PreferenceHelper.setPreference(EXPORT_MODEL_PATH, new File(filePath).getParent());

            runCommand(exportModelElements, filePath);

        }

        return null;
    }

    private void runCommand(final List<EObject> exportModelElements, String filePath) {
        final File file = new File(filePath);

        final URI uri = URI.createFileURI(filePath);

        final ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(
                PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());

        progressDialog.open();
        progressDialog.getProgressMonitor().beginTask("Export modelelement...", 100);
        progressDialog.getProgressMonitor().worked(10);

        try {
            saveEObjectToResource(exportModelElements, uri);
        } catch (IOException e) {
            DialogHandler.showExceptionDialog(e.getMessage(), e);
        }
        progressDialog.getProgressMonitor().done();
        progressDialog.close();

        MessageDialog.openInformation(null, "Export", "Exported modelelement to file " + file.getName());
    }

    private List<EObject> getSelfContainedModelElementTree(ExecutionEvent event) {
        List<EObject> result = new ArrayList<EObject>();

        ISelection selection = HandlerUtil.getCurrentSelection(event);
        IStructuredSelection strucSel = null;
        EObject copyModelElement = null;

        if (selection != null && selection instanceof IStructuredSelection) {
            strucSel = (IStructuredSelection) selection;
            Object firstElement = strucSel.getFirstElement();
            if (firstElement instanceof EObject) {
                // TODO: ChainSaw - check whether specific clone functionality of ModelUtil is needed here
                copyModelElement = EcoreUtil.copy((EObject) firstElement);
                // copyModelElement = ModelUtil.clone((EObject) firstElement);

                // only export the rootnode makes xml with references, otherwise (see (commented) line two) the children
                // will be "real" nested as containments of the node (is not necessary)
                result.add(copyModelElement);
                // result.addAll(copyModelElement.getAllContainedModelElements());

            } else {
                // do nothing System.out.println("NOT A MODELELEMENT");
            }
        }

        return result;
    }

    private String getFilePathByFileDialog(String modelElementName) {
        FileDialog dialog = new FileDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                SWT.SAVE);
        dialog.setFilterNames(FILTER_NAMES);
        dialog.setFilterExtensions(FILTER_EXTS);
        String initialPath = PreferenceHelper.getPreference(EXPORT_MODEL_PATH, System.getProperty("user.home"));
        dialog.setFilterPath(initialPath);
        dialog.setOverwrite(true);

        try {
            // String initialFileName = projectSpace.getProjectName() + "@"
            // + projectSpace.getBaseVersion().getIdentifier() + ".ucp";
            String initialFileName = "ModelElement_" + modelElementName + "." + FILE_EXTENSION;
            dialog.setFileName(initialFileName);

        } catch (NullPointerException e) {
            // do nothing
        }

        String filePath = dialog.open();

        return filePath;
    }

    /**
     * Save a list of EObjects to the resource with the given URI.
     * 
     * @param eObjects the EObjects to be saved
     * @param resourceURI the URI of the resource, which should be used to save the EObjects
     * @throws IOException if saving to the resource fails
     */
    public void saveEObjectToResource(List<? extends EObject> eObjects, URI resourceURI) throws IOException {
        ResourceSet resourceSet = new ResourceSetImpl();
        Resource resource = resourceSet.createResource(resourceURI);
        EList<EObject> contents = resource.getContents();

        for (EObject eObject : eObjects) {
            contents.add(eObject);
        }

        contents.addAll(eObjects);
        resource.save(null);
    }

    /**
     * Save an EObject to a resource.
     * 
     * @param eObject the object
     * @param resourceURI the resources URI
     * @throws IOException if saving to the resource fails.
     */
    public void saveEObjectToResource(EObject eObject, URI resourceURI) throws IOException {
        ArrayList<EObject> list = new ArrayList<EObject>();
        list.add(eObject);
        saveEObjectToResource(list, resourceURI);
    }
}