/*
* 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.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.types.DatatypeManager;
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.Column;
import org.teiid.designer.metamodels.relational.DirectionKind;
import org.teiid.designer.metamodels.relational.NullableType;
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.transformation.ui.UiConstants;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* @since 8.0
*/
public class FlatFileRelationalModelFactory implements UiConstants {
public static final String RELATIONAL_PACKAGE_URI = RelationalPackage.eNS_URI;
public static final RelationalFactory factory = RelationalFactory.eINSTANCE;
public static final DatatypeManager datatypeManager = ModelerCore.getWorkspaceDatatypeManager();
public static final String GET_FILES = "getFiles"; //$NON-NLS-1$
public static final String GET_TEXT_FILES = "getTextFiles"; //$NON-NLS-1$
public static final String SAVE_FILE = "saveFile"; //$NON-NLS-1$
public static final String ALL_PROCEDURES = "allProcedures"; //$NON-NLS-1$
public static final String INVOKE = "invoke"; //$NON-NLS-1$
public static final String INVOKE_HTTP = "invokeHttp"; //$NON-NLS-1$
public static final String ALL_INVOKE_PROCEDURES = "allInvokeProcedures"; //$NON-NLS-1$
public static final int DEFAULT_STRING_LENGTH = 4000;
public static final int DEFAULT_PRECISION = 0;
public static final String INT_STR = "int";
public static final String INTEGER_STR = "integer";
private static boolean isTransactionable = ModelerCore.getPlugin() != null;
public ModelResource createModel(IPath location, String modelName) throws ModelerCoreException {
// Create Model Resource
ModelResource mr = createRelationalModel(location, modelName);
addGetFilesProcedure(mr);
addGetTextFilesProcedure(mr);
addSaveFileProcedure(mr);
return mr;
}
public ModelResource createRelationalModel( IPath location, String modelName) throws ModelWorkspaceException {
final ModelResource resrc = ModelerCore.createModelResource(location, modelName);
resrc.getModelAnnotation().setPrimaryMetamodelUri( RELATIONAL_PACKAGE_URI );
resrc.getModelAnnotation().setModelType(ModelType.PHYSICAL_LITERAL);
ModelUtilities.initializeModelContainers(resrc, "Create Model Containers", this); //$NON-NLS-1$
return resrc;
}
public boolean addMissingProcedure(ModelResource modelResource, String specificProcedure) throws ModelerCoreException{
if( modelResource != null ) {
if( specificProcedure.equalsIgnoreCase(ALL_PROCEDURES)) {
if( !FlatFileRelationalModelFactory.procedureExists(modelResource, GET_FILES ) ) {
addGetFilesProcedure(modelResource);
}
if( !FlatFileRelationalModelFactory.procedureExists(modelResource, GET_TEXT_FILES ) ) {
addGetTextFilesProcedure(modelResource);
}
if( !FlatFileRelationalModelFactory.procedureExists(modelResource, SAVE_FILE ) ) {
addSaveFileProcedure(modelResource);
}
} else if( specificProcedure.equalsIgnoreCase(GET_FILES) && !FlatFileRelationalModelFactory.procedureExists(modelResource, GET_FILES ) ) {
addGetFilesProcedure(modelResource);
} else if( specificProcedure.equalsIgnoreCase(GET_TEXT_FILES) && !FlatFileRelationalModelFactory.procedureExists(modelResource, GET_TEXT_FILES ) ) {
addGetTextFilesProcedure(modelResource);
} else if( specificProcedure.equalsIgnoreCase(SAVE_FILE) && !FlatFileRelationalModelFactory.procedureExists(modelResource, SAVE_FILE ) ) {
addSaveFileProcedure(modelResource);
} else if( specificProcedure.equalsIgnoreCase(ALL_INVOKE_PROCEDURES)) {
if( !FlatFileRelationalModelFactory.procedureExists(modelResource, INVOKE ) ) {
addInvokeProcedure(modelResource);
}
if( !FlatFileRelationalModelFactory.procedureExists(modelResource, INVOKE_HTTP ) ) {
addInvokeHttpProcedure(modelResource);
}
} else if( specificProcedure.equalsIgnoreCase(INVOKE) && !FlatFileRelationalModelFactory.procedureExists(modelResource, INVOKE ) ) {
addInvokeProcedure(modelResource);
} else if( specificProcedure.equalsIgnoreCase(INVOKE_HTTP) && !FlatFileRelationalModelFactory.procedureExists(modelResource, INVOKE_HTTP ) ) {
addInvokeHttpProcedure(modelResource);
}
}
return false;
}
public static boolean procedureExists(ModelResource modelResource, String procedureName) {
if( modelResource != null ) {
try {
for( Object obj : modelResource.getAllRootEObjects() ) {
EObject eObj = (EObject)obj;
if (eObj instanceof Procedure && procedureName.equalsIgnoreCase(ModelObjectUtilities.getName(eObj)) ) {
return true;
}
}
} catch (ModelWorkspaceException err) {
Util.log(err);
}
}
return false;
}
private void addGetFilesProcedure(ModelResource mr) throws ModelerCoreException {
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
EObject blobType = datatypeManager.findDatatype("blob"); //$NON-NLS-1$
Procedure proc = factory.createProcedure();
proc.setName(GET_FILES);
ProcedureParameter param = factory.createProcedureParameter();
param.setName("pathAndExt"); //$NON-NLS-1$
param.setProcedure(proc);
if( stringType != null) {
param.setType(stringType);
}
ProcedureResult result = factory.createProcedureResult();
result.setName("Result"); //$NON-NLS-1$
result.setProcedure(proc);
Column column_1 = factory.createColumn();
column_1.setName("file"); //$NON-NLS-1$
if( blobType != null) {
column_1.setType(blobType);
}
addValue(result, column_1, result.getColumns());
Column column_2 = factory.createColumn();
column_2.setName("filePath"); //$NON-NLS-1$
if( stringType != null) {
column_2.setType(stringType);
column_2.setLength(DEFAULT_STRING_LENGTH);
}
addValue(result, column_2, result.getColumns());
addValue(mr, proc, getModelResourceContents(mr));
}
private void addGetTextFilesProcedure(ModelResource mr) throws ModelerCoreException {
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
EObject clobType = datatypeManager.findDatatype("clob"); //$NON-NLS-1$
Procedure proc = factory.createProcedure();
proc.setName(GET_TEXT_FILES);
ProcedureParameter param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("pathAndExt"); //$NON-NLS-1$
param.setProcedure(proc);
if( stringType != null) {
param.setType(stringType);
param.setLength(DEFAULT_STRING_LENGTH);
}
ProcedureResult result = factory.createProcedureResult();
result.setName("Result"); //$NON-NLS-1$
result.setProcedure(proc);
Column column_1 = factory.createColumn();
column_1.setName("file"); //$NON-NLS-1$
if( clobType != null) {
column_1.setType(clobType);
}
addValue(result, column_1, result.getColumns());
Column column_2 = factory.createColumn();
column_2.setName("filePath"); //$NON-NLS-1$
if( stringType != null) {
column_2.setType(stringType);
column_2.setLength(DEFAULT_STRING_LENGTH);
}
addValue(result, column_2, result.getColumns());
addValue(mr, proc, getModelResourceContents(mr));
}
private void addSaveFileProcedure(ModelResource mr) throws ModelerCoreException {
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
EObject objectType = datatypeManager.findDatatype("object"); //$NON-NLS-1$
Procedure proc = factory.createProcedure();
proc.setName(SAVE_FILE);
ProcedureParameter param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("filePath"); //$NON-NLS-1$
param.setProcedure(proc);
if( stringType != null) {
param.setType(stringType);
param.setLength(DEFAULT_STRING_LENGTH);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("value"); //$NON-NLS-1$
param.setProcedure(proc);
if( objectType != null) {
param.setType(objectType);
}
addValue(mr, proc, getModelResourceContents(mr));
}
protected void addValue(final Object owner, final Object value, EList feature) throws ModelerCoreException {
if( isTransactionable ) {
ModelerCore.getModelEditor().addValue(owner, value, feature);
} else {
feature.add(value);
}
}
protected EList getModelResourceContents(ModelResource resource ) throws ModelWorkspaceException {
return resource.getEmfResource().getContents();
}
private void addInvokeHttpProcedure(ModelResource mr) throws ModelerCoreException {
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
EObject blobType = datatypeManager.findDatatype("blob"); //$NON-NLS-1$
EObject booleanType = datatypeManager.findDatatype("boolean"); //$NON-NLS-1$
EObject objectType = datatypeManager.findDatatype("object"); //$NON-NLS-1$
EObject clobType = datatypeManager.findDatatype("clob"); //$NON-NLS-1$
Procedure proc = factory.createProcedure();
proc.setName("invokeHttp"); //$NON-NLS-1$
ProcedureParameter param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("action"); //$NON-NLS-1$
param.setNullable(NullableType.NULLABLE_LITERAL);
if( stringType != null) {
param.setType(stringType);
param.setLength(DEFAULT_STRING_LENGTH);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("request"); //$NON-NLS-1$
param.setNullable(NullableType.NULLABLE_LITERAL);
if( objectType != null) {
param.setType(objectType);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("endpoint"); //$NON-NLS-1$
param.setNullable(NullableType.NULLABLE_LITERAL);
if( objectType != null) {
param.setType(stringType);
param.setLength(DEFAULT_STRING_LENGTH);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("stream"); //$NON-NLS-1$
param.setProcedure(proc);
param.setDirection(DirectionKind.IN_LITERAL);
if( booleanType != null) {
param.setType(booleanType);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("result"); //$NON-NLS-1$
param.setProcedure(proc);
param.setDirection(DirectionKind.RETURN_LITERAL);
param.setType(blobType);
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("contentType"); //$NON-NLS-1$
param.setDirection(DirectionKind.OUT_LITERAL);
param.setNullable(NullableType.NULLABLE_LITERAL);
if( stringType != null) {
param.setType(stringType);
param.setLength(DEFAULT_STRING_LENGTH);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("headers"); //$NON-NLS-1$
param.setProcedure(proc);
param.setDirection(DirectionKind.IN_LITERAL);
param.setNullable(NullableType.NULLABLE_LITERAL);
if( clobType != null) {
param.setType(clobType);
}
addValue(mr, proc, getModelResourceContents(mr));
}
private void addInvokeProcedure(ModelResource mr) throws ModelerCoreException {
EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$
EObject xmlLiteralType = datatypeManager.findDatatype("XMLLiteral"); //$NON-NLS-1$
EObject booleanType = datatypeManager.findDatatype("boolean"); //$NON-NLS-1$
Procedure proc = factory.createProcedure();
proc.setName("invoke"); //$NON-NLS-1$
ProcedureParameter param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("binding"); //$NON-NLS-1$
param.setNullable(NullableType.NULLABLE_LITERAL);
if( stringType != null) {
param.setType(stringType);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("action"); //$NON-NLS-1$
param.setNullable(NullableType.NULLABLE_LITERAL);
if( stringType != null) {
param.setType(stringType);
param.setLength(DEFAULT_STRING_LENGTH);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("request"); //$NON-NLS-1$
param.setNullable(NullableType.NULLABLE_LITERAL);
if( xmlLiteralType != null) {
param.setType(xmlLiteralType);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("endpoint"); //$NON-NLS-1$
param.setNullable(NullableType.NULLABLE_LITERAL);
if( stringType != null) {
param.setType(stringType);
param.setLength(DEFAULT_STRING_LENGTH);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("stream"); //$NON-NLS-1$
param.setDirection(DirectionKind.IN_LITERAL);
param.setNullable(NullableType.NULLABLE_LITERAL);
if( booleanType != null) {
param.setType(booleanType);
}
param = factory.createProcedureParameter();
param.setProcedure(proc);
param.setName("result"); //$NON-NLS-1$
param.setProcedure(proc);
param.setDirection(DirectionKind.RETURN_LITERAL);
param.setNullable(NullableType.NULLABLE_LITERAL);
if( xmlLiteralType != null) {
param.setType(xmlLiteralType);
}
addValue(mr, proc, getModelResourceContents(mr));
}
}