/* * 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.util; 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.ModelUtil; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.metamodels.diagram.Diagram; import org.teiid.designer.transformation.ui.PluginConstants; import org.teiid.designer.transformation.ui.UiConstants; import org.teiid.designer.transformation.util.TransformationHelper; import org.teiid.designer.ui.util.DiagramProxy; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; import org.teiid.query.ui.UiPlugin; /** * TransformationDiagramUtil * * @since 8.0 */ public class TransformationDiagramUtil { /** * Construct an instance of TransformationDiagramUtil. */ // private static final String PRODUCT_VERSION = "3.0"; //$NON-NLS-1$ private static final String NAMESPACE_URI_PREFIX = "http://www.metamatrix.com/metamodels/"; //$NON-NLS-1$ private static final String RELATIONAL_URI = NAMESPACE_URI_PREFIX + "Relational"; //$NON-NLS-1$ private static final String DATA_ACCESS_URI = NAMESPACE_URI_PREFIX + "DataAccess"; //$NON-NLS-1$ private static final String WEB_SERVICE_URI = NAMESPACE_URI_PREFIX + "WebService"; //$NON-NLS-1$ private static final String XML_SERVICE_URI = NAMESPACE_URI_PREFIX + "XmlService"; //$NON-NLS-1$ public static Diagram createTransformationDiagram( final EObject target, final ModelResource modelResource, final boolean persistance ) { Diagram result = null; boolean persist = persistance; if (ModelUtil.isIResourceReadOnly(modelResource.getResource())) persist = false; if (!diagramExistsForProcedure(modelResource, target)) { if (isVirtualProcedureOrTable(target) || isStandardVirtualSqlTable(target)) { boolean requiresStart = ModelerCore.startTxn(false, true, "Create Transformation Diagram", target); //$NON-NLS-1$ boolean succeeded = false; try { result = modelResource.getModelDiagrams().createNewDiagram(target, persist); result.setType(PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID); succeeded = true; } catch (ModelWorkspaceException e) { String message = UiConstants.Util.getString("TransformationDiagramUtil.createTransformationDiagramError", 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 static Diagram createProxiedTransformationDiagram( final EObject target, final ModelResource modelResource ) { return new DiagramProxy(target, PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID, modelResource); } public static List getTransformationDiagrams( final ModelResource modelResource, final EObject eObject, final boolean createIfNone, final boolean persistance ) { List transformationDiagrams = new ArrayList(); 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.TRANSFORMATION_DIAGRAM_TYPE_ID)) transformationDiagrams.add(nextDiagram); } } catch (ModelWorkspaceException e) { String message = UiConstants.Util.getString("TransformationDiagramUtil.getTransformationDiagramsError", modelResource.toString()); //$NON-NLS-1$ UiConstants.Util.log(IStatus.ERROR, e, message); } if (transformationDiagrams.isEmpty()) { // create one here. Diagram newTransformationDiagram = null; // if (createIfNone) { // newTransformationDiagram = createTransformationDiagram(eObject, modelResource, persistance); // } else { newTransformationDiagram = createProxiedTransformationDiagram(eObject, modelResource); // } if (newTransformationDiagram != null) transformationDiagrams.add(newTransformationDiagram); } return transformationDiagrams; } public static Diagram getTransformationDiagram( final ModelResource modelResource, final EObject eObject, final boolean createIfNone, final boolean persistance ) { Diagram tDiagram = null; try { List diagramList = new ArrayList(modelResource.getModelDiagrams().getDiagrams(eObject)); Iterator iter = diagramList.iterator(); Diagram nextDiagram = null; while (iter.hasNext() && tDiagram == null) { nextDiagram = (Diagram)iter.next(); if (nextDiagram.getType() != null && nextDiagram.getType().equals(PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID)) tDiagram = nextDiagram; } } catch (ModelWorkspaceException e) { String message = UiConstants.Util.getString("TransformationDiagramUtil.getTransformationDiagramsError", modelResource.toString()); //$NON-NLS-1$ UiConstants.Util.log(IStatus.ERROR, e, message); } // if (tDiagram == null && createIfNone) { // // create one here. // tDiagram = createTransformationDiagram(eObject, modelResource, persistance); // } else if (tDiagram == null) { tDiagram = createProxiedTransformationDiagram(eObject, modelResource); } return tDiagram; } public static Diagram getTransformationDiagram( final ModelResource modelResource, final EObject transformationObject ) { Diagram tDiagram = null; EObject mappingClassEObject = null; if (TransformationHelper.isSqlTransformation(transformationObject)) { } else if (TransformationHelper.isSqlTransformationMappingRoot(transformationObject)) { mappingClassEObject = TransformationHelper.getTransformationLinkTarget(transformationObject); } else if (TransformationHelper.isTransformationMapping(transformationObject)) { EObject tRoot = transformationObject.eContainer(); if (tRoot != null) mappingClassEObject = TransformationHelper.getTransformationLinkTarget(tRoot); } if (mappingClassEObject != null) { // create one here. tDiagram = getTransformationDiagram(modelResource, mappingClassEObject, true, true); } return tDiagram; } public static boolean isStandardVirtualSqlTable( final Object input ) { boolean result = false; if (input instanceof EObject && (TransformationHelper.isVirtualSqlTable(input) || TransformationHelper.isSqlVirtualProcedure(input))) { EObject eObject = (EObject)input; final String mmUri = eObject.eClass().getEPackage().getNsURI(); if (mmUri != null && (mmUri.equals(RELATIONAL_URI) || mmUri.equals(DATA_ACCESS_URI) || mmUri.equals(WEB_SERVICE_URI) || mmUri.equals(XML_SERVICE_URI))) { result = true; } } return result; } public static boolean isVirtualProcedureOrTable( final EObject eObject ) { boolean result = ((org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isTable(eObject) || org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isProcedure(eObject)) && ModelObjectUtilities.isVirtual(eObject)); return result; } public static boolean isVirtualProcedure( final EObject eObject ) { return org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isProcedure(eObject) && ModelObjectUtilities.isVirtual(eObject); } public static boolean diagramExistsForProcedure( final ModelResource modelResource, final EObject eObject ) { boolean exists = false; if (isVirtualProcedure(eObject)) { try { List diagramList = new ArrayList(modelResource.getModelDiagrams().getDiagrams(eObject)); if (!diagramList.isEmpty()) exists = true; } catch (ModelWorkspaceException e) { UiConstants.Util.log(IStatus.ERROR, e, null); } } return exists; } public static boolean isTreeLayout() { return UiPlugin.getDefault().getPreferenceStore().getBoolean(org.teiid.query.ui.UiConstants.Prefs.TREE_DIAGRAM_LAYOUT); } }