/*
* 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.schema.tools.model.schema.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.namespace.QName;
import org.jdom.Namespace;
import org.teiid.designer.schema.tools.ToolsPlugin;
import org.teiid.designer.schema.tools.model.jdbc.Table;
import org.teiid.designer.schema.tools.model.jdbc.internal.TableImpl;
import org.teiid.designer.schema.tools.model.schema.ComplexSchemaObject;
import org.teiid.designer.schema.tools.model.schema.RootElement;
import org.teiid.designer.schema.tools.model.schema.SchemaModel;
import org.teiid.designer.schema.tools.model.schema.SchemaObject;
import org.teiid.designer.schema.tools.model.schema.SchemaObjectKey;
import org.teiid.designer.schema.tools.processing.SchemaProcessingException;
/**
* @since 8.0
*/
public class SchemaModelImpl implements SchemaModel {
private List elements;
private Map namespaces;
private Map tableRelationships; // key: Relationship, value Integer
// relationship type
// Root elements selected by the user, not our guess at root elements
private Set rootElements;
private HashMap tableImplementations = new HashMap();
private HashMap<QName, SchemaObject> elementLookup = new HashMap();
private boolean typeAware = false;
private static String separator;
public SchemaModelImpl( List elements,
Map namespaces,
String sep ) {
this.elements = elements;
for (Iterator iterator = elements.iterator(); iterator.hasNext();) {
SchemaObject object = (SchemaObject) iterator.next();
QName qName = new QName(object.getNamespace(), object.getName());
elementLookup.put(qName, object);
}
this.namespaces = namespaces;
if (null == sep) {
SchemaModelImpl.separator = "_"; //$NON-NLS-1$
} else {
SchemaModelImpl.separator = sep;
}
}
@Override
public List getPotentialRootElements() {
ArrayList roots = new ArrayList();
for (Iterator iter = elements.iterator(); iter.hasNext();) {
SchemaObject element = (SchemaObject)iter.next();
roots.add(element.getRootRepresentation());
}
return roots;
}
@Override
public void setTypeAsRoot( String typeName,
String namespace ) throws SchemaProcessingException {
if (!typeAware) {
throw new SchemaProcessingException(ToolsPlugin.Util.getString("SchemaModelImpl.schemaNotTypeAware")); //$NON-NLS-1$
}
for (Iterator iter = elements.iterator(); iter.hasNext();) {
Object next = iter.next();
if (next instanceof ComplexSchemaObject) {
ComplexSchemaObject type = (ComplexSchemaObject)next;
if (type.getSimpleName().equals(typeName) && type.getNamespace().equals(namespace)) {
HashSet roots = new HashSet();
roots.add(type.getRootRepresentation());
try {
this.setSelectedRootElements(roots);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
}
}
throw new SchemaProcessingException(ToolsPlugin.Util.getString("SchemaModelImpl.typeNotFound", //$NON-NLS-1$
typeName,
namespace));
}
@Override
public SchemaModel copy() {
SchemaModelCopyTraversalContext ctx = new SchemaModelCopyTraversalContext(elements, rootElements);
List modelClone = ctx.getCopiedElements();
Set rootsCopy = ctx.getCopiedRoots();
SchemaModelImpl copy = new SchemaModelImpl(modelClone, namespaces, separator);
copy.typeAware = this.typeAware;
try {
copy.setSelectedRootElements(rootsCopy);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return copy;
}
@Override
public List getElements() {
return elements;
}
@Override
public Map getNamespaces() {
return namespaces;
}
@Override
public void setSelectedRootElements( Set roots ) {
if (null == roots) {
this.rootElements = null;
} else {
this.rootElements = new HashSet(roots.size());
for (Iterator iter = roots.iterator(); iter.hasNext();) {
SchemaObjectKey key;
Object obj = iter.next();
if (obj instanceof SchemaObjectKey) {
key = (SchemaObjectKey)obj;
} else if (obj instanceof RootElement) {
RootElement root = (RootElement)obj;
key = root.getKey();
} else {
throw new RuntimeException(ToolsPlugin.Util.getString("SchemaModelImpl.invalidType")); //$NON-NLS-1$
}
this.rootElements.add(key);
for (Iterator eIter = elements.iterator(); eIter.hasNext();) {
SchemaObject element = (SchemaObject)eIter.next();
if (element.getKey().equals(key)) {
element.cascadeRootSelection(true);
}
}
}
}
}
@Override
public boolean isSelectedRootElement( SchemaObject element ) {
boolean result;
if (null == rootElements) {
// Model everything if no selections were made.
result = true;
} else {
result = rootElements.contains(element.getKey());
}
return result;
}
@Override
public void setElements( List nonMergedTables ) {
elements = nonMergedTables;
}
@Override
public List getTables() {
List tableNamespaces = getNamespacePrefixesValue();
ArrayList result = new ArrayList();
for (Iterator iter = elements.iterator(); iter.hasNext();) {
SchemaObject element = (SchemaObject)iter.next();
if (element.isWithinSelectedHierarchy()) {
TableImpl table = new TableImpl(element.getSimpleName(), element.getCatalog(), element.getInputXPath(),
element.getOutputXPath());
for (Iterator nsIter = tableNamespaces.iterator(); nsIter.hasNext();) {
table.addNamespace((Namespace)nsIter.next());
}
table.setElement(element);
table.setSchemaModel(this);
tableImplementations.put(element.getSimpleName(), table);
result.add(table);
}
}
return result;
}
private List getNamespacePrefixesValue() {
ArrayList result = new ArrayList(namespaces.size());
for (Iterator iter = this.namespaces.keySet().iterator(); iter.hasNext();) {
String prefix = (String)iter.next();
String namespaceURI = (String)namespaces.get(prefix);
result.add(Namespace.getNamespace(prefix, namespaceURI));
}
return result;
}
@Override
public Map getNamespacePrefixes() {
// reverse the m_namespaces map
Map nsMap = getNamespaces();
HashMap returnMap = new HashMap();
Iterator nsIter = nsMap.keySet().iterator();
while (nsIter.hasNext()) {
String key = (String)nsIter.next();
returnMap.put(nsMap.get(key), key);
}
return returnMap;
}
/* public void printDebug() {
System.out.println("SchemaModel");
System.out.println("Namespaces");
System.out.println(namespaces);
System.out.println("End Namespaces");
System.out.println("Default Namespaces");
System.out.println(defaultNamespaces);
System.out.println("End Default Namespaces");
System.out.println("Potential Root Elements");
List roots = getPotentialRootElements();
for(Iterator iter = roots.iterator(); iter.hasNext(); ) {
RootElementImpl root = (RootElementImpl) iter.next();
root.printDebug();
}
System.out.println("End Potential Root Elements");
System.out.println("Number of Elements " + elements.size());
for(Iterator iter = elements.iterator(); iter.hasNext(); ) {
ElementImpl element = (ElementImpl) iter.next();
element.printDebug();
}
System.out.println("SchemaModel End");
}
*/
@Override
public Table findTable( String simpleName ) {
return (Table)tableImplementations.get(simpleName);
}
public int getRelationToParent( String lookupKey ) {
Integer result = new Integer(-1);
if ((null != tableRelationships) && (tableRelationships.containsKey(lookupKey))) {
result = (Integer)tableRelationships.get(lookupKey);
}
return result.intValue();
}
public void setTableRelationships( Map tableRelationships ) {
this.tableRelationships = tableRelationships;
}
public void setTypeAware( boolean typeAware ) {
this.typeAware = typeAware;
}
@Override
public boolean isTypeAware() {
return typeAware;
}
public static String getSeparator() {
return separator;
}
@Override
public SchemaObject getElement(QName qName) {
return elementLookup.get(qName);
}
}