/* * 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.query.ui.tree; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.query.SetQueryUtil; import org.teiid.designer.query.IQueryService; import org.teiid.designer.query.sql.IValueIteratorProviderCollectorVisitor; import org.teiid.designer.query.sql.lang.ICommand; import org.teiid.designer.query.sql.lang.ICriteria; import org.teiid.designer.query.sql.lang.IFrom; import org.teiid.designer.query.sql.lang.IFromClause; import org.teiid.designer.query.sql.lang.IJoinPredicate; import org.teiid.designer.query.sql.lang.IQuery; import org.teiid.designer.query.sql.lang.ISetQuery; import org.teiid.designer.query.sql.lang.ISubqueryContainer; import org.teiid.designer.query.sql.lang.ISubqueryFromClause; import org.teiid.designer.query.sql.lang.IUnaryFromClause; /** * QueryTreeContentProvider is the content provider for the QueryTreeViewer. It handles * LanguageObjects in a Command and breaks out individual Query objects inside a SetQuery * and From and Criteria objects inside a Query. * @since 8.0 */ public class QueryTreeContentProvider implements ITreeContentProvider { //////////////////////////////////////////////////////////////////////////////////////// // STATIC VARIABLES //////////////////////////////////////////////////////////////////////////////////////// public static QueryTreeContentProvider instance = null; //////////////////////////////////////////////////////////////////////////////////////// // STATIC METHODS //////////////////////////////////////////////////////////////////////////////////////// public static QueryTreeContentProvider getInstance() { if (instance == null) { instance = new QueryTreeContentProvider(); } return instance; } //////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS //////////////////////////////////////////////////////////////////////////////////////// private QueryTreeContentProvider() { super(); } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) * @since 4.2 */ @Override public Object[] getChildren(Object obj) { if ( obj instanceof ISetQuery) { return SetQueryUtil.getQueryList((ISetQuery)obj).toArray(); } else if ( obj instanceof IQuery ) { if ( ((IQuery) obj).getCriteria() == null ) { return new Object[] { ((IQuery) obj).getFrom() }; } return new Object[] { ((IQuery) obj).getFrom(), ((IQuery) obj).getCriteria() }; } else if ( obj instanceof IFrom ) { Collection clauses = ((IFrom) obj).getClauses(); ArrayList children = new ArrayList(clauses.size()); for ( Iterator iter = clauses.iterator() ; iter.hasNext() ; ) { IFromClause clause = (IFromClause) iter.next(); if ( clause instanceof IUnaryFromClause ) { children.add(((IUnaryFromClause) clause).getGroup()); } else { children.add(clause); } } return children.toArray(); } else if ( obj instanceof IFromClause ) { if ( obj instanceof IUnaryFromClause ) { return new Object[] { }; } else if ( obj instanceof IJoinPredicate ) { return new Object[] { ((IJoinPredicate) obj).getLeftClause(), ((IJoinPredicate) obj).getRightClause() }; } else if ( obj instanceof ISubqueryFromClause ) { return new Object[] { }; } } else if ( obj instanceof ICriteria ) { IQueryService queryService = ModelerCore.getTeiidQueryService(); IValueIteratorProviderCollectorVisitor visitor = queryService.getValueIteratorProviderCollectorVisitor(); List<ISubqueryContainer<?>> containers = visitor.findValueIteratorProviders((ICriteria)obj); List<ICommand> commands = new ArrayList<ICommand>(); for (ISubqueryContainer container : containers) { commands.add(container.getCommand()); } return commands.toArray(); } return null; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) * @since 4.2 */ @Override public Object getParent(Object element) { return null; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) * @since 4.2 */ @Override public boolean hasChildren(Object element) { Object[] children = getChildren(element); if ( children == null || children.length == 0 ) { return false; } return true; } /** * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) * @since 4.2 */ @Override public Object[] getElements(Object inputElement) { if ( inputElement instanceof ArrayList ) { return ((ArrayList) inputElement).toArray(); } return getChildren(inputElement); } /** * @see org.eclipse.jface.viewers.IContentProvider#dispose() * @since 4.2 */ @Override public void dispose() { } /** * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) * @since 4.2 */ @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }