/*
* 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 org.eclipse.emf.ecore.EObject;
import org.teiid.designer.diagram.ui.AbstractDiagramType;
import org.teiid.designer.diagram.ui.editor.CanOpenContextException;
import org.teiid.designer.diagram.ui.editor.DiagramController;
import org.teiid.designer.diagram.ui.editor.DiagramEditor;
import org.teiid.designer.diagram.ui.editor.DiagramViewer;
import org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter;
import org.teiid.designer.diagram.ui.editor.IDiagramSelectionHandler;
import org.teiid.designer.diagram.ui.figure.DiagramFigureFactory;
import org.teiid.designer.diagram.ui.model.DiagramModelFactory;
import org.teiid.designer.diagram.ui.notation.uml.model.IClassifierContentAdapter;
import org.teiid.designer.diagram.ui.pakkage.IPackageDiagramProvider;
import org.teiid.designer.diagram.ui.part.DiagramEditPartFactory;
import org.teiid.designer.diagram.ui.preferences.DiagramColorObject;
import org.teiid.designer.diagram.ui.util.colors.ColorPaletteManager;
import org.teiid.designer.mapping.ui.PluginConstants;
import org.teiid.designer.mapping.ui.UiConstants;
import org.teiid.designer.mapping.ui.actions.MappingDiagramActionAdapter;
import org.teiid.designer.mapping.ui.editor.MappingDiagramController;
import org.teiid.designer.mapping.ui.figure.MappingColorPaletteManager;
import org.teiid.designer.mapping.ui.figure.MappingDiagramFigureFactory;
import org.teiid.designer.mapping.ui.model.MappingDiagramModelFactory;
import org.teiid.designer.mapping.ui.part.MappingDiagramPartFactory;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.metamodels.transformation.MappingClass;
import org.teiid.designer.metamodels.transformation.StagingTable;
import org.teiid.designer.metamodels.transformation.TreeMappingRoot;
import org.teiid.designer.metamodels.xml.XmlDocument;
import org.teiid.designer.transformation.util.TransformationHelper;
import org.teiid.designer.ui.editors.ModelEditorPage;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* MappingDiagramType
*
* @since 8.0
*/
public class MappingDiagramType extends AbstractDiagramType {
// ============================================================================================================================
// FIELDS
// ============================================================================================================================
private static DiagramEditPartFactory editPartFactory;
private static DiagramModelFactory modelFactory;
private static DiagramFigureFactory figureFactory;
private static ColorPaletteManager colorPaletteManager;
private static DiagramColorObject bkgdColorObject;
private static IPackageDiagramProvider mappingDiagramProvider;
private static final String CANT_OPEN_MESSAGE = "Cannot Open Transformation.\n\n" + //$NON-NLS-1$
"Model is read-only and must be writable for underlying \n" + //$NON-NLS-1$
"transformation to be constructed and displayed.\n"; //$NON-NLS-1$
// ============================================================================================================================
// CONSTRUCTORS
// ============================================================================================================================
/**
* Construct an instance of PackageDiagramType.
*/
public MappingDiagramType() {
super();
}
// ============================================================================================================================
// METHODS implementing IDiagramType
// ============================================================================================================================
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getEditPartFactory()
*/
@Override
public DiagramEditPartFactory getEditPartFactory() {
if (editPartFactory == null) editPartFactory = new MappingDiagramPartFactory();
return editPartFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getFigureFactory()
*/
@Override
public DiagramFigureFactory getFigureFactory() {
if (figureFactory == null) figureFactory = new MappingDiagramFigureFactory();
return figureFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getModelFactory()
*/
@Override
public DiagramModelFactory getModelFactory() {
if (modelFactory == null) modelFactory = new MappingDiagramModelFactory();
return modelFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getActionAdapter()
*/
@Override
public IDiagramActionAdapter getActionAdapter( ModelEditorPage editor ) {
return new MappingDiagramActionAdapter(editor);
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDisplayName()
*/
@Override
public String getDisplayName() {
return UiConstants.Util.getString("DiagramNames.mappingDiagram"); //$NON-NLS-1$) ;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getSelectionHandler()
*/
@Override
public IDiagramSelectionHandler getSelectionHandler( DiagramViewer viewer ) {
IDiagramSelectionHandler handler = new MappingDiagramSelectionHandler(viewer);
return handler;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDiagramController()
*/
@Override
public DiagramController getDiagramController( DiagramEditor editor ) {
DiagramController controller = new MappingDiagramController(editor);
return controller;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getColorPaletteManager()
*/
@Override
public ColorPaletteManager getColorPaletteManager() {
if (colorPaletteManager == null) colorPaletteManager = new MappingColorPaletteManager();
return colorPaletteManager;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDiagramControllerClass()
*/
@Override
public Class getDiagramControllerClass() {
return MappingDiagramController.class;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#canOpenContext(java.lang.Object)
*/
@Override
public boolean canOpenContext( Object input ) throws CanOpenContextException {
boolean canOpen = false;
boolean readOnlyFailure = false;
if (input instanceof EObject) {
EObject eObj = (EObject)input;
// Note that transient diagrams will appear stale (i.e. eObj.eResource() == NULL
// so we need to defer to their "target" eObjects to make the call
boolean eObjectIsStale = ModelObjectUtilities.isStale(eObj);
if (eObj instanceof Diagram && ((Diagram)eObj).getType() != null) {
if (((Diagram)eObj).getType().equals(PluginConstants.MAPPING_DIAGRAM_TYPE_ID)) {
EObject targetEObj = ((Diagram)eObj).getTarget();
if (targetEObj != null && !ModelObjectUtilities.isStale(targetEObj)) canOpen = true;
} else if (((Diagram)eObj).getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID)) {
EObject virtualGroupEObject = ((Diagram)eObj).getTarget();
if (virtualGroupEObject != null && TransformationHelper.isVirtual(virtualGroupEObject)
&& !ModelObjectUtilities.isStale(virtualGroupEObject)) {
EObject transformation = TransformationHelper.getTransformationMappingRoot(virtualGroupEObject);
if (transformation != null) {
canOpen = true;
} else if (!ModelObjectUtilities.isReadOnly(virtualGroupEObject)) {
canOpen = true;
} else {
readOnlyFailure = true;
}
}
}
} else if (!eObjectIsStale) {
if (MappingDiagramUtil.isMappingSqlTable(eObj)) {
// Need to check if this table has a transformation and if not, then if it's read-only,
// present dialog explaining the delema.
EObject transformation = TransformationHelper.getTransformationMappingRoot(eObj);
if (transformation != null) {
canOpen = true;
} else if (!ModelObjectUtilities.isReadOnly(eObj)) {
canOpen = true;
} else {
readOnlyFailure = true;
}
} else if (MappingDiagramUtil.isMappingDocument(eObj)) {
canOpen = true;
} else if (MappingDiagramUtil.isInputSet(eObj)) {
canOpen = true;
} else if (MappingDiagramUtil.hasMappingDocument(eObj)) {
canOpen = true;
} else if (MappingDiagramUtil.isTreeMappingRoot(eObj)) {
// defect 16988 - pay attention to TreeMappingRoots:
canOpen = true;
} else if (TransformationHelper.isSqlTransformationMappingRoot(eObj)) {
// Case where the the T-Root target is a Staging Table
EObject virtualGroup = TransformationHelper.getTransformationLinkTarget(eObj);
if (virtualGroup instanceof StagingTable || virtualGroup instanceof MappingClass) {
canOpen = true;
}
} else {
Object container = eObj.eContainer();
if (MappingDiagramUtil.isInputSet(container) || MappingDiagramUtil.isMappingClassColumn(eObj)) {
canOpen = true;
}
}
}
}
if (!canOpen && readOnlyFailure) {
throw new CanOpenContextException(CANT_OPEN_MESSAGE);
}
return canOpen;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDiagramForContext(java.lang.Object)
*/
@Override
public Diagram getDiagramForContext( Object input ) {
Diagram mappingDiagram = null;
if (input instanceof Diagram
&& ((Diagram)input).getType() != null
&& (((Diagram)input).getType().equals(PluginConstants.MAPPING_DIAGRAM_TYPE_ID) || ((Diagram)input).getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID))) {
mappingDiagram = (Diagram)input;
} else if (MappingDiagramUtil.isMappingSqlTable(input)) {
mappingDiagram = ((MappingDiagramProvider)getPackageDiagramProvider()).getDetailedMappingDiagram((EObject)input);
} else if (MappingDiagramUtil.isInputSet(input)) {
EObject eoContainer = ((EObject)input).eContainer();
if (eoContainer != null) {
mappingDiagram = ((MappingDiagramProvider)getPackageDiagramProvider()).getDetailedMappingDiagram(eoContainer);
}
} else if (MappingDiagramUtil.isMappingDocument(input)) {
mappingDiagram = getPackageDiagramProvider().getPackageDiagram(input, true);
} else if (MappingDiagramUtil.hasMappingDocument(input)) {
EObject thePackage = MappingDiagramUtil.getMappingDocument(input);
if (thePackage != null) {
mappingDiagram = getPackageDiagramProvider().getPackageDiagram(thePackage, true);
}
} else if (MappingDiagramUtil.isInputSetParameter(input) || MappingDiagramUtil.isMappingClassColumn(input)) {
Object container = ((EObject)input).eContainer();
if (MappingDiagramUtil.isInputSet(container)) {
EObject eoContainer = ((EObject)container).eContainer();
if (eoContainer != null) {
mappingDiagram = ((MappingDiagramProvider)getPackageDiagramProvider()).getDetailedMappingDiagram(eoContainer);
}
} else if (MappingDiagramUtil.isMappingSqlTable(container)) {
mappingDiagram = ((MappingDiagramProvider)getPackageDiagramProvider()).getDetailedMappingDiagram((EObject)container);
}
} else if (MappingDiagramUtil.isTreeMappingRoot(input)) {
// defect 16988 - pay attention to TreeMappingRoots:
EObject targ = ((TreeMappingRoot)input).getTarget();
mappingDiagram = getPackageDiagramProvider().getPackageDiagram(targ, true);
} else if (TransformationHelper.isSqlTransformationMappingRoot(input)) {
// Case where the the T-Root target is a Staging Table
EObject virtualGroup = TransformationHelper.getTransformationLinkTarget((EObject)input);
if (virtualGroup instanceof StagingTable || virtualGroup instanceof MappingClass) {
mappingDiagram = ((MappingDiagramProvider)getPackageDiagramProvider()).getDetailedMappingDiagram(virtualGroup);
}
}
return mappingDiagram;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getClassifierContentAdapter()
*/
@Override
public IClassifierContentAdapter getClassifierContentAdapter() {
return new MappingClassContentAdapter();
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getPackageDiagramProvider()
*/
@Override
public IPackageDiagramProvider getPackageDiagramProvider() {
if (mappingDiagramProvider == null) mappingDiagramProvider = new MappingDiagramProvider();
return mappingDiagramProvider;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getBackgroundColorObject()
*/
@Override
public DiagramColorObject getBackgroundColorObject( String extensionID ) {
if (bkgdColorObject == null) {
bkgdColorObject = new DiagramColorObject(getDisplayName(), PluginConstants.Prefs.Appearance.MAPPING_BKGD_COLOR);
}
if (extensionID.equals(PluginConstants.MAPPING_DIAGRAM_TYPE_ID)) {
return bkgdColorObject;
}
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDiagramForGoToMarkerEObject(org.eclipse.emf.ecore.EObject)
*/
@Override
public Diagram getDiagramForGoToMarkerEObject( EObject eObject ) {
return getDiagramForContext(eObject);
// Diagram mappingDiagram = null;
//
// if( MappingDiagramUtil.isInputSet(eObject) ||
// MappingDiagramUtil.isInputSetParameter(eObject) ||
// MappingDiagramUtil.isMappingSqlTable(eObject) ||
// MappingDiagramUtil.isMappingClassColumn(eObject)) {
// mappingDiagram = getDiagramForContext(eObject);
//
// } else if (MappingDiagramUtil.hasMappingDocument(eObject)) {
// // copied from getDiagramForContext, above
// EObject thePackage = MappingDiagramUtil.getMappingDocument(eObject);
// if( thePackage != null ) {
// mappingDiagram = getPackageDiagramProvider().getPackageDiagram(thePackage, forceCreate);
// }
// } else if( MappingDiagramUtil.isTreeMappingRoot(eObject) ) {
// // defect 16988 - pay attention to TreeMappingRoots:
// EObject targ = ((TreeMappingRoot)eObject).getTarget();
// mappingDiagram = getPackageDiagramProvider().getPackageDiagram(targ, true);
// } else if( TransformationHelper.isSqlTransformationMappingRoot(eObject)) {
// // Case where the the T-Root target is a Staging Table
// EObject virtualGroup = TransformationHelper.getTransformationLinkTarget(eObject);
// if( virtualGroup instanceof StagingTable ||
// virtualGroup instanceof MappingClass ) {
// mappingDiagram
// = ((MappingDiagramProvider)getPackageDiagramProvider()).getDetailedMappingDiagram(virtualGroup);
// }
// }
// // make sure not still null:
// if( mappingDiagram == null ) {
// mappingDiagram = getPackageDiagramProvider().getPackageDiagram(eObject, forceCreate);
//
// // Let's check.
// if( mappingDiagram == null ) {
// if( MappingDiagramUtil.hasMappingDocument(eObject)) {
// EObject mappingDocument = MappingDiagramUtil.getMappingDocument(eObject);
// if( mappingDocument != null )
// mappingDiagram = getPackageDiagramProvider().getPackageDiagram(mappingDocument, forceCreate);
// }
// }
// }
// return mappingDiagram;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDisplayedPath(org.teiid.designer.metamodels.diagram.Diagram, org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDisplayedPath( Diagram diagram,
EObject eObject ) {
String path = null;
if (diagram.getType() != null && diagram.getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID)) {
// Check to see if the modelResource for this class is same as diagram.
if (diagram.getTarget() == null || !diagram.getTarget().equals(eObject)) {
if (!ModelUtilities.areModelResourcesSame(diagram, eObject)) path = ModelObjectUtilities.getTrimmedFullPath(eObject);
else path = ModelObjectUtilities.getTrimmedRelativePath(eObject);
}
}
return path;
}
/**
* @see org.teiid.designer.diagram.ui.IDiagramType#isTransientDiagram(org.teiid.designer.metamodels.diagram.Diagram)
* @since 4.2
*/
@Override
public boolean isTransientDiagram( Diagram diagram ) {
EObject target = diagram.getTarget();
if (MappingDiagramUtil.isStagingTable(target)) return true;
if (target instanceof XmlDocument) {
return true;
}
return false;
}
/**
* @see org.teiid.designer.diagram.ui.IDiagramType#getRevealedEObject(java.lang.Object)
* @since 4.2
*/
@Override
public EObject getRevealedEObject( Diagram diagram,
Object object ) {
if (diagram.getType() != null && diagram.getType().equals(PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID)) return diagram.getTarget();
return null;
}
}