/* * 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.relational.model; import java.util.ArrayList; import java.util.Collection; import org.teiid.core.designer.util.CoreArgCheck; /** * * * @since 8.0 */ public class RelationalModel extends RelationalReference { private Collection<RelationalReference> allRefs = new ArrayList<RelationalReference>(); private Collection<RelationalReference> children; /** * RelationalModel constructor * @param name the model name */ public RelationalModel( String name ) { super(name); setType(TYPES.MODEL); this.children = new ArrayList<RelationalReference>(); } /** * Get all reference objects for this model * @return all reference objects */ public Collection<RelationalReference> getAllReferences() { this.allRefs.clear(); if(this.children!=null) { for(RelationalReference ref:this.children) { addRecursive(ref,this.allRefs); } } return this.allRefs; } /** * Get the top level children for this model * @return model children */ public Collection<RelationalReference> getChildren() { return this.children; } /** * Add a child to this model * @param child the child * @return 'true' if child was added */ public boolean addChild(RelationalReference child) { if( this.children == null ) { this.children = new ArrayList<RelationalReference>(); } boolean wasAdded = false; if( !this.children.contains(child) ) { child.setParent(this); wasAdded = this.children.add(child); } return wasAdded; } /** * Remove specified child from the model * @param child the child to remove * @return 'true' if child was removed */ public boolean removeChild(RelationalReference child) { if( this.children == null ) { return false; } if( this.children.contains(child) ) { return this.children.remove(child); } return false; } /** * Determine if the model has a child with the specified name * @param name the child name * @return 'true' if model contains child with matching name */ public boolean hasChild(String name) { CoreArgCheck.isNotNull(name, "name"); //$NON-NLS-1$ for( RelationalReference child : this.children ) { if( name.equalsIgnoreCase( child.getName())) { return true; } } return false; } /** * Get the model child with the specified name * @param name the child name * @return the child, null if no matching child */ public RelationalReference getChildWithName(String name) { CoreArgCheck.isNotNull(name, "name"); //$NON-NLS-1$ for( RelationalReference child : this.children ) { if( name.equalsIgnoreCase( child.getName())) { return child; } } return null; } /** * Recursively adds all references * @param ref * @param allRefs */ private void addRecursive(RelationalReference ref, Collection<RelationalReference> allRefs) { if(ref instanceof RelationalTable) { allRefs.add(ref); Collection<RelationalAccessPattern> accessPatterns = ((RelationalTable)ref).getAccessPatterns(); for(RelationalReference ap: accessPatterns) { addRecursive(ap,allRefs); } Collection<RelationalColumn> columns = ((RelationalTable)ref).getColumns(); for(RelationalReference col: columns) { addRecursive(col,allRefs); } Collection<RelationalForeignKey> fks = ((RelationalTable)ref).getForeignKeys(); for(RelationalReference fk: fks) { addRecursive(fk,allRefs); } RelationalPrimaryKey pk = ((RelationalTable)ref).getPrimaryKey(); addRecursive(pk,allRefs); Collection<RelationalIndex> indexes = ((RelationalTable)ref).getIndexes(); for(RelationalReference index: indexes) { addRecursive(index,allRefs); } Collection<RelationalUniqueConstraint> ucs = ((RelationalTable)ref).getUniqueConstraints(); if(ucs!=null) { for(RelationalReference uc: ucs) { addRecursive(uc,allRefs); } } } else if(ref instanceof RelationalProcedure) { allRefs.add(ref); Collection<RelationalParameter> procParams = ((RelationalProcedure)ref).getParameters(); for(RelationalReference param: procParams) { addRecursive(param,allRefs); } RelationalProcedureResultSet resultSet = ((RelationalProcedure)ref).getResultSet(); addRecursive(resultSet,allRefs); } else if(ref instanceof RelationalView) { allRefs.add(ref); Collection<RelationalAccessPattern> accessPatterns = ((RelationalView)ref).getAccessPatterns(); for(RelationalReference ap: accessPatterns) { addRecursive(ap,allRefs); } Collection<RelationalColumn> columns = ((RelationalView)ref).getColumns(); for(RelationalReference col: columns) { addRecursive(col,allRefs); } } else { allRefs.add(ref); } } }