/*
* 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.ui.wizards.file;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.ecore.EObject;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.query.QueryValidator;
import org.teiid.designer.core.types.DatatypeManager;
import org.teiid.designer.core.util.NewModelObjectHelperManager;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.relational.BaseTable;
import org.teiid.designer.metamodels.relational.Column;
import org.teiid.designer.metamodels.relational.RelationalFactory;
import org.teiid.designer.metamodels.relational.RelationalPackage;
import org.teiid.designer.metamodels.relational.aspects.validation.RelationalStringNameValidator;
import org.teiid.designer.metamodels.transformation.SqlTransformationMappingRoot;
import org.teiid.designer.metamodels.transformation.TransformationFactory;
import org.teiid.designer.query.proc.ITeiidColumnInfo;
import org.teiid.designer.query.proc.ITeiidMetadataFileInfo;
import org.teiid.designer.transformation.util.TransformationHelper;
import org.teiid.designer.transformation.util.TransformationMappingHelper;
import org.teiid.designer.transformation.validation.TransformationValidator;
import org.teiid.designer.ui.viewsupport.DatatypeUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* @since 8.0
*/
public class FlatFileViewModelFactory extends FlatFileRelationalModelFactory {
public static final String RELATIONAL_PACKAGE_URI = RelationalPackage.eNS_URI;
public static final RelationalFactory relationalFactory = RelationalFactory.eINSTANCE;
public static final TransformationFactory transformationFactory = TransformationFactory.eINSTANCE;
public static final DatatypeManager datatypeManager = ModelerCore.getWorkspaceDatatypeManager();
public ModelResource createViewRelationalModel( IPath location, String modelName) throws ModelWorkspaceException {
final ModelResource resrc = ModelerCore.createModelResource(location, modelName);
resrc.getModelAnnotation().setPrimaryMetamodelUri( RELATIONAL_PACKAGE_URI );
resrc.getModelAnnotation().setModelType(ModelType.VIRTUAL_LITERAL);
ModelUtilities.initializeModelContainers(resrc, "Create Model Containers", this); //$NON-NLS-1$
return resrc;
}
/**
* Create columns in the {@link BaseTable} based on the column
* metadata contained in the given {@link TeiidMetadataFileInfo} object.
*
* @param info
* @param baseTable
* @throws ModelerCoreException
*/
@SuppressWarnings("unchecked")
private void createColumns(ITeiidMetadataFileInfo info, BaseTable baseTable) throws ModelerCoreException {
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
RelationalStringNameValidator validator = new RelationalStringNameValidator();
for (ITeiidColumnInfo columnInfo : info.getColumnInfoList()) {
Column column = factory.createColumn();
String name = columnInfo.getName();
if( ! validator.isValidName(name) ) {
name = StringConstants.DQUOTE + name + StringConstants.DQUOTE;
}
column.setName(name);
column.setNameInSource(columnInfo.getSymbolName());
column.setLength(columnInfo.getWidth());
column.setDefaultValue(columnInfo.getDefaultValue());
column.setFixedLength(info.isFixedWidthColumns());
// Datatype may be defined as "integer" here but we need to covert to "int" to insure that the SQL resolves
// correctly
String finalDType = columnInfo.getDatatype();
if( INTEGER_STR.equalsIgnoreCase(finalDType) ) {
finalDType = INT_STR;
}
EObject datatype = datatypeManager.findDatatype(finalDType);
if (datatype != null) {
column.setType(datatype);
if( stringType != null && stringType == datatype) {
if( info.isFixedWidthColumns()) {
column.setLength(columnInfo.getWidth());
} else {
column.setLength(DEFAULT_STRING_LENGTH);
}
} else if( DatatypeUtilities.isNumeric(finalDType)) {
column.setPrecision(DEFAULT_PRECISION);
}
}
baseTable.getColumns().add(column);
}
}
public void createViewTable(ModelResource modelResource, TeiidMetadataFileInfo info, String relationalModelName) throws ModelerCoreException {
// Create a Procedure using the text file name
BaseTable table = factory.createBaseTable();
table.setName(info.getViewTableName());
/*
* Creating the columns here ensures that any fixed lengths are assigned
* to the columns, otherwise reconcileMappingsOnSqlChange() (below)
* sets their lengths to default values.
*/
createColumns(info, table);
addValue(modelResource, table, getModelResourceContents(modelResource));
NewModelObjectHelperManager.helpCreate(table, null);
String sqlString = info.getSqlString(relationalModelName);
SqlTransformationMappingRoot tRoot = (SqlTransformationMappingRoot)TransformationHelper.getTransformationMappingRoot(table);
TransformationHelper.setSelectSqlString(tRoot, sqlString, false, this);
TransformationMappingHelper.reconcileMappingsOnSqlChange(tRoot, this);
QueryValidator validator = new TransformationValidator(tRoot);
validator.validateSql(sqlString, QueryValidator.SELECT_TRNS, true);
}
}