/*
* 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.aspects.sql;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.mapping.Mapping;
import org.eclipse.emf.mapping.MappingRoot;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.index.IndexConstants;
import org.teiid.designer.core.metamodel.aspect.AspectManager;
import org.teiid.designer.core.metamodel.aspect.MetamodelEntity;
import org.teiid.designer.core.metamodel.aspect.sql.SqlAspect;
import org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect;
import org.teiid.designer.core.types.DatatypeManager;
import org.teiid.designer.core.util.ModelContents;
import org.teiid.designer.metamodels.relational.SearchabilityType;
import org.teiid.designer.metamodels.transformation.MappingClass;
import org.teiid.designer.metamodels.transformation.MappingClassColumn;
import org.teiid.designer.metamodels.transformation.MappingClassSet;
import org.teiid.designer.metamodels.transformation.TransformationPackage;
import org.teiid.designer.metamodels.transformation.TreeMappingRoot;
import org.teiid.designer.metamodels.xml.XmlDocument;
import org.teiid.designer.metamodels.xml.XmlValueHolder;
import org.teiid.designer.transformation.TransformationPlugin;
/**
* MappingClassColumnSqlAspect
*
* @since 8.0
*/
public class MappingClassColumnSqlAspect extends MappingClassObjectSqlAspect implements SqlColumnAspect {
/**
* Construct an instance of MappingClassColumnSqlAspect.
*/
public MappingClassColumnSqlAspect( MetamodelEntity entity ) {
super(entity);
}
/**
* @see org.teiid.designer.transformation.aspects.sql.MappingClassObjectSqlAspect#isRecordType(char)
*/
@Override
public boolean isRecordType( char recordType ) {
return (recordType == IndexConstants.RECORD_TYPE.COLUMN);
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#isQueryable(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isQueryable( final EObject eObject ) {
return true;
}
private List getElementsFromMappingClassColumn( MappingClassColumn column ) {
EObject mc = column.eContainer();
CoreArgCheck.isInstanceOf(MappingClass.class, mc);
EObject mcs = ((MappingClass)mc).eContainer();
CoreArgCheck.isInstanceOf(MappingClassSet.class, mcs);
EObject target = ((MappingClassSet)mcs).getTarget();
CoreArgCheck.isInstanceOf(XmlDocument.class, target);
XmlDocument document = (XmlDocument)target;
Resource documentResource = document.eResource();
// model contents for this resource
ModelContents mdlContents = new ModelContents(documentResource);
Iterator contentIter = mdlContents.getTransformations(document).iterator();
// get the mapping root associated with the transformation
while (contentIter.hasNext()) {
MappingRoot mappingRoot = (MappingRoot)contentIter.next();
// if there is a mapping root
if (mappingRoot != null && mappingRoot instanceof TreeMappingRoot) {
for (Iterator mappingIter = mappingRoot.getNested().iterator(); mappingIter.hasNext();) {
Mapping nestedMapping = (Mapping)mappingIter.next();
// mapping Class columns
List inputColumns = nestedMapping.getInputs();
// xml elements
List outputElements = nestedMapping.getOutputs();
if (inputColumns.contains(column)) {
return outputElements;
}
}
}
}
return Collections.EMPTY_LIST;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isSelectable(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isSelectable( EObject eObject ) {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isUpdatable(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isUpdatable( EObject eObject ) {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getNullType(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getNullType( EObject eObject ) {
return 1;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isAutoIncrementable(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isAutoIncrementable( EObject eObject ) {
return false;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isCaseSensitive(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isCaseSensitive( EObject eObject ) {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isSigned(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isSigned( EObject eObject ) {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isCurrency(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isCurrency( EObject eObject ) {
return false;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isFixedLength(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isFixedLength( EObject eObject ) {
return false;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isTranformationInputParameter(org.eclipse.emf.ecore.EObject)
* @since 4.2
*/
@Override
public boolean isTranformationInputParameter( EObject eObject ) {
return !isSelectable(eObject);
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getSearchType(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getSearchType( EObject eObject ) {
return SearchabilityType.SEARCHABLE;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDefaultValue(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDefaultValue( EObject eObject ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
List elements = getElementsFromMappingClassColumn((MappingClassColumn)eObject);
if (elements.size() != 1) {
return null;
}
XmlValueHolder valueHolder = (XmlValueHolder)elements.get(0);
if ((valueHolder.isValueDefault() || valueHolder.isValueFixed()) && valueHolder.getValue() != null) {
return valueHolder.getValue();
}
return null;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getMinValue(org.eclipse.emf.ecore.EObject)
*/
@Override
public Object getMinValue( EObject eObject ) {
return null;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getMaxValue(org.eclipse.emf.ecore.EObject)
*/
@Override
public Object getMaxValue( EObject eObject ) {
return null;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getFormat(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getFormat( EObject eObject ) {
return null;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getLength(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getLength( EObject eObject ) {
return 0;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getScale(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getScale( EObject eObject ) {
return 0;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getRadix(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getRadix( EObject eObject ) {
return 0;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDistinctValues(org.eclipse.emf.ecore.EObject)
* @since 4.3
*/
@Override
public int getDistinctValues( EObject eObject ) {
return 0;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getNullValues(org.eclipse.emf.ecore.EObject)
* @since 4.3
*/
@Override
public int getNullValues( EObject eObject ) {
return 0;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getNativeType(org.eclipse.emf.ecore.EObject)
* @since 4.2
*/
@Override
public String getNativeType( EObject eObject ) {
return null;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatypeName(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDatatypeName( EObject eObject ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
MappingClassColumn column = (MappingClassColumn)eObject;
final EObject dataType = column.getType();
final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(column, true);
final String dtName = dtMgr.getName(dataType);
return dtName == null ? "" : dtName; //$NON-NLS-1$
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#canSetDatatype()
* @since 4.2
*/
@Override
public boolean canSetDatatype() {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#setDatatype(org.eclipse.emf.ecore.EObject,
* org.teiid.designer.metamodels.core.Datatype)
*/
@Override
public void setDatatype( EObject eObject,
EObject datatype ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
MappingClassColumn column = (MappingClassColumn)eObject;
column.setType(datatype);
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatype(org.eclipse.emf.ecore.EObject)
*/
@Override
public EObject getDatatype( EObject eObject ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
MappingClassColumn column = (MappingClassColumn)eObject;
return column.getType();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getRuntimeType(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getRuntimeType( EObject eObject ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
MappingClassColumn column = (MappingClassColumn)eObject;
final EObject datatype = column.getType();
final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(column, true);
final String rtType = dtMgr.getRuntimeTypeName(datatype);
return rtType == null ? "" : rtType; //$NON-NLS-1$
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatypeObjectID(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDatatypeObjectID( EObject eObject ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
MappingClassColumn column = (MappingClassColumn)eObject;
final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(column, true);
return dtMgr.getUuidString(column.getType());
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getPrecision(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getPrecision( EObject eObject ) {
return 0;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getCharOctetLength(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getCharOctetLength( EObject eObject ) {
return 0;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getPosition(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getPosition( EObject eObject ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
MappingClassColumn column = (MappingClassColumn)eObject;
MappingClass mappingClass = column.getMappingClass();
CoreArgCheck.isNotNull(mappingClass);
// correct from '0' to '1' based position
return mappingClass.getColumns().indexOf(column) + 1;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#canSetLength()
* @since 4.2
*/
@Override
public boolean canSetLength() {
return false;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#setLength(org.eclipse.emf.ecore.EObject, int)
*/
@Override
public void setLength( EObject eObject,
int length ) {
throw new UnsupportedOperationException(
TransformationPlugin.Util.getString("MappingClassColumnSqlAspect.Length_cannot_be_set_on_a_MappingClassColumn_1")); //$NON-NLS-1$
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#canSetNullType()
* @since 4.2
*/
@Override
public boolean canSetNullType() {
return false;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#setNullType(org.eclipse.emf.ecore.EObject, int)
*/
@Override
public void setNullType( EObject eObject,
int nullType ) {
throw new UnsupportedOperationException(
TransformationPlugin.Util.getString("MappingClassColumnSqlAspect.NullType_cannot_be_set_on_a_MappingClassColumn_2")); //$NON-NLS-1$
}
/*
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#updateObject(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)
*/
@Override
public void updateObject( EObject targetObject,
EObject sourceObject ) {
CoreArgCheck.isNotNull(sourceObject);
SqlAspect columnAspect = AspectManager.getSqlAspect(sourceObject);
CoreArgCheck.isInstanceOf(SqlColumnAspect.class, columnAspect);
// get the source column type
EObject srcType = ((SqlColumnAspect)columnAspect).getDatatype(sourceObject);
setDatatype(targetObject, srcType);
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isDatatypeFeature(org.eclipse.emf.ecore.EObject,
* org.eclipse.emf.ecore.EStructuralFeature)
*/
@Override
public boolean isDatatypeFeature( final EObject eObject,
final EStructuralFeature eFeature ) {
CoreArgCheck.isInstanceOf(MappingClassColumn.class, eObject);
final EObjectImpl eObjectImpl = super.getEObjectImpl(eObject);
if (eObjectImpl != null) {
switch (eObjectImpl.eDerivedStructuralFeatureID(eFeature)) {
case TransformationPackage.MAPPING_CLASS_COLUMN__TYPE:
return true;
}
}
return false;
}
}