/*
* 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.ui.util;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.sql.SqlColumnSetAspect;
import org.teiid.designer.core.metamodel.aspect.sql.SqlProcedureAspect;
import org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.metadata.runtime.MetadataRecord;
import org.teiid.designer.metamodels.transformation.InputSet;
import org.teiid.designer.query.IQueryFactory;
import org.teiid.designer.query.IQueryService;
import org.teiid.designer.query.metadata.IMetadataID;
import org.teiid.designer.query.sql.lang.IExpression;
import org.teiid.designer.query.sql.lang.IStoredProcedure;
import org.teiid.designer.query.sql.symbol.IElementSymbol;
import org.teiid.designer.query.sql.symbol.IGroupSymbol;
import org.teiid.designer.transformation.util.TransformationHelper;
import org.teiid.designer.transformation.util.TransformationSqlHelper;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
import org.teiid.query.ui.builder.util.ElementViewerFactory;
/**
* BuilderTreeProvider is the modeler's content and label provider for the Criteria and
* Expression builder dialogs in query.iu. Creating this object will cause it to be
* hooked up properly to the ElementViewerFactory.
*
* @since 8.0
*/
public class BuilderTreeProvider implements ITreeContentProvider, ILabelProvider {
ILabelProvider emfLabelProvider;
/**
* Construct an instance of BuilderTreeProvider.
*/
public BuilderTreeProvider() {
ElementViewerFactory.setContentProvider(this);
ElementViewerFactory.setLabelProvider(this);
emfLabelProvider = ModelUtilities.getEMFLabelProvider();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren(Object parentElement) {
IQueryService queryService = ModelerCore.getTeiidQueryService();
IQueryFactory factory = queryService.createQueryFactory();
Object[] result = new Object[0];
if ( parentElement instanceof EObject ) {
if (parentElement instanceof InputSet) {
IGroupSymbol group = factory.createGroupSymbol(getText(parentElement));
group.setMetadataID(parentElement);
return getChildren(group);
} else if ( org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isTable((EObject) parentElement) ) {
SqlTableAspect tableAspect = (SqlTableAspect) org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.getSqlAspect((EObject) parentElement);
result = tableAspect.getColumns((EObject) parentElement).toArray();
} else if (org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isProcedure((EObject)parentElement)) {
List inParams = TransformationHelper.getInAndInoutParameters((EObject)parentElement);
result = new Object[inParams.size()];
IGroupSymbol group = factory.createGroupSymbol(getText(parentElement));
group.setMetadataID(parentElement);
for (int i = 0; i < result.length; i++) {
result[i] = TransformationSqlHelper.createElemSymbol((EObject)inParams.get(i), group);
}
} else if ( org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isProcedureResultSet( (EObject)parentElement) ) {
SqlColumnSetAspect colSetAspect = (SqlColumnSetAspect) org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.getSqlAspect((EObject) parentElement);
IGroupSymbol group = factory.createGroupSymbol(colSetAspect.getFullName((EObject)parentElement));
group.setMetadataID(parentElement);
List cols = colSetAspect.getColumns((EObject)parentElement);
result = new Object[cols.size()];
for (int i = 0; i < result.length; i++) {
result[i] = TransformationSqlHelper.createElemSymbol((EObject) cols.get(i), group);
}
}
} else if ( parentElement instanceof IGroupSymbol ) {
IGroupSymbol groupSymbol = (IGroupSymbol) parentElement;
EObject group = null;
if ( groupSymbol.getMetadataID() instanceof EObject ) {
// get the object out of the ID and work directly with it
group = (EObject) groupSymbol.getMetadataID();
if ( group instanceof InputSet ) {
List children = ((InputSet) group).getInputParameters();
result = new Object[children.size()];
for ( int i=0 ; i<children.size() ; ++i ) {
Object child = children.get(i);
IElementSymbol elementSymbol = factory.createElementSymbol(getText(child));
elementSymbol.setMetadataID(child);
elementSymbol.setGroupSymbol(groupSymbol);
result[i] = elementSymbol;
}
} else if ( org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isProcedureResultSet( group ) ) {
SqlColumnSetAspect colSetAspect = (SqlColumnSetAspect) org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.getSqlAspect(group);
List cols = colSetAspect.getColumns(group);
result = new Object[cols.size()];
for (int i = 0; i < result.length; i++) {
result[i] = TransformationSqlHelper.createElemSymbol((EObject) cols.get(i), groupSymbol);
}
} else {
result = new Object[group.eContents().size()];
for ( int i=0 ; i<result.length ; ++i ) {
Object child = group.eContents().get(i);
IElementSymbol elementSymbol = factory.createElementSymbol(getText(child));
elementSymbol.setMetadataID(child);
elementSymbol.setGroupSymbol(groupSymbol);
elementSymbol.setDisplayFullyQualified(true);
result[i] = elementSymbol;
}
}
} else if (groupSymbol.getMetadataID() instanceof IMetadataID) {
IMetadataID tempMetadataID = (IMetadataID) groupSymbol.getMetadataID();
List children = tempMetadataID.getElements();
result = new Object[children.size()];
for ( int i=0 ; i<result.length ; ++i ) {
Object child = children.get(i);
IElementSymbol elementSymbol = factory.createElementSymbol(getText(child));
elementSymbol.setMetadataID(child);
elementSymbol.setGroupSymbol(groupSymbol);
elementSymbol.setDisplayFullyQualified(true);
result[i] = elementSymbol;
}
} else {
// use TransformationSqlEditor to resolve the object
group = TransformationSqlHelper.getGroupSymbolEObject((IGroupSymbol) parentElement);
result = getChildren(group);
// always create element symbols for the tree
Object[] aliasedElements = new Object[result.length];
for ( int i=0 ; i<result.length ; ++i ) {
IExpression elementSymbol = TransformationSqlHelper.createElemSymbol((EObject) result[i], (IGroupSymbol) parentElement);
aliasedElements[i] = elementSymbol;
}
result = aliasedElements;
}
} else if (parentElement instanceof IStoredProcedure) {
String procName = ((IStoredProcedure)parentElement).getGroupName();
EObject element = TransformationSqlHelper.getStoredProcedureEObject((IStoredProcedure)parentElement);
if(element!=null && org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isProcedure(element)) {
SqlProcedureAspect procAspect = (SqlProcedureAspect)org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.getSqlAspect(element);
Object resultSet = procAspect.getResult(element);
if(org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.isProcedureResultSet((EObject)resultSet)) {
SqlColumnSetAspect rsAspect = (SqlColumnSetAspect)org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper.getSqlAspect((EObject)resultSet);
String rsName = rsAspect.getName((EObject)resultSet);
IGroupSymbol rsGroup = factory.createGroupSymbol(procName+'.'+rsName);
rsGroup.setMetadataID(resultSet);
result = new Object[1];
result[0] = rsGroup;
}
}
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent(Object element) {
Object result = null;
if ( element instanceof EObject ) {
result = ((EObject)element).eContainer();
if ( result == null ) {
result = ModelUtilities.getModelResourceForModelObject((EObject) element);
}
} else if (element instanceof IElementSymbol) {
IElementSymbol es = (IElementSymbol)element;
result = es.getGroupSymbol();
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object obj) {
if ( obj instanceof IGroupSymbol ) {
EObject group = TransformationSqlHelper.getGroupSymbolEObject((IGroupSymbol) obj);
return emfLabelProvider.getImage(group);
} else if ( obj instanceof IElementSymbol ) {
EObject element = TransformationSqlHelper.getElementSymbolEObject((IElementSymbol) obj);
return emfLabelProvider.getImage(element);
} else if (obj instanceof IStoredProcedure) {
EObject element = TransformationSqlHelper.getStoredProcedureEObject((IStoredProcedure)obj);
return emfLabelProvider.getImage(element);
} else if ( obj instanceof MetadataRecord ) {
return emfLabelProvider.getImage(((MetadataRecord) obj).getEObject());
}
return emfLabelProvider.getImage(obj);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object obj) {
if ( obj instanceof IGroupSymbol ) {
IGroupSymbol symbol = (IGroupSymbol) obj;
String result = null;
// if symbol has a non-null definition, then it is an alias:
if ( symbol.getDefinition() == null ) {
result = symbol.getName();
} else {
result = symbol.getDefinition();
result += " AS " + symbol.getName(); //$NON-NLS-1$ "AS" is SQL, not English - do not internationalize
}
return result;
} else if (obj instanceof IElementSymbol ) {
return ((IElementSymbol) obj).getName();
} else if (obj instanceof InputSet) {
return "INPUTS"; //$NON-NLS-1$
} else if ( obj instanceof ModelResource ) {
return ModelerCore.getModelEditor().getModelName((ModelResource) obj);
} if (obj instanceof IMetadataID) {
return ((IMetadataID) obj).getID();
} else if ( obj instanceof EObject &&
( TransformationHelper.isSqlColumn(obj) ||
TransformationHelper.isSqlTable(obj)) ||
TransformationHelper.isSqlProcedure(obj) ||
TransformationHelper.isSqlProcedureParameter(obj)) {
return TransformationHelper.getSqlEObjectFullName((EObject)obj);
} else if( obj instanceof IStoredProcedure ) {
IStoredProcedure proc = (IStoredProcedure)obj;
return proc.getGroupName();
}
return emfLabelProvider.getText(obj);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements(Object inputElement) {
Object[] result = new Object[0];
if ( inputElement instanceof Collection ) {
result = ((Collection) inputElement).toArray();
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
@Override
public void dispose() {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void addListener(ILabelProviderListener listener) {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
@Override
public boolean isLabelProperty(Object element, String property) {
return emfLabelProvider.isLabelProperty(element, property);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void removeListener(ILabelProviderListener listener) {
}
}