/* * 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.actions; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.ISelection; import org.teiid.designer.diagram.ui.util.RelationalUmlEObjectHelper; import org.teiid.designer.metamodels.diagram.Diagram; import org.teiid.designer.metamodels.transformation.SqlTransformationMappingRoot; import org.teiid.designer.transformation.util.TransformationHelper; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; /** * @since 8.0 */ public class TransformationSelectionHelper { public static final int COUNT_SINGLE = 1; public static final int COUNT_MULTIPLE_SAME = -1; public static final int COUNT_MULTIPLE_MIXED = 2; public static final int TYPE_UNKNOWN = -1; public static final int TYPE_TARGET_TABLE = 0; public static final int TYPE_TARGET_CHILD = 1; public static final int TYPE_SOURCE_TABLE = 2; public static final int TYPE_SOURCE_CHILD = 3; public static final int TYPE_INPUT_SET = 4; public static final int TYPE_RESULT_SET = 5; public static final int TYPE_SOURCE_RESULT_SET = 6; public static final int TYPE_SQL_TRANSFORMATION_ROOT = 9; public static final int TYPE_SQL_TRANSFORMATION_ROOT_EXTRA = 10; public static final int TYPE_DIAGRAM = 11; public static final int TYPE_XQUERY_TRANSFORMATION_ROOT = 12; private EObject transformationRoot; private ISelection selection = null; private int type = TYPE_UNKNOWN; private int count = 0; private int countType = 1; /** * * @since 4.2 */ public TransformationSelectionHelper(EObject tRoot, ISelection selection) { super(); this.transformationRoot = tRoot; this.selection = selection; init(); } private void init() { setType(); } /** * @return Returns the selection. * @since 4.2 */ public ISelection getSelection() { return this.selection; } public EObject getSingleEObject() { if( SelectionUtilities.isSingleSelection(selection) ) { count = 1; countType = COUNT_SINGLE; EObject eObj = SelectionUtilities.getSelectedEObject(selection); if( eObj != null ) { return eObj; } } return null; } public int getType() { return type; } private void setType() { type = TYPE_UNKNOWN; if( SelectionUtilities.isSingleSelection(selection) ) { count = 1; countType = COUNT_SINGLE; EObject eObj = SelectionUtilities.getSelectedEObject(selection); if( eObj != null ) { type = getEObjectType(eObj); } } else { List allSelected = SelectionUtilities.getSelectedEObjects(selection); count = allSelected.size(); if( count > 0 ) { EObject nextEObj = (EObject)allSelected.get(0); int firstType = getEObjectType(nextEObj); int nextType = TYPE_UNKNOWN; for(int i= 1; i<count; i++ ) { nextEObj = (EObject)allSelected.get(i); nextType = getEObjectType(nextEObj); if( nextType != firstType ) { type = TYPE_UNKNOWN; countType = COUNT_MULTIPLE_MIXED; break; } type = firstType; countType = COUNT_MULTIPLE_SAME; } } } } /** * @return Returns the count. * @since 4.2 */ public int getCount() { return this.count; } /** * @return Returns the countType. * @since 4.2 */ public int getCountType() { return this.countType; } public boolean isVirtual() { boolean isVirtual = false; if( SelectionUtilities.isSingleSelection(selection) ) { EObject eObj = SelectionUtilities.getSelectedEObject(selection); if( eObj != null ) { isVirtual = ModelObjectUtilities.isVirtual(eObj); } } else if( SelectionUtilities.isMultiSelection(selection)) { isVirtual = true; Iterator iter = SelectionUtilities.getSelectedEObjects(selection).iterator(); while( iter.hasNext() && isVirtual ) { isVirtual = ModelObjectUtilities.isVirtual((EObject)iter.next()); } } return isVirtual; } private EObject getMappingRootTarget(EObject eObj) { if(eObj!=null && TransformationHelper.isSqlTransformationMappingRoot(eObj)) { return ((SqlTransformationMappingRoot)eObj).getTarget(); } return null; } public int getEObjectType(EObject eObj) { int eObjType = TYPE_UNKNOWN; if( TransformationHelper.isSqlTransformationMappingRoot(eObj) ) { if( eObj == transformationRoot ) eObjType = TYPE_SQL_TRANSFORMATION_ROOT; else eObjType = TYPE_SQL_TRANSFORMATION_ROOT_EXTRA; } else if( (TransformationHelper.isSqlTable(eObj) || TransformationHelper.isSqlProcedure(eObj) || TransformationHelper.isSqlProcedureResultSet(eObj)) && transformationRoot != null) { // is it the target? EObject target = getMappingRootTarget(transformationRoot); // if result set, target should be it's parent if( target != null && TransformationHelper.isSqlProcedureResultSet(target)) target = target.eContainer(); if( target != null && target == eObj ) { eObjType = TYPE_TARGET_TABLE; } else if( TransformationHelper.isSqlProcedureResultSet(eObj) && ModelObjectUtilities.isVirtual(eObj) ) { EObject rsContainer = eObj.eContainer(); if( rsContainer == target ) eObjType = TYPE_RESULT_SET; else eObjType = TYPE_SOURCE_RESULT_SET; } else if( TransformationHelper.isSqlInputSet(eObj)) { eObjType = TYPE_INPUT_SET; } else { eObjType = TYPE_SOURCE_TABLE; } // if( eObjType == TYPE_SOURCE_TABLE ) { // if((TransformationHelper.isSqlProcedure(eObj) || // TransformationHelper.isSqlProcedureResultSet(eObj)) && // ModelObjectUtilities.isVirtual(eObj)) { // eObjType = TYPE_SOURCE_TABLE; // } // } } else if( transformationRoot != null && (TransformationHelper.isSqlColumn(eObj) || TransformationHelper.isSqlProcedureParameter(eObj)) ) { // check if column in target group EObject eContainer = eObj.eContainer(); EObject target = getMappingRootTarget(transformationRoot); EObject secondaryTarget = TransformationHelper.getTransformationTarget(transformationRoot); if( target != null && target == eContainer ) { eObjType = TYPE_TARGET_CHILD; } else if(secondaryTarget != null && secondaryTarget == eContainer) { eObjType = TYPE_TARGET_CHILD; } else { eObjType = TYPE_SOURCE_CHILD; } } else { // Don't know what it is, so ask someone else int umlType = RelationalUmlEObjectHelper.getEObjectType(eObj); if( umlType == RelationalUmlEObjectHelper.UML_ASSOCIATION || umlType == RelationalUmlEObjectHelper.UML_GENERALIZATION || umlType == RelationalUmlEObjectHelper.UML_OPERATION || umlType == RelationalUmlEObjectHelper.UML_ATTRIBUTE ) { eObjType = TYPE_SOURCE_CHILD; // defect 15917 - Allow more pop-up menu options on Access Pattern nodes in target table. // check if column in target group: (copied from above block) if (transformationRoot != null) { EObject eContainer = eObj.eContainer(); EObject target = getMappingRootTarget(transformationRoot); EObject secondaryTarget = TransformationHelper.getTransformationTarget(transformationRoot); if ((target != null && target == eContainer) || (secondaryTarget != null && secondaryTarget == eContainer)) { eObjType = TYPE_TARGET_CHILD; } // endif -- target/secTarget is eObj's container } // endif -- root not null } else if( eObj instanceof Diagram ) { eObjType = TYPE_DIAGRAM; } } return eObjType; } }