/* * 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.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.mapping.Mapping; 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.index.IndexingContext; 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.SqlTransformationAspect; import org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationInfo; import org.teiid.designer.core.resource.EmfResource; import org.teiid.designer.metamodels.core.ModelImport; import org.teiid.designer.metamodels.transformation.TransformationMappingRoot; import org.teiid.designer.metamodels.transformation.TreeMappingRoot; import org.teiid.designer.metamodels.xml.XmlDocument; import org.teiid.designer.transformation.TransformationPlugin; import org.teiid.designer.xml.aspects.sql.MappingContext; /** * @since 8.0 */ public class TreeMappingRootSqlAspect extends TransformationMappingRootSqlAspect { private static final String[] TRANSFORMATION_TYPES = new String[] {SqlTransformationAspect.Types.MAPPING}; private static final String SCHEMA_EXTENTION = ".XSD"; //$NON-NLS-1$ protected TreeMappingRootSqlAspect( MetamodelEntity entity ) { super(entity); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getTransformedObject(org.eclipse.emf.ecore.EObject) */ @Override public Object getTransformedObject( EObject eObject ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); final TreeMappingRoot root = (TreeMappingRoot)eObject; EObject targetEObj = root.getTarget(); if (targetEObj == null) { TransformationPlugin.Util.log(IStatus.WARNING, TransformationPlugin.Util.getString("TreeMappingRootSqlAspect.0", ModelerCore.getObjectIdString(root))); //$NON-NLS-1$ } return targetEObj; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getInputObjects(org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public List getInputObjects( EObject eObject ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); final TransformationMappingRoot root = (TransformationMappingRoot)eObject; return root.getInputs(); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getNestedInputObjects(org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public List getNestedInputObjects( EObject eObject ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); final TransformationMappingRoot root = (TransformationMappingRoot)eObject; if (root.getNested() == null) { return Collections.EMPTY_LIST; } final List result = new ArrayList(); for (final Iterator iter = root.getNested().iterator(); iter.hasNext();) { final Mapping mapping = (Mapping)iter.next(); if (mapping != null) { result.addAll(mapping.getInputs()); } } return result; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getNestedOutputObjects(org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public List getNestedOutputObjects( EObject eObject ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); final TransformationMappingRoot root = (TransformationMappingRoot)eObject; if (root.getNested() == null) { return Collections.EMPTY_LIST; } final List result = new ArrayList(); for (final Iterator iter = root.getNested().iterator(); iter.hasNext();) { final Mapping mapping = (Mapping)iter.next(); if (mapping != null) { result.addAll(mapping.getOutputs()); } } return result; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getNestedInputsForOutput(org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public List getNestedInputsForOutput( EObject eObject, EObject output ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); final TransformationMappingRoot root = (TransformationMappingRoot)eObject; if (root.getNested() != null) { for (final Iterator iter = root.getNested().iterator(); iter.hasNext();) { final Mapping mapping = (Mapping)iter.next(); if (mapping != null && mapping.getOutputs().contains(output)) { return mapping.getInputs(); } } } return Collections.EMPTY_LIST; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getNestedOutputsForInput(org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public List getNestedOutputsForInput( EObject eObject, EObject input ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); final TransformationMappingRoot root = (TransformationMappingRoot)eObject; if (root.getNested() != null) { for (final Iterator iter = root.getNested().iterator(); iter.hasNext();) { final Mapping mapping = (Mapping)iter.next(); if (mapping != null && mapping.getInputs().contains(input)) { return mapping.getOutputs(); } } } return Collections.EMPTY_LIST; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getOutputObjects(org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public List getOutputObjects( EObject eObject ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); final TransformationMappingRoot root = (TransformationMappingRoot)eObject; return root.getOutputs(); } /** * @see org.teiid.designer.transformation.aspects.sql.MappingClassObjectSqlAspect#isRecordType(char) */ @Override public boolean isRecordType( char recordType ) { return (recordType == IndexConstants.RECORD_TYPE.MAPPING_TRANSFORM); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#isQueryable(org.eclipse.emf.ecore.EObject) */ @Override public boolean isQueryable( final EObject eObject ) { return true; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#getName(org.eclipse.emf.ecore.EObject) */ @Override public String getName( EObject eObject ) { final EObject transformedObject = (EObject)getTransformedObject(eObject); if (transformedObject == null) { return null; } final SqlAspect sqlAspect = AspectManager.getSqlAspect(transformedObject); if (sqlAspect != null) { return sqlAspect.getName(transformedObject); } return null; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#getFullName(org.eclipse.emf.ecore.EObject) */ @Override public String getFullName( EObject eObject ) { final EObject transformedObject = (EObject)getTransformedObject(eObject); if (transformedObject == null) { return null; } final SqlAspect sqlAspect = AspectManager.getSqlAspect(transformedObject); if (sqlAspect != null) { return sqlAspect.getFullName(transformedObject); } return null; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#getNameInSource(org.eclipse.emf.ecore.EObject) */ @Override public String getNameInSource( EObject eObject ) { final EObject transformedObject = (EObject)getTransformedObject(eObject); if (transformedObject == null) { return null; } final SqlAspect sqlAspect = AspectManager.getSqlAspect(transformedObject); if (sqlAspect != null) { return sqlAspect.getNameInSource(transformedObject); } return null; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getTransformationTypes(org.eclipse.emf.ecore.EObject) */ @Override public String[] getTransformationTypes( final EObject eObject ) { CoreArgCheck.isInstanceOf(TreeMappingRoot.class, eObject); return TRANSFORMATION_TYPES; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#isDeleteAllowed(org.eclipse.emf.ecore.EObject) * @since 4.3 */ @Override public boolean isDeleteAllowed( EObject eObject ) { return false; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#isInsertAllowed(org.eclipse.emf.ecore.EObject) * @since 4.3 */ @Override public boolean isInsertAllowed( EObject eObject ) { return false; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#isUpdateAllowed(org.eclipse.emf.ecore.EObject) * @since 4.3 */ @Override public boolean isUpdateAllowed( EObject eObject ) { return false; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getTransformation(org.eclipse.emf.ecore.EObject, * java.lang.String) */ @Override public String getTransformation( EObject eObject, String type ) { final XmlDocument xmlDoc = (XmlDocument)getTransformedObject(eObject); final MappingContext mappingContext = new MappingContext(this.getResourceSet(eObject)); final MappingDocumentFormatter formatter = MappingDocumentFormatter.create(xmlDoc, mappingContext); if (formatter != null) { try { final String result = formatter.createMappingString(); return result; } catch (Exception e) { TransformationPlugin.Util.log(e); } } return null; } private ResourceSet getResourceSet( final EObject eObject ) { final Resource eResource = eObject.eResource(); if (eResource != null) { return eResource.getResourceSet(); } try { return ModelerCore.getModelContainer(); } catch (CoreException e) { TransformationPlugin.Util.log(e); } return null; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlTransformationAspect#getTransformationInfo(org.eclipse.emf.ecore.EObject, org.teiid.designer.core.validation.ValidationContext, java.lang.String) */ @Override public SqlTransformationInfo getTransformationInfo( final EObject eObject, final IndexingContext context, final String type ) { final XmlDocument xmlDoc = (XmlDocument)getTransformedObject(eObject); List schemaPaths = new ArrayList(); // get the model relative paths of the schemas that the document resource depends upon final Resource eResource = xmlDoc.eResource(); if (eResource != null && eResource instanceof EmfResource) { final List modelImports = ((EmfResource)eResource).getModelAnnotation().getModelImports(); for (final Iterator iter = modelImports.iterator(); iter.hasNext();) { final ModelImport mdlImport = (ModelImport)iter.next(); if (mdlImport != null) { String modelPath = mdlImport.getModelLocation().toUpperCase(); // get the modeliports for schema if (modelPath.endsWith(SCHEMA_EXTENTION)) { schemaPaths.add(mdlImport.getModelLocation()); } } } final String result = getTransformation(eObject, type); SqlTransformationInfo info = new SqlTransformationInfo(result); info.setSchemaPaths(schemaPaths); return info; } final Object[] params = new Object[] {xmlDoc}; final String msg = TransformationPlugin.Util.getString("TreeMappingRootSqlAspect.could_not_get_resource_for_xmldoc", params); //$NON-NLS-1$ TransformationPlugin.Util.log(IStatus.ERROR, msg); return null; } /* * @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 ) { } }