/* * 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.sqleditor.component; import java.util.Arrays; import java.util.List; import java.util.Set; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.query.IQueryService; import org.teiid.designer.query.sql.ISQLStringVisitor; import org.teiid.designer.query.sql.lang.IComment; import org.teiid.designer.query.sql.lang.ICompareCriteria; import org.teiid.designer.query.sql.lang.ICompoundCriteria; import org.teiid.designer.query.sql.lang.IDelete; import org.teiid.designer.query.sql.lang.IFrom; import org.teiid.designer.query.sql.lang.IGroupBy; import org.teiid.designer.query.sql.lang.IInsert; import org.teiid.designer.query.sql.lang.ILanguageObject; import org.teiid.designer.query.sql.lang.IMatchCriteria; import org.teiid.designer.query.sql.lang.IOrderBy; import org.teiid.designer.query.sql.lang.IQuery; import org.teiid.designer.query.sql.lang.ISelect; import org.teiid.designer.query.sql.lang.ISetCriteria; import org.teiid.designer.query.sql.lang.ISetQuery; import org.teiid.designer.query.sql.lang.IUpdate; import org.teiid.designer.query.sql.symbol.IAliasSymbol; import org.teiid.designer.query.sql.symbol.IConstant; import org.teiid.designer.query.sql.symbol.IElementSymbol; import org.teiid.designer.query.sql.symbol.IFunction; import org.teiid.designer.query.sql.symbol.IGroupSymbol; import org.teiid.designer.query.sql.symbol.IMultipleElementSymbol; import org.teiid.designer.query.sql.symbol.IWindowFunction; import org.teiid.designer.query.sql.symbol.IWindowSpecification; /** * The <code>DisplayNodeFactory</code> class is the Factory used to create all different types of DisplayNodes. * * @since 8.0 */ public class DisplayNodeFactory { private static final String UNDEFINED = "<undefined>"; //$NON-NLS-1$ private static final String[] SEPARATORS = new String[11]; static { SEPARATORS[0] = " "; //$NON-NLS-1$ SEPARATORS[1] = " \n"; //$NON-NLS-1$ SEPARATORS[2] = "\n"; //$NON-NLS-1$ SEPARATORS[3] = " \t"; //$NON-NLS-1$ SEPARATORS[4] = "\t"; //$NON-NLS-1$ SEPARATORS[5] = ", "; //$NON-NLS-1$ SEPARATORS[6] = ","; //$NON-NLS-1$ SEPARATORS[7] = "("; //$NON-NLS-1$ SEPARATORS[8] = ")"; //$NON-NLS-1$ SEPARATORS[9] = " ("; //$NON-NLS-1$ SEPARATORS[10] = ") "; //$NON-NLS-1$ } private static final List SEPARATOR_WORDS = Arrays.asList(SEPARATORS); // ************************************************ // Public Methods // ************************************************ static <T extends DisplayNode> T createDisplayNode( DisplayNode parentNode, Object obj, int indentLevel ) { final T node = constructDisplayNode(parentNode, obj); final boolean dontAppend = obj instanceof IGroupSymbol || obj instanceof IMultipleElementSymbol || obj instanceof IElementSymbol; if (obj instanceof ILanguageObject) { DisplayNodeVisitor ssv = new DisplayNodeVisitor(node, dontAppend, indentLevel); IQueryService queryService = ModelerCore.getTeiidQueryService(); ISQLStringVisitor callbackSQLStringVisitor = queryService.getCallbackSQLStringVisitor(ssv); ((ILanguageObject)obj).acceptVisitor(callbackSQLStringVisitor); /* * Fetch and stash any comments from the parser. * Only places them in the root node of the Display tree */ if (parentNode == null) { Set<IComment> comments = ((ILanguageObject)obj).getComments(); for (IComment comment : comments) { CommentDisplayNode commentNode = createDisplayNode(node, comment); node.addCommentNode(commentNode); } } } return node; } /** * @param parentNode * @param obj * @return new display node */ public static <T extends DisplayNode> T createDisplayNode( DisplayNode parentNode, Object obj ) { return createDisplayNode(parentNode, obj, 0); } static <T extends DisplayNode> T constructDisplayNode( DisplayNode parentNode, Object obj) { // --------------------------------------------------------------------- // Commands // --------------------------------------------------------------------- if (obj instanceof IQuery) { QueryDisplayNode node = new QueryDisplayNode(parentNode, (IQuery)obj); return (T) node; } else if (obj instanceof ISetQuery) { SetQueryDisplayNode node = new SetQueryDisplayNode(parentNode, (ISetQuery)obj); return (T) node; } else if (obj instanceof IInsert) { InsertDisplayNode node = new InsertDisplayNode(parentNode, (IInsert)obj); return (T) node; } else if (obj instanceof IUpdate) { UpdateDisplayNode node = new UpdateDisplayNode(parentNode, (IUpdate)obj); return (T) node; } else if (obj instanceof IDelete) { DeleteDisplayNode node = new DeleteDisplayNode(parentNode, (IDelete)obj); return (T) node; } else if (obj instanceof ISelect) { SelectDisplayNode node = new SelectDisplayNode(parentNode, (ISelect)obj); return (T) node; } else if (obj instanceof IFrom) { FromDisplayNode node = new FromDisplayNode(parentNode, (IFrom)obj); return (T) node; } else if (obj instanceof IGroupBy) { GroupByDisplayNode node = new GroupByDisplayNode(parentNode, (IGroupBy)obj); return (T) node; } else if (obj instanceof IOrderBy) { OrderByDisplayNode node = new OrderByDisplayNode(parentNode, (IOrderBy)obj); return (T) node; } else if( parentNode instanceof FunctionDisplayNode && obj instanceof IConstant && ((IConstant)obj).getValue() != null ) { return (T) new TextDisplayNode(parentNode, obj.toString()); } else if (obj instanceof String) { // --------------------------------------------------------------------- // Keywords, Separators, Unknown Strings // --------------------------------------------------------------------- String text = (String)obj; if (SEPARATOR_WORDS.contains(text)) { return (T) new SeparatorDisplayNode(parentNode, text); } return (T) new TextDisplayNode(parentNode, text); // --------------------------------------------------------------------- // FromClause Parts // --------------------------------------------------------------------- } else if (obj instanceof ICompareCriteria) { CompareCriteriaDisplayNode node = new CompareCriteriaDisplayNode(parentNode, (ICompareCriteria)obj); return (T) node; } else if (obj instanceof IMatchCriteria) { MatchCriteriaDisplayNode node = new MatchCriteriaDisplayNode(parentNode, (IMatchCriteria)obj); return (T) node; } else if (obj instanceof ISetCriteria) { SetCriteriaDisplayNode node = new SetCriteriaDisplayNode(parentNode, (ISetCriteria)obj); return (T) node; } else if (obj instanceof ICompoundCriteria) { CompoundCriteriaDisplayNode node = new CompoundCriteriaDisplayNode(parentNode, (ICompoundCriteria)obj); return (T) node; } else if (obj instanceof IFunction) { // --------------------------------------------------------------------- // Constant, Function, Expression Nodes // --------------------------------------------------------------------- FunctionDisplayNode node = new FunctionDisplayNode(parentNode, (IFunction)obj); return (T) node; } else if (obj instanceof IWindowFunction || obj instanceof IWindowSpecification ) { TextDisplayNode node = new TextDisplayNode(parentNode, obj.toString()); return (T) node; } else if (obj instanceof IAliasSymbol) { AliasSymbolDisplayNode node = new AliasSymbolDisplayNode(parentNode, (IAliasSymbol)obj); return (T) node; } else if (obj instanceof IElementSymbol) { ElementSymbolDisplayNode node = new ElementSymbolDisplayNode(parentNode, (IElementSymbol)obj); return (T) node; } else if (obj instanceof IGroupSymbol) { GroupSymbolDisplayNode node = new GroupSymbolDisplayNode(parentNode, (IGroupSymbol)obj); return (T) node; } else if (obj instanceof IMultipleElementSymbol) { SymbolDisplayNode node = new SymbolDisplayNode(parentNode, (IMultipleElementSymbol)obj); return (T) node; } else if (obj instanceof ILanguageObject) { DisplayNode node = new DisplayNode(); node.parentNode = parentNode; node.languageObject = (ILanguageObject)obj; return (T) node; } else if (obj instanceof IComment) { CommentDisplayNode node = new CommentDisplayNode(parentNode, (IComment) obj); return (T) node; } else { String unknownText = UNDEFINED; if (obj != null) { unknownText = obj.toString(); } UnknownDisplayNode node = new UnknownDisplayNode(parentNode, unknownText); return (T) node; } } /** * @param parentNode * @param name * @return unknown display node */ public static DisplayNode createUnknownQueryDisplayNode( DisplayNode parentNode, String name ) { return new UnknownQueryDisplayNode(parentNode, name); } }