/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.diagram.ui.custom; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.diagram.ui.DiagramUiConstants; import org.teiid.designer.diagram.ui.editor.DiagramEditor; import org.teiid.designer.diagram.ui.editor.DiagramEditorUtil; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.util.DiagramUiUtilities; import org.teiid.designer.diagram.ui.util.RelationalUmlEObjectHelper; import org.teiid.designer.metamodels.diagram.Diagram; /** * Set of Utilities to manage content from a standard custom diagram * @since 8.0 */ public class CustomDiagramContentHelper { /** * Returns a list of objects that can be added to a diagram based on an input list of EObjects. * If input list contains attribute or "child" type objects, the parent is returned so the child can show up on the diagram. * @param selectedEObjects * @return * @since 5.0 */ public static List getApplicableDiagramEObjects(final List selectedEObjects) { Collection applicableEObjects = new HashSet(selectedEObjects.size()); for( Iterator iter = selectedEObjects.iterator(); iter.hasNext(); ) { EObject nextEObj = (EObject)iter.next(); int objType = RelationalUmlEObjectHelper.getEObjectType(nextEObj); switch( objType ) { case RelationalUmlEObjectHelper.UML_ATTRIBUTE: case RelationalUmlEObjectHelper.UML_ASSOCIATION: { // Return the container object (i.e. the Classifier) applicableEObjects.add(nextEObj.eContainer()); } break; default: applicableEObjects.add(nextEObj); break; } } return new ArrayList(applicableEObjects); } public static List getActualObjectsToAdd(List originalObjects, DiagramModelNode diagramRootModelNode) { List applicableObjectsToAdd = getApplicableDiagramEObjects(originalObjects); List objectsToAdd = new ArrayList(applicableObjectsToAdd.size()); for( Iterator iter = applicableObjectsToAdd.iterator(); iter.hasNext(); ) { EObject nextEObj = (EObject)iter.next(); if( ! CustomDiagramContentHelper.objectAlreadyInDiagram(nextEObj, diagramRootModelNode) ) { objectsToAdd.add(nextEObj); } } return objectsToAdd; } public static boolean objectAlreadyInDiagram(EObject eObj, DiagramModelNode diagramRootModelNode) { return DiagramUiUtilities.getDiagramModelNode(eObj, diagramRootModelNode) != null; } /** * Method designed to add objects to a custom diagram. * If an object already exists on the diagram it will NOT be re-added. * If an object is not a Top-level diagram object (i.e. Package, Classifier, etc.) the appropriate parent object will be added * instead. * @param diagram * @param objectsToAdd * @param diagramEditor * @param txnSource * @return * @since 5.0 */ public static List addToCustomDiagram(final Diagram diagram, final List objectsToAdd, final DiagramEditor diagramEditor, Object txnSource) { List addableObjects = Collections.EMPTY_LIST; if( diagramEditor != null ) { // Need to get the current diagram DiagramModelNode diagramNode = diagramEditor.getCurrentModel(); // Need to get ahold of the CustomDiagramModelFactory CustomDiagramModelFactory modelFactory = (CustomDiagramModelFactory)diagramEditor.getModelFactory(); // And call add(SelectionUtilities.getSelectedEObjects(getSelection()) addableObjects = getActualObjectsToAdd(objectsToAdd, diagramNode); if( !addableObjects.isEmpty() && diagramNode != null && modelFactory != null ) { boolean handleConstruction = !DiagramEditorUtil.isDiagramUnderConstruction(diagram); boolean requiredStart = false; boolean succeeded = false; try { if( handleConstruction ) { DiagramEditorUtil.setDiagramUnderConstruction(diagram); } //------------------------------------------------- // Let's wrap this in a transaction!!! //------------------------------------------------- requiredStart = ModelerCore.startTxn(true, false, "Add To Custom Diagram", txnSource); //$NON-NLS-1$$ modelFactory.add(addableObjects, diagramNode); succeeded = true; } catch (Exception ex){ DiagramUiConstants.Util.log(IStatus.ERROR, ex, ex.getClass().getName() + ": addToCustomDiagram()"); //$NON-NLS-1$ } finally { if(requiredStart){ if ( succeeded ) { ModelerCore.commitTxn( ); } else { ModelerCore.rollbackTxn( ); } } if( handleConstruction ) { DiagramEditorUtil.setDiagramConstructionComplete(diagram, true); } } } } return addableObjects; } }