/*
* 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.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.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.diagram.ui.pakkage.IPackageDiagramProvider;
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.metamodels.diagram.Diagram;
import org.teiid.designer.transformation.util.TransformationHelper;
import org.teiid.designer.ui.util.DiagramProxy;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* MappingDiagramProvider
*
* @since 8.0
*/
public class MappingDiagramProvider implements IPackageDiagramProvider {
/**
* Construct an instance of MappingDiagramProvider.
*/
public MappingDiagramProvider() {
super();
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.pakkage.IPackageDiagramProvider#getPackageDiagram(org.teiid.designer.core.workspace.ModelResource, org.eclipse.emf.ecore.EObject)
*/
@Override
public Diagram getPackageDiagram( ModelResource modelResource,
EObject eObject,
boolean forceCreate ) {
Diagram mappingDiagram = null;
if (modelResource != null && eObject != null && ModelMapperFactory.isTreeRoot(eObject)) mappingDiagram = getMappingDiagram(modelResource,
eObject,
forceCreate);
return mappingDiagram;
}
private Diagram createMappingDiagram( EObject target,
ModelResource modelResource ) {
Diagram result = null;
boolean requiresStart = false;
boolean succeeded = false;
boolean persist = false;
try {
requiresStart = ModelerCore.startTxn(false, true, "Create Mapping Diagram", this); //$NON-NLS-1$
result = modelResource.getModelDiagrams().createNewDiagram(target, persist);
result.setType(PluginConstants.MAPPING_DIAGRAM_TYPE_ID);
succeeded = true;
} catch (ModelWorkspaceException e) {
String message = UiConstants.Util.getString("MappingDiagramProvider.createMappingDiagramError", modelResource.toString()); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
} finally {
if (requiresStart) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
return result;
}
private Diagram getMappingDiagram( ModelResource modelResource,
EObject eObject,
boolean forceCreate ) {
Diagram mappingDiagram = null;
try {
List diagramList = new ArrayList(modelResource.getModelDiagrams().getDiagrams(eObject));
Iterator iter = diagramList.iterator();
Diagram nextDiagram = null;
while (iter.hasNext()) {
nextDiagram = (Diagram)iter.next();
if (nextDiagram != null && nextDiagram.getType() != null
&& nextDiagram.getType().equals(PluginConstants.MAPPING_DIAGRAM_TYPE_ID)) mappingDiagram = nextDiagram;
}
} catch (ModelWorkspaceException e) {
String message = UiConstants.Util.getString("MappingDiagramContentProvider.getTransformationDiagramError", modelResource.toString()); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
if (mappingDiagram == null) {
// create one here.
if (forceCreate) {
mappingDiagram = createMappingDiagram(eObject, modelResource);
} else {
mappingDiagram = new DiagramProxy(eObject, PluginConstants.MAPPING_DIAGRAM_TYPE_ID, modelResource);
}
}
return mappingDiagram;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.pakkage.IPackageDiagramProvider#getPackageDiagram(java.lang.Object)
*/
@Override
public Diagram getPackageDiagram( Object targetObject,
boolean forceCreate ) {
Diagram mappingDiagram = null;
EObject treeRootEObject = null;
ModelResource modelResource = null;
if (targetObject instanceof EObject) {
EObject eObject = (EObject)targetObject;
modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
treeRootEObject = MappingDiagramUtil.getTreeRoot(eObject);
}
if (treeRootEObject != null && modelResource != null) mappingDiagram = getMappingDiagram(modelResource,
treeRootEObject,
forceCreate);
return mappingDiagram;
}
public Diagram getDetailedMappingDiagram( EObject targetEObject ) {
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(targetEObject);
Iterator iter = null;
EObject eObject = targetEObject;
if (TransformationHelper.isTransformationMappingRoot(eObject)) {
// let's get it's target
EObject tableTarget = TransformationHelper.getTransformationTarget(eObject);
if (tableTarget != null) {
eObject = tableTarget;
}
} else {
// Make sure we get the target table (i.e. mapping class)
// Fix for Defect 22775 - the MappingDiagramSelectionHandler is basically calling this method with a
// MappingClassColumn, so we need to
EObject tableTarget = DiagramUiUtilities.getParentClassifier(targetEObject);
if (tableTarget != null) {
eObject = tableTarget;
}
}
try {
iter = modelResource.getModelDiagrams().getDiagrams(eObject).iterator();
} catch (ModelWorkspaceException e) {
String message = UiConstants.Util.getString("MappingDiagramProvider.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_TRANSFORMATION_DIAGRAM_TYPE_ID)) return nextDiagram;
}
}
// Couldn't find one so create one
boolean requiresStart = false;
boolean succeeded = false;
try {
requiresStart = ModelerCore.startTxn(false, true, "Create Mapping Transformation Diagram", this); //$NON-NLS-1$
Diagram depDiagram = modelResource.getModelDiagrams().createNewDiagram(eObject, false); // Do Not persist this
// diagram.
depDiagram.setType(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID);
succeeded = true;
return depDiagram;
} catch (ModelWorkspaceException mwe) {
String message = UiConstants.Util.getString("MappingDiagramProvider.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 boolean hasDetailedMappingDiagram( final ModelResource modelResource,
final EObject eObject ) {
try {
List diagramList = new ArrayList(modelResource.getModelDiagrams().getDiagrams(eObject));
Iterator iter = diagramList.iterator();
Diagram nextDiagram = null;
while (iter.hasNext()) {
nextDiagram = (Diagram)iter.next();
if (nextDiagram.getType() != null
&& nextDiagram.getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID)) return true;
}
} catch (ModelWorkspaceException e) {
String message = UiConstants.Util.getString("TransformationDiagramUtil.getTransformationDiagramsError", modelResource.toString()); //$NON-NLS-1$
UiConstants.Util.log(IStatus.ERROR, e, message);
}
return false;
}
}