/* * 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.xml.aspects.sql; import java.util.Map; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; 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.metamodel.aspect.sql.SqlTableAspect; import org.teiid.designer.core.types.DatatypeConstants; import org.teiid.designer.core.types.DatatypeManager; import org.teiid.designer.metamodels.transformation.MappingClassColumn; import org.teiid.designer.metamodels.xml.XmlAttribute; import org.teiid.designer.metamodels.xml.XmlElement; import org.teiid.designer.xml.PluginConstants; /** * XmlContainerNodeSqlAspect * * @since 8.0 */ public class XmlAttributeSqlAspect extends AbstractXmlDocumentEntitySqlAspect implements SqlColumnAspect { private static char NAME_PREFIX = '@'; /** * Construct an instance of XmlContainerNodeSqlAspect. */ public XmlAttributeSqlAspect( final MetamodelEntity entity ) { super(entity); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#isRecordType(char) */ @Override public boolean isRecordType( final char recordType ) { return (recordType == IndexConstants.RECORD_TYPE.COLUMN); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#getName(org.eclipse.emf.ecore.EObject) */ @Override public String getName( final EObject eObject ) { CoreArgCheck.isInstanceOf(XmlAttribute.class, eObject); IPath path = new Path(getShortName(eObject)); EObject parent = eObject.eContainer(); SqlAspect parentAspect = AspectManager.getSqlAspect(parent); while (parentAspect != null) { if (parentAspect instanceof SqlColumnAspect) { String name = null; if (parentAspect instanceof AbstractXmlDocumentEntitySqlAspect) { name = ((AbstractXmlDocumentEntitySqlAspect)parentAspect).getShortName(parent); } else { name = parentAspect.getName(parent); } path = new Path("").append(name).append(path); //$NON-NLS-1$ } else if (parentAspect instanceof SqlTableAspect) { break; } // Walk up to the parent ... parent = parent.eContainer(); parentAspect = AspectManager.getSqlAspect(parent); } return path.toString().replace(IPath.SEPARATOR, '.'); } @Override protected String getShortName( final EObject eObject ) { CoreArgCheck.isInstanceOf(XmlAttribute.class, eObject); XmlAttribute xmlAttribute = (XmlAttribute)eObject; String name = NAME_PREFIX + xmlAttribute.getName(); return name; } @Override protected String getParentFullName( EObject eObject ) { EObject parent = eObject.eContainer(); if (parent != null) { SqlAspect parentAspect = AspectManager.getSqlAspect(parent); while (parentAspect != null) { if (parentAspect instanceof SqlTableAspect) { return parentAspect.getFullName(parent); } parent = parent.eContainer(); if (parent != null) { parentAspect = AspectManager.getSqlAspect(parent); } else { return null; } } } return null; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getCharOctetLength(org.eclipse.emf.ecore.EObject) */ @Override public int getCharOctetLength( EObject eObject ) { return XmlElementSqlAspect.CHAR_OCTET_LENGTH; } /** * @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#getDatatype(org.eclipse.emf.ecore.EObject) */ @Override public EObject getDatatype( EObject eObject ) { CoreArgCheck.isInstanceOf(XmlAttribute.class, eObject); XmlAttribute xmlAttribute = (XmlAttribute)eObject; // Defect 23709 - this method was getting called from the property page after the XML Attribute was deleted, so the // attribute's element was NULL. XmlElement xmlElement = xmlAttribute.getElement(); if (xmlElement != null) { XmlElementSqlAspect elementAspect = getXmlElementAspect(xmlElement); Map elementMap = elementAspect.getMappingInfo(xmlAttribute); Object lookupObj = elementMap.get(xmlAttribute); if (lookupObj != null) { CoreArgCheck.isInstanceOf(MappingClassColumn.class, lookupObj, null); MappingClassColumn mapingColumn = (MappingClassColumn)lookupObj; return mapingColumn.getType(); } try { return ModelerCore.getDatatypeManager(eObject).getBuiltInDatatype(DatatypeConstants.BuiltInNames.STRING); } catch (Throwable e) { }// ignore } return null; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatypeName(org.eclipse.emf.ecore.EObject) */ @Override public String getDatatypeName( EObject eObject ) { EObject datatype = getDatatype(eObject); final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(eObject, true); final String dtName = dtMgr.getName(datatype); return dtName == null ? DatatypeConstants.BuiltInNames.STRING : dtName; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatypeObjectID(org.eclipse.emf.ecore.EObject) */ @Override public String getDatatypeObjectID( EObject eObject ) { EObject datatype = getDatatype(eObject); try { if (datatype == null) { datatype = ModelerCore.getWorkspaceDatatypeManager().getBuiltInDatatype(DatatypeConstants.BuiltInNames.STRING); } } catch (Throwable e) { }// ignore final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(eObject, true); return dtMgr.getUuidString(datatype) == null ? "" : dtMgr.getUuidString(datatype); //$NON-NLS-1$ } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDefaultValue(org.eclipse.emf.ecore.EObject) */ @Override public String getDefaultValue( EObject eObject ) { return XmlElementSqlAspect.DEFAULT_VALUE; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getFormat(org.eclipse.emf.ecore.EObject) */ @Override public String getFormat( EObject eObject ) { return XmlElementSqlAspect.FORMAT; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getLength(org.eclipse.emf.ecore.EObject) */ @Override public int getLength( EObject eObject ) { return XmlElementSqlAspect.LENGTH; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getMaxValue(org.eclipse.emf.ecore.EObject) */ @Override public Object getMaxValue( EObject eObject ) { return XmlElementSqlAspect.MIN_VALUE; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getMinValue(org.eclipse.emf.ecore.EObject) */ @Override public Object getMinValue( EObject eObject ) { return XmlElementSqlAspect.MAX_VALUE; } /** * @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 XmlElementSqlAspect.DISTINCT_VALUES; } /** * @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 XmlElementSqlAspect.NULL_VALUES; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getNullType(org.eclipse.emf.ecore.EObject) */ @Override public int getNullType( EObject eObject ) { return XmlElementSqlAspect.NULL_TYPE; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getPosition(org.eclipse.emf.ecore.EObject) */ @Override public int getPosition( EObject eObject ) { return XmlElementSqlAspect.POSITION; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getPrecision(org.eclipse.emf.ecore.EObject) */ @Override public int getPrecision( EObject eObject ) { return XmlElementSqlAspect.PRECISION; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getRadix(org.eclipse.emf.ecore.EObject) */ @Override public int getRadix( EObject eObject ) { return XmlElementSqlAspect.RADIX; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getRuntimeType(org.eclipse.emf.ecore.EObject) */ @Override public String getRuntimeType( EObject eObject ) { final EObject datatype = getDatatype(eObject); final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(eObject, true); final String rtt = dtMgr.getRuntimeTypeName(datatype); return rtt == null ? DatatypeConstants.RuntimeTypeNames.STRING : rtt; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getScale(org.eclipse.emf.ecore.EObject) */ @Override public int getScale( EObject eObject ) { return XmlElementSqlAspect.SCALE; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getSearchType(org.eclipse.emf.ecore.EObject) */ @Override public int getSearchType( EObject eObject ) { return XmlElementSqlAspect.SEARCH_TYPE; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isAutoIncrementable(org.eclipse.emf.ecore.EObject) */ @Override public boolean isAutoIncrementable( EObject eObject ) { return XmlElementSqlAspect.AUTO_INCREMENT; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isCaseSensitive(org.eclipse.emf.ecore.EObject) */ @Override public boolean isCaseSensitive( EObject eObject ) { return XmlElementSqlAspect.CASE_SENSITIVE; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isCurrency(org.eclipse.emf.ecore.EObject) */ @Override public boolean isCurrency( EObject eObject ) { return XmlElementSqlAspect.CURRENCY; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isFixedLength(org.eclipse.emf.ecore.EObject) */ @Override public boolean isFixedLength( EObject eObject ) { return XmlElementSqlAspect.FIXED_LENGTH; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isSelectable(org.eclipse.emf.ecore.EObject) */ @Override public boolean isSelectable( EObject eObject ) { return XmlElementSqlAspect.SELECTABLE; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isSigned(org.eclipse.emf.ecore.EObject) */ @Override public boolean isSigned( EObject eObject ) { return XmlElementSqlAspect.SIGNED; } /** * @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 XmlElementSqlAspect.TRANSFORMATION_INPUT_PARAMETER; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isUpdatable(org.eclipse.emf.ecore.EObject) */ @Override public boolean isUpdatable( EObject eObject ) { return XmlElementSqlAspect.UPDATABLE; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#canSetDatatype() * @since 4.2 */ @Override public boolean canSetDatatype() { return false; } /* * @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 ) { throw new UnsupportedOperationException( PluginConstants.Util.getString("XmlAttributeSqlAspect.Datatype_cannot_be_set_on_an_XMLAttribute_1")); //$NON-NLS-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( PluginConstants.Util.getString("XmlAttributeSqlAspect.Length_cannot_be_set_on_an_XMLAttribute_2")); //$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( PluginConstants.Util.getString("XmlAttributeSqlAspect.NullType_cannot_be_set_on_an_XMLAttribute_3")); //$NON-NLS-1$ } private XmlElementSqlAspect getXmlElementAspect( EObject eObject ) { CoreArgCheck.isInstanceOf(XmlElement.class, eObject); XmlElement element = (XmlElement)eObject; // get xmlElement aspect for the element return (XmlElementSqlAspect)AspectManager.getSqlAspect(element); } /* * @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 ) { } /** * @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 ) { // there is no datattype feature on xml attributes return false; } }