es.cv.gvcase.mdt.db.diagram.part.SqlmodelDiagramEditorUtil.java Source code

Java tutorial

Introduction

Here is the source code for es.cv.gvcase.mdt.db.diagram.part.SqlmodelDiagramEditorUtil.java

Source

/***************************************************************************
 * Copyright (c) 2007 Conselleria de Infraestructuras y Transporte,
 * Generalitat de la Comunitat Valenciana . 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: Mario Cervera Ubeda (Integranova)
 *
 ******************************************************************************/
package es.cv.gvcase.mdt.db.diagram.part;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.datatools.modelbase.sql.schema.Database;
import org.eclipse.datatools.modelbase.sql.schema.SQLSchemaFactory;
import org.eclipse.datatools.modelbase.sql.schema.Schema;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EcoreFactory;
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.xmi.XMLResource;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.common.core.util.Log;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;

import es.cv.gvcase.mdt.common.model.ModelInitializerRegistry;
import es.cv.gvcase.mdt.common.part.MOSKittMultiPageEditor;
import es.cv.gvcase.mdt.common.provider.IMOSKittEditorFactory;
import es.cv.gvcase.mdt.common.util.DiagramEditPartsUtil;
import es.cv.gvcase.mdt.common.util.MDTUtil;
import es.cv.gvcase.mdt.db.diagram.edit.parts.SchemaEditPart;

/**
 * @generated
 */
public class SqlmodelDiagramEditorUtil implements IMOSKittEditorFactory {

    /**
     * @generated NOT
     */
    public static Map getSaveOptions() {
        Map saveOptions = new HashMap();
        saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
        saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);

        saveOptions.put(XMLResource.OPTION_PROCESS_DANGLING_HREF, "DISCARD");

        return saveOptions;
    }

    /**
     * @generated
     */
    public boolean providesFor(Object object) {
        return true;
    }

    /**
     * @generated
     */
    public IEditorPart createEditorFor(Object object) {
        return new SqlmodelDiagramEditor();
    }

    /**
     * @generated
     */
    public static boolean openDiagram(Resource diagram) throws PartInitException {
        String path = diagram.getURI().toPlatformString(true);
        IResource workspaceResource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
        if (workspaceResource instanceof IFile) {
            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            return null != page.openEditor(new FileEditorInput((IFile) workspaceResource),
                    MOSKittMultiPageEditor.MOSKittMultiPageEditorID);
        }
        return false;
    }

    /**
     * @generated
     */
    public static void setCharset(IFile file) {
        if (file == null) {
            return;
        }
        try {
            file.setCharset("UTF-8", new NullProgressMonitor()); //$NON-NLS-1$
        } catch (CoreException e) {
            SqlmodelDiagramEditorPlugin.getInstance()
                    .logError("Unable to set charset for file " + file.getFullPath(), e); //$NON-NLS-1$
        }
    }

    /**
     * @generated
     */
    public static String getUniqueFileName(IPath containerFullPath, String fileName, String extension) {
        if (containerFullPath == null) {
            containerFullPath = new Path(""); //$NON-NLS-1$
        }
        if (fileName == null || fileName.trim().length() == 0) {
            fileName = "default"; //$NON-NLS-1$
        }
        IPath filePath = containerFullPath.append(fileName);
        if (extension != null && !extension.equals(filePath.getFileExtension())) {
            filePath = filePath.addFileExtension(extension);
        }
        extension = filePath.getFileExtension();
        fileName = filePath.removeFileExtension().lastSegment();
        int i = 1;
        while (ResourcesPlugin.getWorkspace().getRoot().exists(filePath)) {
            i++;
            filePath = containerFullPath.append(fileName + i);
            if (extension != null) {
                filePath = filePath.addFileExtension(extension);
            }
        }
        return filePath.lastSegment();
    }

    /**
     * @generated NOT ; modified to create a Database element as root and a
     *            Schema as child. The schema will be the canvas element
     */
    public static Resource createModel(URI modelURI, IProgressMonitor progressMonitor) {
        TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain();
        progressMonitor.beginTask("Create Model", 1);

        final Resource modelResource = editingDomain.getResourceSet().createResource(modelURI);

        AbstractTransactionalCommand command = new AbstractTransactionalCommand(editingDomain, "Create Model",
                Collections.EMPTY_LIST) {
            @Override
            protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
                    throws ExecutionException {

                Database rootElement = createRootElement();
                rootElement.setName("Database");
                rootElement.setVendor("Generic JDBC");
                rootElement.setVersion("1.0");

                Schema model = createInitialModel();

                model.setName("Schema");
                rootElement.getSchemas().add(model);
                model.setDatabase(rootElement);

                // attaching model will import default elements
                // those imported elements must be included in the EAnnotation
                // that references elements to be shown
                // attachModelToResource(model, modelResource);

                attachDatabaseToResource(rootElement, modelResource);

                try {
                    modelResource.save(getSaveOptions());
                } catch (IOException e) {
                    Log.error(null, 0, "Unable to store modelresource", e);
                }

                return CommandResult.newOKCommandResult();
            }
        };

        try {
            OperationHistoryFactory.getOperationHistory().execute(command,
                    new SubProgressMonitor(progressMonitor, 1), null);
        } catch (ExecutionException e) {
            Log.error(null, 0, "Unable to create model", e);
        }

        setCharset(WorkspaceSynchronizer.getFile(modelResource));

        return modelResource;
    }

    /**
     * Runs the wizard in a dialog.
     * 
     * @generated
     */
    public static void runWizard(Shell shell, Wizard wizard, String settingsKey) {
        IDialogSettings pluginDialogSettings = SqlmodelDiagramEditorPlugin.getInstance().getDialogSettings();
        IDialogSettings wizardDialogSettings = pluginDialogSettings.getSection(settingsKey);
        if (wizardDialogSettings == null) {
            wizardDialogSettings = pluginDialogSettings.addNewSection(settingsKey);
        }
        wizard.setDialogSettings(wizardDialogSettings);
        WizardDialog dialog = new WizardDialog(shell, wizard);
        dialog.create();
        dialog.getShell().setSize(Math.max(500, dialog.getShell().getSize().x),
                Math.max(500, dialog.getShell().getSize().y));
        dialog.open();
    }

    /**
     * This method should be called within a workspace modify operation since it
     * creates resources.
     * 
     * @generated NOT
     */
    public static Resource createDiagram(URI diagramURI, EObject model, IProgressMonitor progressMonitor) {

        if (model instanceof Database) {
            if (((Database) model).getSchemas().size() > 0) {
                model = ((Database) model).getSchemas().get(0);
            }
        }

        TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(model);
        if (editingDomain == null) {
            editingDomain = TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain();
        }
        progressMonitor.beginTask(Messages.SqlmodelDiagramEditorUtil_CreateDiagramProgressTask, 3);
        final Resource diagramResource = editingDomain.getResourceSet().createResource(diagramURI);
        final String diagramName = diagramURI.lastSegment();
        final EObject modelElement = model;
        AbstractTransactionalCommand command = new AbstractTransactionalCommand(editingDomain,
                Messages.SqlmodelDiagramEditorUtil_CreateDiagramCommandLabel, Collections.EMPTY_LIST) {
            protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
                    throws ExecutionException {

                Diagram diagram = ViewService.createDiagram(modelElement, SchemaEditPart.MODEL_ID,
                        SqlmodelDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
                if (diagram != null) {
                    diagramResource.getContents().add(diagram);
                    diagram.setName(diagramName);
                    diagram.setElement(modelElement);

                    // This will add the version of the editor that will edit
                    // the diagram
                    MDTUtil.addDiagramVersion(diagram, MDTUtil.getBundleVersion(SqlmodelDiagramEditorPlugin.ID));
                }

                try {
                    diagramResource
                            .save(es.cv.gvcase.mdt.db.diagram.part.SqlmodelDiagramEditorUtil.getSaveOptions());
                } catch (IOException e) {

                    SqlmodelDiagramEditorPlugin.getInstance().logError("Unable to store diagram resources", e); //$NON-NLS-1$
                }
                return CommandResult.newOKCommandResult();
            }
        };
        try {
            OperationHistoryFactory.getOperationHistory().execute(command,
                    new SubProgressMonitor(progressMonitor, 1), null);
        } catch (ExecutionException e) {
            SqlmodelDiagramEditorPlugin.getInstance().logError("Unable to create diagram", e); //$NON-NLS-1$
        }
        setCharset(WorkspaceSynchronizer.getFile(diagramResource));
        return diagramResource;
    }

    /**
     * Associate diagram to view.
     * 
     * @param diagram
     *            the diagram
     */
    private static void associateDiagramToView(Diagram diagram, EObject element) {
        EAnnotation eAnnotation = diagram.getEAnnotation(DiagramEditPartsUtil.DiagramsRelatedToElement);
        if (eAnnotation == null) {
            eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
            eAnnotation.setSource(DiagramEditPartsUtil.DiagramsRelatedToElement);
            diagram.getEAnnotations().add(eAnnotation);
        }
        eAnnotation.getReferences().add(element);
    }

    /**
     * Create a new instance of domain element associated with canvas. <!--
     * begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    private static Schema createInitialModel() {
        Schema model = SQLSchemaFactory.eINSTANCE.createSchema();
        model = (Schema) ModelInitializerRegistry.getInstance().init(SchemaEditPart.MODEL_ID, model);
        return model;
    }

    /**
     * Create the instance of the root element which the domain element will be
     * associated to. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @NOT-generated
     */
    private static Database createRootElement() {
        return SQLSchemaFactory.eINSTANCE.createDatabase();
    }

    /**
     * Store database element in the resource. <!-- begin-user-doc --> <!--
     * end-user-doc -->
     * 
     * @NOT-generated
     */
    private static void attachDatabaseToResource(Database db, Resource resource) {
        resource.getContents().add(db);
    }

    /**
     * Store model element in the resource. <!-- begin-user-doc --> <!--
     * end-user-doc -->
     * 
     * @generated
     */
    private static void attachModelToResource(Schema model, Resource resource) {
        resource.getContents().add(model);
    }

    /**
     * @generated
     */
    public static void selectElementsInDiagram(IDiagramWorkbenchPart diagramPart, List/* EditPart */ editParts) {
        diagramPart.getDiagramGraphicalViewer().deselectAll();

        EditPart firstPrimary = null;
        for (Iterator it = editParts.iterator(); it.hasNext();) {
            EditPart nextPart = (EditPart) it.next();
            diagramPart.getDiagramGraphicalViewer().appendSelection(nextPart);
            if (firstPrimary == null && nextPart instanceof IPrimaryEditPart) {
                firstPrimary = nextPart;
            }
        }

        if (!editParts.isEmpty()) {
            diagramPart.getDiagramGraphicalViewer()
                    .reveal(firstPrimary != null ? firstPrimary : (EditPart) editParts.get(0));
        }
    }

    /**
     * @generated
     */
    private static int findElementsInDiagramByID(DiagramEditPart diagramPart, EObject element,
            List editPartCollector) {
        IDiagramGraphicalViewer viewer = (IDiagramGraphicalViewer) diagramPart.getViewer();
        final int intialNumOfEditParts = editPartCollector.size();

        if (element instanceof View) { // support notation element lookup
            EditPart editPart = (EditPart) viewer.getEditPartRegistry().get(element);
            if (editPart != null) {
                editPartCollector.add(editPart);
                return 1;
            }
        }

        String elementID = EMFCoreUtil.getProxyID(element);
        List associatedParts = viewer.findEditPartsForElement(elementID, IGraphicalEditPart.class);
        // perform the possible hierarchy disjoint -> take the top-most parts
        // only
        for (Iterator editPartIt = associatedParts.iterator(); editPartIt.hasNext();) {
            EditPart nextPart = (EditPart) editPartIt.next();
            EditPart parentPart = nextPart.getParent();
            while (parentPart != null && !associatedParts.contains(parentPart)) {
                parentPart = parentPart.getParent();
            }
            if (parentPart == null) {
                editPartCollector.add(nextPart);
            }
        }

        if (intialNumOfEditParts == editPartCollector.size()) {
            if (!associatedParts.isEmpty()) {
                editPartCollector.add(associatedParts.iterator().next());
            } else {
                if (element.eContainer() != null) {
                    return findElementsInDiagramByID(diagramPart, element.eContainer(), editPartCollector);
                }
            }
        }
        return editPartCollector.size() - intialNumOfEditParts;
    }

    /**
     * @generated
     */
    public static View findView(DiagramEditPart diagramEditPart, EObject targetElement,
            LazyElement2ViewMap lazyElement2ViewMap) {
        boolean hasStructuralURI = false;
        if (targetElement.eResource() instanceof XMLResource) {
            hasStructuralURI = ((XMLResource) targetElement.eResource()).getID(targetElement) == null;
        }

        View view = null;
        if (hasStructuralURI && !lazyElement2ViewMap.getElement2ViewMap().isEmpty()) {
            view = (View) lazyElement2ViewMap.getElement2ViewMap().get(targetElement);
        } else if (findElementsInDiagramByID(diagramEditPart, targetElement,
                lazyElement2ViewMap.editPartTmpHolder) > 0) {
            EditPart editPart = (EditPart) lazyElement2ViewMap.editPartTmpHolder.get(0);
            lazyElement2ViewMap.editPartTmpHolder.clear();
            view = editPart.getModel() instanceof View ? (View) editPart.getModel() : null;
        }

        return (view == null) ? diagramEditPart.getDiagramView() : view;
    }

    /**
     * @generated
     */
    public static class LazyElement2ViewMap {
        /**
         * @generated
         */
        private Map element2ViewMap;

        /**
         * @generated
         */
        private View scope;

        /**
         * @generated
         */
        private Set elementSet;

        /**
         * @generated
         */
        public final List editPartTmpHolder = new ArrayList();

        /**
         * @generated
         */
        public LazyElement2ViewMap(View scope, Set elements) {
            this.scope = scope;
            this.elementSet = elements;
        }

        /**
         * @generated
         */
        public final Map getElement2ViewMap() {
            if (element2ViewMap == null) {
                element2ViewMap = new HashMap();
                // map possible notation elements to itself as these can't be
                // found by view.getElement()
                for (Iterator it = elementSet.iterator(); it.hasNext();) {
                    EObject element = (EObject) it.next();
                    if (element instanceof View) {
                        View view = (View) element;
                        if (view.getDiagram() == scope.getDiagram()) {
                            element2ViewMap.put(element, element); // take only
                            // those
                            // that part
                            // of our
                            // diagram
                        }
                    }
                }

                buildElement2ViewMap(scope, element2ViewMap, elementSet);
            }
            return element2ViewMap;
        }

        /**
         * @generated
         */
        static Map buildElement2ViewMap(View parentView, Map element2ViewMap, Set elements) {
            if (elements.size() == element2ViewMap.size())
                return element2ViewMap;

            if (parentView.isSetElement() && !element2ViewMap.containsKey(parentView.getElement())
                    && elements.contains(parentView.getElement())) {
                element2ViewMap.put(parentView.getElement(), parentView);
                if (elements.size() == element2ViewMap.size())
                    return element2ViewMap;
            }

            for (Iterator it = parentView.getChildren().iterator(); it.hasNext();) {
                buildElement2ViewMap((View) it.next(), element2ViewMap, elements);
                if (elements.size() == element2ViewMap.size())
                    return element2ViewMap;
            }
            for (Iterator it = parentView.getSourceEdges().iterator(); it.hasNext();) {
                buildElement2ViewMap((View) it.next(), element2ViewMap, elements);
                if (elements.size() == element2ViewMap.size())
                    return element2ViewMap;
            }
            for (Iterator it = parentView.getSourceEdges().iterator(); it.hasNext();) {
                buildElement2ViewMap((View) it.next(), element2ViewMap, elements);
                if (elements.size() == element2ViewMap.size())
                    return element2ViewMap;
            }
            return element2ViewMap;
        }
    } // LazyElement2ViewMap

    /**
     * @generated
     */
    public static Resource initializeFromTemplate(URI newFileURI, String pluginId, String templatePath) {

        try {
            // Open the template as an stream
            InputStream templateInputStream = null;
            java.net.URL templateURL = Platform.getBundle(pluginId).getResource(templatePath);
            templateInputStream = templateURL.openStream();

            // Create the new file and initialize it with the template stream
            IPath path = new Path(newFileURI.toPlatformString(false));
            IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
            file.create(templateInputStream, IResource.NONE, null);

        } catch (IOException e) {
            Log.error(null, 0, "IO Exception", e);
            return null;
        } catch (CoreException e) {
            Log.error(null, 0, "Core Exception", e);
            return null;
        }

        // Load the file as a resource
        ResourceSet resSet = new ResourceSetImpl(); // Create a new resource set
        Resource modelResource = resSet.getResource(newFileURI, true); // Gets the resource

        return modelResource;
    }

}