/*
* 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.compare;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.mapping.Mapping;
import org.eclipse.emf.mapping.MappingFactory;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.core.designer.HashCodeUtil;
import org.teiid.designer.core.compare.AbstractEObjectMatcher;
import org.teiid.designer.core.compare.TwoPhaseEObjectMatcher;
import org.teiid.designer.metamodels.transformation.SqlTransformation;
/**
* @since 8.0
*/
public class SqlTransformationSqlToSqlMatcher extends AbstractEObjectMatcher implements TwoPhaseEObjectMatcher {
public SqlTransformationSqlToSqlMatcher() {
super();
}
/**
* @see org.teiid.designer.core.compare.EObjectMatcher#addMappingsForRoots(java.util.List, java.util.List,
* org.eclipse.emf.mapping.Mapping, org.eclipse.emf.mapping.MappingFactory)
*/
@Override
public void addMappingsForRoots( final List inputs,
final List outputs,
final Mapping mapping,
final MappingFactory factory ) {
}
/**
* @see org.teiid.designer.core.compare.EObjectMatcher#addMappings(org.eclipse.emf.ecore.EReference, java.util.List,
* java.util.List, org.eclipse.emf.mapping.Mapping, org.eclipse.emf.mapping.MappingFactory)
*/
@Override
public void addMappings( final EReference reference,
final List inputs,
final List outputs,
final Mapping mapping,
final MappingFactory factory ) {
}
/**
* @see org.teiid.designer.core.compare.TwoPhaseEObjectMatcher#addMappings(org.eclipse.emf.ecore.EReference,
* java.util.List, java.util.List, java.util.Map, org.eclipse.emf.mapping.Mapping,
* org.eclipse.emf.mapping.MappingFactory)
* @since 4.2
*/
@Override
public void addMappings( final EReference reference,
final List inputs,
final List outputs,
final Map inputsToOutputs,
final Mapping mapping,
final MappingFactory factory ) {
// Loop over the inputs and accumulate the select/insert/update/delete transforms ...
final Map sqlTransformsByTransforms = new HashMap();
for (final Iterator iter = inputs.iterator(); iter.hasNext();) {
final EObject obj = (EObject)iter.next();
if (obj instanceof SqlTransformation) {
final SqlTransformation inputTransformObj = (SqlTransformation)obj;
SqlTransformation nestedTransformObj = null;
EList nestedList = inputTransformObj.getNested();
for (Iterator nestIter = nestedList.iterator(); nestIter.hasNext();) {
EObject eObj = (EObject)nestIter.next();
if (eObj != null && eObj instanceof SqlTransformation) {
nestedTransformObj = (SqlTransformation)eObj;
break;
}
}
if (nestedTransformObj == null) {
nestedTransformObj = inputTransformObj;
}
SqlTransforms sqlTransforms = getSqlTransforms(nestedTransformObj);
sqlTransformsByTransforms.put(sqlTransforms, inputTransformObj);
}
}
// Loop over the outputs and compare the names ...
for (final Iterator outputIter = outputs.iterator(); outputIter.hasNext();) {
final EObject output = (EObject)outputIter.next();
if (output instanceof SqlTransformation) {
final SqlTransformation outputTransform = (SqlTransformation)output;
SqlTransformation nestedTransformObj = null;
EList nestedList = outputTransform.getNested();
for (Iterator nestIter = nestedList.iterator(); nestIter.hasNext();) {
EObject eObj = (EObject)nestIter.next();
if (eObj != null && eObj instanceof SqlTransformation) {
nestedTransformObj = (SqlTransformation)eObj;
break;
}
}
if (nestedTransformObj == null) {
nestedTransformObj = outputTransform;
}
SqlTransforms sqlTransforms = getSqlTransforms(nestedTransformObj);
SqlTransformation inputTransformation = (SqlTransformation)sqlTransformsByTransforms.get(sqlTransforms);
if (inputTransformation != null) {
inputs.remove(inputTransformation);
outputIter.remove();
addMapping(inputTransformation, outputTransform, mapping, factory);
inputsToOutputs.put(inputTransformation, outputTransform);
}
}
}
}
/**
* @see org.teiid.designer.core.compare.TwoPhaseEObjectMatcher#addMappingsForRoots(java.util.List, java.util.List,
* java.util.Map, org.eclipse.emf.mapping.Mapping, org.eclipse.emf.mapping.MappingFactory)
* @since 4.2
*/
@Override
public void addMappingsForRoots( final List inputs,
final List outputs,
final Map inputsToOutputs,
final Mapping mapping,
final MappingFactory factory ) {
addMappings(null, inputs, outputs, inputsToOutputs, mapping, factory);
}
private SqlTransforms getSqlTransforms( SqlTransformation transform ) {
SqlTransforms sqlTransforms = new SqlTransforms();
sqlTransforms.setSelectSql(transform.getSelectSql());
sqlTransforms.setInsertSql(transform.getInsertSql());
sqlTransforms.setUpdateSql(transform.getUpdateSql());
sqlTransforms.setDeleteSql(transform.getDeleteSql());
return sqlTransforms;
}
class SqlTransforms {
private String selectSql;
private String insertSql;
private String updateSql;
private String deleteSql;
/**
* @return Returns the deleteSql.
* @since 4.2
*/
public String getDeleteSql() {
return this.deleteSql;
}
/**
* @param deleteSql The deleteSql to set.
* @since 4.2
*/
public void setDeleteSql( String deleteSql ) {
this.deleteSql = deleteSql;
}
/**
* @return Returns the insertSql.
* @since 4.2
*/
public String getInsertSql() {
return this.insertSql;
}
/**
* @param insertSql The insertSql to set.
* @since 4.2
*/
public void setInsertSql( String insertSql ) {
this.insertSql = insertSql;
}
/**
* @return Returns the selectSql.
* @since 4.2
*/
public String getSelectSql() {
return this.selectSql;
}
/**
* @param selectSql The selectSql to set.
* @since 4.2
*/
public void setSelectSql( String selectSql ) {
this.selectSql = selectSql;
}
/**
* @return Returns the updateSql.
* @since 4.2
*/
public String getUpdateSql() {
return this.updateSql;
}
/**
* @param updateSql The updateSql to set.
* @since 4.2
*/
public void setUpdateSql( String updateSql ) {
this.updateSql = updateSql;
}
@Override
public boolean equals( Object obj ) {
if (obj == this) {
return true;
}
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
SqlTransforms sqlTransforms = (SqlTransforms)obj;
if (equalsIgnoreCase(this.getSelectSql(), sqlTransforms.getSelectSql())
&& equalsIgnoreCase(this.getInsertSql(), sqlTransforms.getInsertSql())
&& equalsIgnoreCase(this.getUpdateSql(), sqlTransforms.getUpdateSql())
&& equalsIgnoreCase(this.getDeleteSql(), sqlTransforms.getDeleteSql())) {
return true;
}
return false;
}
@Override
public int hashCode() {
int myHash = 0;
if (this.selectSql != null) {
myHash = HashCodeUtil.hashCode(myHash, this.selectSql.toUpperCase());
}
if (this.insertSql != null) {
myHash = HashCodeUtil.hashCode(myHash, this.insertSql.toUpperCase());
}
if (this.deleteSql != null) {
myHash = HashCodeUtil.hashCode(myHash, this.deleteSql.toUpperCase());
}
if (this.updateSql != null) {
myHash = HashCodeUtil.hashCode(myHash, this.updateSql.toUpperCase());
}
return myHash;
}
private boolean equalsIgnoreCase( String string1,
String string2 ) {
if (CoreStringUtil.isEmpty(string1) && CoreStringUtil.isEmpty(string2)) {
return true;
} else if (CoreStringUtil.isEmpty(string1) || CoreStringUtil.isEmpty(string2)) {
return false;
}
return string1.equalsIgnoreCase(string2);
}
}
}