/*
* 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.jdbc.relational;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.jdbc.metadata.JdbcCatalog;
import org.teiid.designer.jdbc.metadata.JdbcNode;
import org.teiid.designer.jdbc.metadata.JdbcProcedure;
import org.teiid.designer.jdbc.metadata.JdbcSchema;
import org.teiid.designer.jdbc.metadata.JdbcTable;
import org.teiid.designer.metamodels.relational.RelationalPackage;
/**
* JdbcNodeToRelationalMappingImpl
*
* @since 8.0
*/
public class JdbcNodeToRelationalMappingImpl implements JdbcNodeToRelationalMapping {
public static final String UBIQUITOUS_VIEW_NAME = "View"; //$NON-NLS-1$
public static final String DEFAULT_VIEW_NAME = org.teiid.designer.jdbc.relational.ModelerJdbcRelationalConstants.Util.getString("JdbcNodeToRelationalMappingImpl.ViewTableType"); //$NON-NLS-1$
private final Map tableTypeNameToEClassName;
private final Map upperTableTypeNameToEClassName;
/**
* Construct an instance of JdbcNodeToRelationalMappingImpl.
*
*/
public JdbcNodeToRelationalMappingImpl() {
super();
tableTypeNameToEClassName = new HashMap();
upperTableTypeNameToEClassName = new HashMap();
// Register the standard view names
final EClass viewClass = findClassifierById(RelationalPackage.VIEW);
final String viewClassName = viewClass.getName();
setRelationalClassForJdbcTableType(UBIQUITOUS_VIEW_NAME,viewClassName);
setRelationalClassForJdbcTableType(DEFAULT_VIEW_NAME,viewClassName);
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.relational.JdbcNodeToRelationalMapping#getRelationalClassForJdbcNode(org.teiid.designer.jdbc.metadata.JdbcNode)
*/
@Override
public EClass getRelationalClassForJdbcNode(final JdbcNode jdbcNode) {
CoreArgCheck.isNotNull(jdbcNode);
if ( jdbcNode instanceof JdbcCatalog ) {
return findClassifierById(RelationalPackage.CATALOG);
}
if ( jdbcNode instanceof JdbcSchema ) {
return findClassifierById(RelationalPackage.SCHEMA);
}
if ( jdbcNode instanceof JdbcProcedure ) {
return findClassifierById(RelationalPackage.PROCEDURE);
}
if ( jdbcNode instanceof JdbcTable) {
final String typeName = jdbcNode.getTypeName(); // should be the table type
// See if the table type was bound to an EClass ...
final String eClassName = getRelationalClassForJdbcTableType(typeName);
if ( eClassName != null ) {
final EClassifier eClassForTypeName = RelationalPackage.eINSTANCE.getEClassifier(eClassName);
if ( eClassForTypeName != null && eClassForTypeName instanceof EClass ) {
return (EClass) eClassForTypeName;
}
}
// Falls through to bind to Table
return findClassifierById(RelationalPackage.TABLE);
}
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.relational.JdbcNodeToRelationalMapping#setRelationalClassForJdbcTableType(java.lang.String, java.lang.String)
*/
@Override
public void setRelationalClassForJdbcTableType(final String tableType, final String eClassName) {
CoreArgCheck.isNotNull(tableType);
CoreArgCheck.isNotNull(eClassName);
CoreArgCheck.isNotZeroLength(eClassName);
this.tableTypeNameToEClassName.put(tableType,eClassName);
this.upperTableTypeNameToEClassName.put(tableType.toUpperCase(),eClassName);
}
/* (non-Javadoc)
* @See org.teiid.designer.jdbc.relational.JdbcNodeToRelationalMapping#getRelationalClassForJdbcTableType(java.lang.String)
*/
@Override
public String getRelationalClassForJdbcTableType( final String tableType) {
if ( tableType == null ) {
return null;
}
final String exactMatch = (String)this.tableTypeNameToEClassName.get(tableType);
if ( exactMatch != null ) {
return exactMatch;
}
return (String)this.upperTableTypeNameToEClassName.get(tableType.toUpperCase());
}
/**
* @param i
* @return
*/
protected EClass findClassifierById(int classifierId) {
final Iterator iter = RelationalPackage.eINSTANCE.getEClassifiers().iterator();
while (iter.hasNext()) {
final EClassifier classifier = (EClassifier)iter.next();
if ( classifier.getClassifierID() == classifierId ) {
if ( classifier instanceof EClass ) {
return (EClass) classifier;
}
}
}
return null;
}
}