/*
* 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.transformation.ui.diagram;
import org.eclipse.emf.ecore.EObject;
import org.teiid.designer.core.metamodel.aspect.sql.SqlAspect;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.diagram.ui.AbstractDiagramType;
import org.teiid.designer.diagram.ui.editor.CanOpenContextException;
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.part.DiagramEditPartFactory;
import org.teiid.designer.diagram.ui.preferences.DiagramColorObject;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.transformation.aspects.sql.MappingClassSqlAspect;
import org.teiid.designer.transformation.ui.PluginConstants;
import org.teiid.designer.transformation.ui.UiConstants;
import org.teiid.designer.transformation.ui.actions.TransformationActionAdapter;
import org.teiid.designer.transformation.ui.figure.TransformationDiagramFigureFactory;
import org.teiid.designer.transformation.ui.model.TransformationDiagramModelFactory;
import org.teiid.designer.transformation.ui.part.TransformationDiagramPartFactory;
import org.teiid.designer.transformation.ui.util.TransformationDiagramUtil;
import org.teiid.designer.transformation.util.TransformationHelper;
import org.teiid.designer.ui.editors.ModelEditorPage;
import org.teiid.designer.ui.util.DiagramProxy;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* PackageDiagramType
*
* @since 8.0
*/
public class TransformationDiagramType extends AbstractDiagramType {
// ============================================================================================================================
// FIELDS
// ============================================================================================================================
private static DiagramEditPartFactory editPartFactory;
private static DiagramModelFactory modelFactory;
private static DiagramFigureFactory figureFactory;
protected DiagramColorObject bkgdColorObject;
public String displayName;
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 TransformationDiagramType() {
super();
}
// ============================================================================================================================
// METHODS implementing IDiagramType
// ============================================================================================================================
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getEditPartFactory()
*/
@Override
public DiagramEditPartFactory getEditPartFactory() {
if (editPartFactory == null) editPartFactory = new TransformationDiagramPartFactory();
return editPartFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getFigureFactory()
*/
@Override
public DiagramFigureFactory getFigureFactory() {
if (figureFactory == null) figureFactory = new TransformationDiagramFigureFactory();
return figureFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getModelFactory()
*/
@Override
public DiagramModelFactory getModelFactory() {
if (modelFactory == null) modelFactory = new TransformationDiagramModelFactory();
return modelFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getActionAdapter()
*/
@Override
public IDiagramActionAdapter getActionAdapter( ModelEditorPage editor ) {
return new TransformationActionAdapter(editor);
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDisplayName()
*/
@Override
public String getDisplayName() {
return UiConstants.Util.getString("DiagramNames.transformationDiagram"); //$NON-NLS-1$) ;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#setDisplayName(java.lang.String)
*/
@Override
public void setDisplayName( String displayName ) {
this.displayName = displayName;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getSelectionHandler()
*/
@Override
public IDiagramSelectionHandler getSelectionHandler( DiagramViewer viewer ) {
IDiagramSelectionHandler handler = new TransformationDiagramSelectionHandler(viewer);
return handler;
}
/* (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
&& ((Diagram)eObj).getType().equals(PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID)) {
// Need to check if this table has a transformation and if not, then if it's read-only,
// present dialog explaining the delema.
EObject virtualGroupEObject = ((Diagram)eObj).getTarget();
if (virtualGroupEObject != null && !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 (TransformationDiagramUtil.isStandardVirtualSqlTable(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((EObject)input);
if (transformation != null) {
canOpen = true;
} else if (!ModelObjectUtilities.isReadOnly((EObject)input)) {
canOpen = true;
} else {
readOnlyFailure = true;
}
} else if (TransformationHelper.isTransformationObject(input)) {
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 actualInput ) {
Diagram transDiagram = null;
Object input = actualInput;
if (input instanceof DiagramProxy) {
input = ((DiagramProxy)actualInput).getTarget();
if (input == null) {
// We have a package diagram under model resource
// Need to set the input to the ModelResource
input = ((DiagramProxy)actualInput).getModelResource();
}
}
if (input instanceof Diagram && ((Diagram)input).getType() != null
&& ((Diagram)input).getType().equals(PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID)) {
EObject virtualGroupEObject = ((Diagram)input).getTarget();
EObject transformation = TransformationHelper.getTransformationMappingRoot(virtualGroupEObject);
if (transformation != null) {
transDiagram = (Diagram)input;
} else if (!ModelObjectUtilities.isReadOnly((EObject)input)) {
transDiagram = (Diagram)input;
}
} else if (TransformationDiagramUtil.isStandardVirtualSqlTable(input)) {
EObject transformation = TransformationHelper.getTransformationMappingRoot((EObject)input);
if (transformation != null) {
EObject eObject = (EObject)input;
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
transDiagram = TransformationDiagramUtil.getTransformationDiagram(modelResource, eObject, true, true);
} else if (!ModelObjectUtilities.isReadOnly((EObject)input)) {
EObject eObject = (EObject)input;
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
transDiagram = TransformationDiagramUtil.getTransformationDiagram(modelResource, eObject, true, true);
}
} else if (TransformationHelper.isTransformationObject(input)) {
// Check the SQL Aspect and make sure it's not a Mapping Class
if (TransformationHelper.isSqlTransformationMappingRoot(input)) {
EObject virtualGroup = TransformationHelper.getTransformationLinkTarget((EObject)input);
SqlAspect sqlAspect = org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.getSqlAspect(virtualGroup);
if (sqlAspect instanceof MappingClassSqlAspect) {
// Do nothing
} else {
// Get the transformation diagram
EObject eObject = (EObject)input;
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
transDiagram = TransformationDiagramUtil.getTransformationDiagram(modelResource, eObject);
}
} else {
// Get the transformation diagram
EObject eObject = (EObject)input;
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
transDiagram = TransformationDiagramUtil.getTransformationDiagram(modelResource, eObject);
}
}
return transDiagram;
}
/* (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.TRANSFORM_BKGD_COLOR);
}
return bkgdColorObject;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDiagramForGoToMarkerEObject(org.eclipse.emf.ecore.EObject)
*/
@Override
public Diagram getDiagramForGoToMarkerEObject( EObject eObject ) {
return getDiagramForContext(eObject);
}
/* (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.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#getRevealedEObject(java.lang.Object)
* @since 4.2
*/
@Override
public EObject getRevealedEObject( Diagram diagram,
Object object ) {
if (diagram.getType() != null
&& (diagram.getType().equals(PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID) || diagram.getType().equals(PluginConstants.DEPENDENCY_DIAGRAM_TYPE_ID))) {
return diagram.getTarget();
}
return null;
}
}