/*
* 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.mapping.ui.diagram;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
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.notation.uml.model.UmlClassifierNode;
import org.teiid.designer.diagram.ui.part.DiagramEditPart;
import org.teiid.designer.diagram.ui.util.DiagramUiUtilities;
import org.teiid.designer.mapping.factory.ModelMapperFactory;
import org.teiid.designer.mapping.ui.PluginConstants;
import org.teiid.designer.mapping.ui.UiConstants;
import org.teiid.designer.mapping.ui.editor.MappingAdapterFilter;
import org.teiid.designer.mapping.ui.editor.MappingDiagramBehavior;
import org.teiid.designer.mapping.ui.editor.MappingDiagramController;
import org.teiid.designer.mapping.ui.figure.MappingExtentFigure;
import org.teiid.designer.mapping.ui.model.MappingExtentNode;
import org.teiid.designer.mapping.ui.part.MappingDiagramEditPart;
import org.teiid.designer.mapping.ui.part.MappingExtentEditPart;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.metamodels.transformation.InputSet;
import org.teiid.designer.metamodels.transformation.MappingClass;
import org.teiid.designer.metamodels.transformation.MappingClassColumn;
import org.teiid.designer.metamodels.transformation.MappingClassSet;
import org.teiid.designer.metamodels.transformation.StagingTable;
import org.teiid.designer.metamodels.transformation.TreeMappingRoot;
import org.teiid.designer.transformation.util.TransformationHelper;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
import org.teiid.designer.xsd.util.ModelerXsdUtils;
/**
* MappingDiagramUtil
*
* @since 8.0
*/
public class MappingDiagramUtil {
/**
* given a document tree root, find the coarse mapping diagram. One is created if none exists yet
*
* @param eObject
* @return
*/
public static Diagram getCoarseMappingDiagram( EObject documentTreeRootEObject ) {
Iterator iter = null;
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(documentTreeRootEObject);
if (modelResource != null) {
try {
iter = modelResource.getModelDiagrams().getDiagrams(documentTreeRootEObject).iterator();
} catch (ModelWorkspaceException e) {
String message = UiConstants.Util.getString("getCoarseMappingDiagram.getDiagramsError", modelResource.toString()); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
if (iter != null) {
Diagram nextDiagram = null;
while (iter.hasNext()) {
nextDiagram = (Diagram)iter.next();
if (nextDiagram.getType() != null && nextDiagram.getType().equals(PluginConstants.MAPPING_DIAGRAM_TYPE_ID)) return nextDiagram;
}
}
// Couldn't find one so create one
boolean requiresStart = false;
boolean succeeded = false;
boolean persist = false;
try {
requiresStart = ModelerCore.startTxn(false, true, "Create Mapping Diagram", documentTreeRootEObject); //$NON-NLS-1$
Diagram depDiagram = modelResource.getModelDiagrams().createNewDiagram(documentTreeRootEObject, persist); // Do
// Not
// persist
// this
// diagram.
depDiagram.setType(PluginConstants.MAPPING_DIAGRAM_TYPE_ID);
succeeded = true;
return depDiagram;
} catch (ModelWorkspaceException mwe) {
String message = UiConstants.Util.getString("getCoarseMappingDiagram.createMappingDiagramError", modelResource.toString()); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, mwe, message);
} finally {
if (requiresStart) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
}
return null;
}
public static Diagram getCoarseMappingDiagram( Diagram detailedMappingDiagram ) {
// Now, let's get the coarse mapping diagram based on selected object;
// Need to get the document!!
EObject documentTreeRoot = null;
if (detailedMappingDiagram != null) {
MappingClass mappingClass = (MappingClass)detailedMappingDiagram.getTarget();
documentTreeRoot = mappingClass.getMappingClassSet().getTarget();
}
if (documentTreeRoot != null) return getCoarseMappingDiagram(documentTreeRoot);
return null;
}
public static boolean isMappingSqlTable( final Object input ) {
boolean result = false;
if (input instanceof EObject && TransformationHelper.isVirtualSqlTable(input) && input instanceof MappingClass) {
return true;
}
return result;
}
public static boolean isMappingClassColumn( final Object input ) {
boolean result = false;
if (input instanceof EObject) {
Object container = ((EObject)input).eContainer();
if (MappingDiagramUtil.isMappingSqlTable(container)) {
result = true;
}
}
return result;
}
public static boolean isInputSet( final Object input ) {
boolean result = false;
if (input instanceof EObject && TransformationHelper.isVirtualSqlTable(input) && input instanceof InputSet) {
return true;
}
return result;
}
public static boolean isMappingClass( final Object input ) { // NO_UCD
boolean result = false;
if (input instanceof EObject && input instanceof MappingClass && !(input instanceof StagingTable)) {
return true;
}
return result;
}
public static boolean isStagingTable( final Object input ) {
boolean result = false;
if (input instanceof EObject && input instanceof StagingTable) {
return true;
}
return result;
}
public static boolean isInputSetParameter( final Object input ) {
boolean result = false;
if (input instanceof EObject) {
Object container = ((EObject)input).eContainer();
if (MappingDiagramUtil.isInputSet(container)) {
result = true;
}
}
return result;
}
public static boolean isMappingDocument( final Object input ) {
boolean result = false;
if (input instanceof EObject && ModelMapperFactory.isTreeRoot((EObject)input)) {
return true;
}
return result;
}
public static EObject getTreeRoot( final EObject eObject ) {
EObject treeRootEObject = null;
if (ModelMapperFactory.isTreeRoot(eObject)) {
treeRootEObject = eObject;
} else {
MappingClassSet mappingClassSet = null;
if (eObject instanceof MappingClass) {
mappingClassSet = ((MappingClass)eObject).getMappingClassSet();
} else if (eObject instanceof MappingClassColumn) {
EObject mappingClass = eObject.eContainer();
mappingClassSet = ((MappingClass)mappingClass).getMappingClassSet();
}
if (mappingClassSet != null) {
treeRootEObject = mappingClassSet.getTarget();
}
}
return treeRootEObject;
}
public static boolean hasMappingDocument( final Object input ) {
boolean result = false;
if (input instanceof EObject) {
EObject eObject = (EObject)input;
EObject parentPackage = getMappingDocument(eObject);
if (parentPackage != null) {
result = true;
}
}
return result;
}
public static EObject getMappingDocument( final Object input ) {
EObject documentEObject = null;
if (input instanceof EObject) {
EObject eObject = (EObject)input;
Object parent = eObject.eContainer();
if (parent != null && parent instanceof EObject) {
if (isMappingDocument(parent)) documentEObject = (EObject)parent;
else documentEObject = getMappingDocument(parent);
}
}
return documentEObject;
}
public static void layoutDiagram( final DiagramModelNode diagramNode ) {
// Get current editor and check for matching diagram node.
DiagramEditor editor = DiagramEditorUtil.getVisibleDiagramEditor();
if (diagramNode != null && editor != null && editor.getCurrentModel() != null
&& editor.getCurrentModel().getModelObject().equals(diagramNode.getModelObject())) {
// Let's find the edit part for the diagram....
EditPart contents = editor.getDiagramViewer().getContents();
if (contents instanceof MappingDiagramEditPart) {
((MappingDiagramEditPart)contents).layout();
}
}
}
public static void layoutDiagram( final DiagramModelNode diagramNode,
boolean layoutChildren ) {
// Get current editor and check for matching diagram node.
DiagramEditor editor = DiagramEditorUtil.getVisibleDiagramEditor();
if (diagramNode != null && editor != null && editor.getCurrentModel() != null
&& editor.getCurrentModel().getModelObject().equals(diagramNode.getModelObject())) {
// Let's find the edit part for the diagram....
EditPart contents = editor.getDiagramViewer().getContents();
if (contents instanceof MappingDiagramEditPart) {
((MappingDiagramEditPart)contents).layout(layoutChildren);
}
}
}
public static void hiliteUnconnectedExtents( final DiagramModelNode diagramNode ) {
// Get current editor and check for matching diagram node.
DiagramEditor editor = DiagramEditorUtil.getVisibleDiagramEditor();
if (diagramNode != null && diagramNode.getModelObject() != null && editor != null && editor.getCurrentModel() != null
&& editor.getCurrentModel().getModelObject() != null
&& editor.getCurrentModel().getModelObject().equals(diagramNode.getModelObject())) {
// Let's find the edit part for the diagram....
EditPart contents = editor.getDiagramViewer().getContents();
if (contents instanceof MappingDiagramEditPart) {
List editParts = contents.getChildren();
Iterator iter = editParts.iterator();
EditPart nextEP = null;
while (iter.hasNext()) {
nextEP = (EditPart)iter.next();
if (nextEP instanceof MappingExtentEditPart) {
hiliteExtent((MappingExtentEditPart)nextEP);
}
}
}
}
}
public static void hiliteExtent( MappingExtentEditPart meep ) {
MappingExtentNode nextNode = (MappingExtentNode)meep.getModel();
if (nextNode != null
// jhTODO jh test: drop the 'detailed diagram only' so we can do this in Coarse as well:
/*&& nextNode.getDiagram().getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID) */) {
if (!(nextNode.getModelObject() instanceof StagingTable)) {
if (!DiagramUiUtilities.isNodeConnected(nextNode)) {
if (nextNode.getExtent().isMappingRequired()) {
((MappingExtentFigure)meep.getDiagramFigure()).setDefaultBkgdColor(UiConstants.Colors.REQUIRES_MAPPING);
meep.getDiagramFigure().hiliteBackground(UiConstants.Colors.REQUIRES_MAPPING);
} else {
((MappingExtentFigure)meep.getDiagramFigure()).setDefaultBkgdColor(UiConstants.Colors.UNMAPPED);
meep.getDiagramFigure().hiliteBackground(UiConstants.Colors.UNMAPPED);
}
}
}
}
}
public static DiagramEditPart getInputSetEditPart( DiagramEditPart detailedDiagramEditPart ) { // NO_UCD
DiagramEditPart inputSetEP = null;
Iterator iter = detailedDiagramEditPart.getChildren().iterator();
Object nextObj = null;
DiagramEditPart nextDEP = null;
while (iter.hasNext() && inputSetEP == null) {
nextObj = iter.next();
if (nextObj instanceof DiagramEditPart) {
nextDEP = (DiagramEditPart)nextObj;
if (nextDEP.getModelObject() != null && TransformationHelper.isSqlInputSet(nextDEP.getModelObject())) inputSetEP = nextDEP;
}
}
return inputSetEP;
}
public static DiagramEditPart getTransformationEditPart( DiagramEditPart detailedDiagramEditPart ) { // NO_UCD
DiagramEditPart transformationEP = null;
Iterator iter = detailedDiagramEditPart.getChildren().iterator();
Object nextObj = null;
DiagramEditPart nextDEP = null;
while (iter.hasNext() && transformationEP == null) {
nextObj = iter.next();
if (nextObj instanceof DiagramEditPart) {
nextDEP = (DiagramEditPart)nextObj;
if (nextDEP.getModelObject() != null
&& TransformationHelper.isTransformationMappingRoot(nextDEP.getModelObject())) transformationEP = nextDEP;
}
}
return transformationEP;
}
/**
* @param obj
* @return
*/
public static boolean isTreeMappingRoot( Object obj ) {
return obj instanceof TreeMappingRoot;
}
/**
* This utility method will: 1) Locate visible Diagram Editor 2) Obtain the MappingDocumentController 3) Get the filter from
* the controller and use to get visible ordered mapping classes
*
* @return
* @since 4.3
*/
public static List getOrderedCoarseMappingClasses() {
List onlyMappingClasses = new ArrayList();
DiagramEditor editor = DiagramEditorUtil.getVisibleDiagramEditor();
if (editor != null) {
MappingDiagramController controller = (MappingDiagramController)editor.getDiagramController();
if (controller != null) {
MappingAdapterFilter filter = controller.getMappingFilter();
// Filter will return mapping classes and staging tables
List visibleMappingClasses = filter.getMappedClassifiers();
MappingClass nextMC = null;
Iterator iter = visibleMappingClasses.iterator();
while (iter.hasNext()) {
nextMC = (MappingClass)iter.next();
// Add only if it's not a Staging Table
if (!(nextMC instanceof StagingTable)) {
onlyMappingClasses.add(nextMC);
}
}
}
}
if (onlyMappingClasses.isEmpty()) return Collections.EMPTY_LIST;
return onlyMappingClasses;
}
/**
* Obtains all the <code>DiagramModelNode</code>s that are associated with enumerated types.
*
* @return the diagram model nodes (never <code>null</code>)
* @since 5.0.2
*/
public static DiagramModelNode[] getEnumeratedTypeNodes() {
DiagramModelNode[] result = null;
// Create temporary list
List tempList = new ArrayList();
// Get visible editor
DiagramEditor editor = DiagramEditorUtil.getVisibleDiagramEditor();
if (editor != null) {
// Get current diagram model
DiagramModelNode theMSDiagramNode = editor.getCurrentModel();
if (theMSDiagramNode != null) {
// Get diagram children. These will contain the Enumeration classifiers (if any exist)
Collection children = theMSDiagramNode.getChildren();
Object nextObj = null;
for (Iterator iter = children.iterator(); iter.hasNext();) {
nextObj = iter.next();
// Check for classifier node AND enumerated type, then add to temp list
if (nextObj instanceof UmlClassifierNode) {
if (ModelerXsdUtils.isEnumeratedType(((DiagramModelNode)nextObj).getModelObject())) {
tempList.add(nextObj);
}
}
}
}
}
// load the array result if not empty
if (!tempList.isEmpty()) {
tempList.toArray(result = new DiagramModelNode[tempList.size()]);
}
// create empty array if result is still NULL
if (result == null) {
result = new DiagramModelNode[0];
}
return result;
}
public static MappingDiagramBehavior getCurrentMappingDiagramBehavior() {
DiagramEditor editor = DiagramEditorUtil.getVisibleDiagramEditor();
if (editor != null) {
MappingDiagramController controller = (MappingDiagramController)editor.getDiagramController();
if (controller != null) {
return controller.getMappingDiagramBehavior();
}
}
// jh fix for Defect 21171
// as default, return a valid default-state behavior object, if we cannot find a current DiagramEditor
return new MappingDiagramBehavior();
}
public static boolean isDetailedDiagram( Diagram diagram ) {
if (diagram != null && diagram.getType() != null
&& diagram.getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID)) {
return true;
}
return false;
}
}