/* * 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.search; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.designer.core.metamodel.aspect.sql.SqlAspect; import org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect; import org.teiid.designer.core.query.QueryValidator; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.core.workspace.ModelWorkspaceManager; import org.teiid.designer.metamodels.transformation.SqlTransformation; import org.teiid.designer.metamodels.transformation.SqlTransformationMappingRoot; import org.teiid.designer.metamodels.transformation.TransformationContainer; import org.teiid.designer.transformation.util.TransformationHelper; /** * @since 8.0 */ public class TransformationSearchHelper { private boolean caseSensitive = false; private boolean wholeWordMatch = false; /** * @since 5.0 */ public TransformationSearchHelper() { super(); } public Collection findTransformations( String searchStr ) throws CoreException { ModelWorkspaceManager manager = ModelWorkspaceManager.getModelWorkspaceManager(); ModelResource[] mResources = manager.getModelWorkspace().getModelResources(); Collection allAffectedTransforms = new ArrayList(); for (int i = 0; i < mResources.length; i++) { Collection transforms = findTransformations(searchStr, mResources[i]); if (!transforms.isEmpty()) { allAffectedTransforms.addAll(transforms); } } return allAffectedTransforms; } public Collection findTransformationTargets( String searchStr ) throws CoreException { ModelWorkspaceManager manager = ModelWorkspaceManager.getModelWorkspaceManager(); ModelResource[] mResources = manager.getModelWorkspace().getModelResources(); Collection allAffectedTransformTargets = new ArrayList(); for (int i = 0; i < mResources.length; i++) { Collection transformTargets = findTransformationTargets(searchStr, mResources[i]); if (!transformTargets.isEmpty()) { allAffectedTransformTargets.addAll(transformTargets); } } return allAffectedTransformTargets; } public Collection findTransformations( String searchStr, ModelResource mr ) throws ModelWorkspaceException { Collection allAffectedTransforms = new ArrayList(1); if (mr != null && mr.getModelTransformations() != null) { Collection allTransforms = mr.getModelTransformations().getTransformations(); Object nextObj = null; for (Iterator iter = allTransforms.iterator(); iter.hasNext();) { nextObj = iter.next(); if (TransformationHelper.isSqlTransformationMappingRoot(nextObj)) { SqlTransformationMappingRoot mappingRoot = (SqlTransformationMappingRoot)nextObj; if (searchTransformationRoot(searchStr, mappingRoot)) { allAffectedTransforms.add(nextObj); } } } } return allAffectedTransforms; } public Collection findTransformations( final String searchStr, final Resource resource ) { Collection allAffectedTransforms = new ArrayList(1); Collection allTransforms = getTransformations(resource); Object nextObj = null; for (Iterator iter = allTransforms.iterator(); iter.hasNext();) { nextObj = iter.next(); if (TransformationHelper.isSqlTransformationMappingRoot(nextObj)) { SqlTransformationMappingRoot mappingRoot = (SqlTransformationMappingRoot)nextObj; if (searchTransformationRoot(searchStr, mappingRoot)) { allAffectedTransforms.add(nextObj); } } } return allAffectedTransforms; } public Collection findTransformationTargets( final String searchStr, final Resource resource ) { Collection allAffectedTransforms = findTransformations(searchStr, resource); return getAllTransformationTargets(allAffectedTransforms); } public Collection findTransformationTargets( final String searchStr, final ModelResource resource ) throws ModelWorkspaceException { Collection allAffectedTransforms = findTransformations(searchStr, resource); return getAllTransformationTargets(allAffectedTransforms); } public boolean searchTransformationRoot( String searchStr, SqlTransformationMappingRoot mappingRoot ) { // Check if INSERT/UPDATE/DELETE should be searched boolean supportsUpdates = false; EObject mRootTarget = mappingRoot.getTarget(); SqlAspect sqlAspect = org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.getSqlAspect(mRootTarget); if (sqlAspect != null && (sqlAspect instanceof SqlTableAspect)) { supportsUpdates = ((SqlTableAspect)sqlAspect).supportsUpdate(mRootTarget); } boolean foundMatch = false; if (!caseSensitive) { String lowerCaseSearchStr = searchStr.toLowerCase(); String lowerCaseStr; String sqlStr = getUserSql(mappingRoot, QueryValidator.SELECT_TRNS); if (sqlStr != null) { lowerCaseStr = sqlStr.toLowerCase(); foundMatch = lowerCaseStr.indexOf(lowerCaseSearchStr) > -1; } if (!foundMatch && supportsUpdates) { sqlStr = getUserSql(mappingRoot, QueryValidator.INSERT_TRNS); if (sqlStr != null) { lowerCaseStr = sqlStr.toLowerCase(); foundMatch = lowerCaseStr.indexOf(lowerCaseSearchStr) > -1; } if (!foundMatch) { sqlStr = getUserSql(mappingRoot, QueryValidator.UPDATE_TRNS); if (sqlStr != null) { lowerCaseStr = sqlStr.toLowerCase(); foundMatch = lowerCaseStr.indexOf(lowerCaseSearchStr) > -1; } if (!foundMatch) { sqlStr = getUserSql(mappingRoot, QueryValidator.DELETE_TRNS); if (sqlStr != null) { lowerCaseStr = sqlStr.toLowerCase(); foundMatch = lowerCaseStr.indexOf(lowerCaseSearchStr) > -1; } } } } } else { String sqlStr = getUserSql(mappingRoot, QueryValidator.SELECT_TRNS); if (sqlStr != null) { foundMatch = sqlStr.indexOf(searchStr) > -1; } if (!foundMatch && supportsUpdates) { sqlStr = getUserSql(mappingRoot, QueryValidator.INSERT_TRNS); if (sqlStr != null) { foundMatch = sqlStr.indexOf(searchStr) > -1; } if (!foundMatch) { sqlStr = getUserSql(mappingRoot, QueryValidator.UPDATE_TRNS); if (sqlStr != null) { foundMatch = sqlStr.indexOf(searchStr) > -1; } if (!foundMatch) { sqlStr = getUserSql(mappingRoot, QueryValidator.DELETE_TRNS); if (sqlStr != null) { foundMatch = sqlStr.indexOf(searchStr) > -1; } } } } } return foundMatch; } public static Collection getTransformations( final Resource resource ) { CoreArgCheck.isNotNull(resource); Collection transformations = new ArrayList(); Collection contents = resource.getContents(); Iterator cIter = contents.iterator(); while (cIter.hasNext()) { Object obj = cIter.next(); if (obj instanceof TransformationContainer) { Collection mappings = ((TransformationContainer)obj).getTransformationMappings(); transformations.addAll(mappings); break; } } return transformations; } public static boolean hasUserSql( SqlTransformationMappingRoot mappingRoot, int sqlType ) { SqlTransformation sqlTransform = TransformationHelper.getUserSqlTransformation(mappingRoot); if (sqlTransform != null) { switch (sqlType) { case QueryValidator.SELECT_TRNS: { return sqlTransform.getSelectSql() != null; } case QueryValidator.UPDATE_TRNS: { return sqlTransform.getUpdateSql() != null; } case QueryValidator.INSERT_TRNS: { return sqlTransform.getInsertSql() != null; } case QueryValidator.DELETE_TRNS: { return sqlTransform.getDeleteSql() != null; } } } return false; } public static String getUserSql( SqlTransformationMappingRoot mappingRoot, int sqlType ) { SqlTransformation sqlTransform = TransformationHelper.getUserSqlTransformation(mappingRoot); if (sqlTransform != null) { switch (sqlType) { case QueryValidator.SELECT_TRNS: { return sqlTransform.getSelectSql(); } case QueryValidator.UPDATE_TRNS: { return sqlTransform.getUpdateSql(); } case QueryValidator.INSERT_TRNS: { return sqlTransform.getInsertSql(); } case QueryValidator.DELETE_TRNS: { return sqlTransform.getDeleteSql(); } } } return CoreStringUtil.Constants.EMPTY_STRING; } public Collection getAllTransformationTargets( Collection allTransforms ) { int nTransforms = allTransforms.size(); Collection allTargets = new ArrayList(nTransforms); for (Iterator iter = allTransforms.iterator(); iter.hasNext();) { Object obj = iter.next(); if (obj instanceof SqlTransformationMappingRoot) { EObject table = ((SqlTransformationMappingRoot)obj).getTarget(); if (table != null) { allTargets.add(table); } } } return allTargets; } public boolean isCaseSensitive() { return caseSensitive; } public void setCaseSensitive( boolean value ) { caseSensitive = value; } public boolean isWholeWordMatch() { return wholeWordMatch; } public void setWwholeWordMatch( boolean value ) { caseSensitive = wholeWordMatch; } }