/*
* 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.xmlfile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.ecore.EObject;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.datatools.connectivity.model.Parameter;
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.Procedure;
import org.teiid.designer.metamodels.relational.ProcedureParameter;
import org.teiid.designer.metamodels.relational.ProcedureResult;
import org.teiid.designer.metamodels.relational.RelationalFactory;
import org.teiid.designer.metamodels.relational.RelationalPackage;
import org.teiid.designer.metamodels.transformation.SqlTransformationMappingRoot;
import org.teiid.designer.metamodels.transformation.TransformationFactory;
import org.teiid.designer.query.proc.ITeiidXmlColumnInfo;
import org.teiid.designer.transformation.ui.wizards.file.FlatFileRelationalModelFactory;
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 XmlFileViewModelFactory 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 static final char DOT = '.';
public static final char COMMA = ',';
public static final char SPACE = ' ';
public static final char S_QUOTE = '\'';
public static final String HEADER = "HEADER"; //$NON-NLS-1$
public static final String SKIP = "SKIP"; //$NON-NLS-1$
public static final String WIDTH = "width"; //$NON-NLS-1$
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;
}
public void createViewTable(ModelResource modelResource, TeiidXmlFileInfo 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);
}
/**
* @since 8.6
*/
public void createViewProcedure(ModelResource modelResource, TeiidXmlFileInfo info, String relationalModelName) throws ModelerCoreException {
// Create a Procedure using the view procedure name in TeiidXmlFileInfo
Procedure procedure = factory.createProcedure();
procedure.setName(info.getViewProcedureName());
for (String parameterKey : info.getParameterMap().keySet()) {
//Don't add header parameters. These are just needed for building the transformation
//and adding them will cause Data Preview to prompt for values.
Object value = info.getParameterMap().get(parameterKey);
if ((value instanceof Parameter) &&
((Parameter)value).getType().equals(Parameter.Type.Header)){
continue;
}
ProcedureParameter parameter = factory.createProcedureParameter();
parameter.setName(parameterKey);
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
parameter.setType(stringType);
parameter.setProcedure(procedure);
}
ProcedureResult result = factory.createProcedureResult();
result.setName("Result"); //$NON-NLS-1$
result.setProcedure(procedure);
for(TeiidXmlColumnInfo columnInfo : info.getColumnInfoList() ) {
Column column = factory.createColumn();
column.setName(columnInfo.getName());
EObject type = datatypeManager.findDatatype(columnInfo.getDatatype());
if( type != null) {
column.setType(type);
if( columnInfo.getDatatype().equalsIgnoreCase("string")) { //$NON-NLS-1$
column.setLength(DEFAULT_STRING_LENGTH);
}
}
addValue(result, column, result.getColumns());
}
addValue(modelResource, procedure, modelResource.getEmfResource().getContents());
NewModelObjectHelperManager.helpCreate(procedure, null);
String sqlString = info.getSqlString(relationalModelName, info.getModelNameWithoutExtension(modelResource.getItemName()), info.getViewProcedureName());
SqlTransformationMappingRoot tRoot = (SqlTransformationMappingRoot)TransformationHelper.getTransformationMappingRoot(procedure);
TransformationHelper.setSelectSqlString(tRoot, sqlString, false, this);
TransformationMappingHelper.reconcileMappingsOnSqlChange(tRoot, this);
QueryValidator validator = new TransformationValidator(tRoot);
validator.validateSql(sqlString, QueryValidator.SELECT_TRNS, true);
}
@SuppressWarnings("unchecked")
private void createColumns(TeiidXmlFileInfo info, BaseTable baseTable) throws ModelerCoreException {
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
for (ITeiidXmlColumnInfo columnInfo : info.getColumnInfoList()) {
Column column = factory.createColumn();
column.setName(columnInfo.getName());
column.setNameInSource(columnInfo.getSymbolName());
column.setLength(columnInfo.getWidth());
column.setDefaultValue(columnInfo.getDefaultValue());
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) {
column.setLength(DEFAULT_STRING_LENGTH);
} else if( DatatypeUtilities.isNumeric(finalDType)) {
column.setPrecision(DEFAULT_PRECISION);
}
}
baseTable.getColumns().add(column);
}
}
}