/*
* 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.transformation.reverseeng;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.core.designer.util.StringUtilities;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.AspectManager;
import org.teiid.designer.core.metamodel.aspect.sql.SqlAspect;
import org.teiid.designer.core.metamodel.aspect.sql.SqlDatatypeAspect;
import org.teiid.designer.metamodels.relational.NullableType;
import org.teiid.designer.metamodels.relational.PrimaryKey;
import org.teiid.designer.metamodels.xsd.aspects.sql.XsdSimpleTypeDefinitionAspect;
import org.teiid.designer.runtime.spi.TeiidExecutionException;
import org.teiid.designer.transformation.reverseeng.api.Column;
import org.teiid.designer.transformation.reverseeng.api.Column.NullType;
import org.teiid.designer.transformation.reverseeng.api.MetadataProcessor;
import org.teiid.designer.transformation.reverseeng.api.Options;
import org.teiid.designer.transformation.reverseeng.api.RuntimeTypesConstants;
import org.teiid.designer.transformation.reverseeng.api.Table;
/**
* @author vanhalbert
*
*/
public final class RelationalMetadataProcessor implements MetadataProcessor {
private static SqlDatatypeAspect sqlDatatypeAspect;
private List<Table> tableMetadata = new ArrayList<Table>();
@Override
public List<Table> getTableMetadata() {
return this.tableMetadata;
}
@Override
public void loadMetadata( Object metadataSource, Options options) throws TeiidExecutionException {
performLoad( (org.teiid.designer.metamodels.relational.Table) metadataSource, options);
}
private void performLoad(org.teiid.designer.metamodels.relational.Table table, Options options) throws TeiidExecutionException {
Table relTable = new Table(table.getName());
this.tableMetadata.add(relTable);
List<org.teiid.designer.metamodels.relational.Column> columns = table.getColumns();
int orderValue = 1;
for( org.teiid.designer.metamodels.relational.Column col : columns ) {
addColumn(col, relTable, orderValue);
orderValue++;
}
}
/**
* Add a column to the given table based upon the current Column
* @param column
* @param reltable
*/
private void addColumn(org.teiid.designer.metamodels.relational.Column column, Table reltable, int orderValue) {
Column relColumn = reltable.createColumn(column.getName());
SqlDatatypeAspect aspect = getSqlAspect(column.getType());
String runtimeTypeName = aspect.getRuntimeTypeName(column.getType());
String javaType = RuntimeTypesConstants.getJavaType(runtimeTypeName);
// relColumn.setType(aspect.getRuntimeTypeName(column.getType()));
relColumn.setTypeName(runtimeTypeName);
relColumn.setJavaType(javaType);
relColumn.setOrder(orderValue);
relColumn.setPrecision(column.getPrecision());
// relColumn.setMaxLength(aspect.get);
relColumn.setScale(column.getScale());
if( column.getNullable().getLiteral().equalsIgnoreCase(NullableType.NULLABLE_LITERAL.toString()) ) {
relColumn.setNullType(NullType.Nullable);
} else if( column.getNullable().getLiteral().equalsIgnoreCase(NullableType.NO_NULLS_LITERAL.toString()) ) {
relColumn.setNullType(NullType.No_Nulls);
} else {
relColumn.setNullType(NullType.Unknown);
}
try {
String desc = ModelerCore.getModelEditor().getDescription(column);
if( ! StringUtilities.isEmpty(desc) ) {
relColumn.setRemarks(desc);
}
} catch (ModelerCoreException e) {
e.printStackTrace();
relColumn.setRemarks(null);
}
relColumn.setDefaultValue(column.getDefaultValue());
relColumn.setIsIndexed(true); //column.isIndexed());
// Check if column has PK reference
boolean isReq = false;
for( Object eObj : column.getUniqueKeys().toArray() ) {
if( eObj instanceof PrimaryKey ) {
isReq = true;
}
}
relColumn.setIsRequired(isReq);
}
protected SqlDatatypeAspect getSqlAspect( final EObject eObject ) {
if (eObject != null && eObject instanceof XSDSimpleTypeDefinition) {
if (ModelerCore.getPlugin() == null) {
if (sqlDatatypeAspect == null) {
sqlDatatypeAspect = new XsdSimpleTypeDefinitionAspect(null);
}
return sqlDatatypeAspect;
}
// Defect 23839 - rather than calling the metamodel registry to get aspect, use the AspectManager which is caching
// these aspects!!!!
SqlAspect sqlAspect = AspectManager.getSqlAspect(eObject);
if (sqlAspect instanceof SqlDatatypeAspect) {
return (SqlDatatypeAspect)sqlAspect;
}
}
return null;
}
}