/* * 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.model; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.ecore.EObject; import org.eclipse.osgi.util.NLS; import org.teiid.core.designer.ModelerCoreException; import org.teiid.designer.core.ModelerCore; 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.Procedure; import org.teiid.designer.metamodels.relational.extension.RelationalModelExtensionAssistant; import org.teiid.designer.metamodels.relational.extension.RestModelExtensionAssistant; import org.teiid.designer.relational.RelationalPlugin; import org.teiid.designer.relational.model.RelationalModel; import org.teiid.designer.relational.model.RelationalModelFactory; import org.teiid.designer.relational.model.RelationalProcedure; import org.teiid.designer.relational.model.RelationalReference; import org.teiid.designer.relational.model.RelationalTable; import org.teiid.designer.relational.model.RelationalViewProcedure; import org.teiid.designer.relational.model.RelationalViewTable; import org.teiid.designer.transformation.Messages; import org.teiid.designer.transformation.TransformationPlugin; import org.teiid.designer.transformation.util.TransformationHelper; /** * Class provides building EMF Relational Metamodel objects from Relational Model objects * * @since 8.0 */ public class RelationalViewModelFactory extends RelationalModelFactory { /** * */ public RelationalViewModelFactory() { super(); } /** * Creates a relational view model given a <code>IPath</code> location and a model name * * @param location the workspace location of the new model * @param modelName the model name * @return the new model resource * @throws ModelWorkspaceException error thrown when problem creating new model */ public ModelResource createRelationalViewModel( 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); ModelerCore.getModelEditor().getAllContainers(resrc.getEmfResource()); return resrc; } /** * Creates a relational view model given a <code>IContainer</code> location (Project or Folder) and a model name * * @param container the workspace container of the new model * @param modelName the model name * @return the new model resource * @throws ModelWorkspaceException error thrown when problem creating new model */ public ModelResource createRelationalViewModel( IContainer container, String modelName) throws ModelWorkspaceException { IProject project = container.getProject(); String actualModelName = modelName; if( !modelName.toLowerCase().endsWith(XMI_EXT)) { actualModelName = modelName + XMI_EXT; } IPath relativeModelPath = container.getFullPath().removeFirstSegments(1).append(actualModelName); final IFile modelFile = project.getFile( relativeModelPath ); final ModelResource resrc = ModelerCore.create( modelFile ); resrc.getModelAnnotation().setPrimaryMetamodelUri( RELATIONAL_PACKAGE_URI ); resrc.getModelAnnotation().setModelType(ModelType.VIRTUAL_LITERAL); ModelerCore.getModelEditor().getAllContainers(resrc.getEmfResource()); return resrc; } @Override public void build( ModelResource modelResource, RelationalModel model, IProgressMonitor progressMonitor ) { try { buildFullModel(model, modelResource, progressMonitor); modelResource.save(new NullProgressMonitor(), true); } catch (ModelerCoreException e) { RelationalPlugin.Util.log(IStatus.ERROR, e, e.getMessage()); } catch (CoreException e) { RelationalPlugin.Util.log(IStatus.ERROR, e, e.getMessage()); } } @Override public EObject buildObject( RelationalReference obj, ModelResource modelResource, IProgressMonitor progressMonitor ) throws ModelWorkspaceException { EObject newEObject = null; String msg = TransformationPlugin.Util.getString("RelationalViewModelFactory.relationalModelFactory_creatingModelChild", obj.getName()); //$NON-NLS-1$ progressMonitor.setTaskName(msg); switch (obj.getType()) { case TYPES.MODEL: { // NOOP. Shouldn't get here } break; case TYPES.SCHEMA: { throw new UnsupportedOperationException(Messages.virtualSchemaUnsupportedMessage); } case TYPES.CATALOG: { throw new UnsupportedOperationException(Messages.virtualCatalogUnsupportedMessage); } case TYPES.TABLE: { // Create the Table EObject baseTable = createBaseTable(obj, modelResource); modelResource.getEmfResource().getContents().add(baseTable); applyTableExtensionProperties((RelationalTable)obj, (BaseTable)baseTable, true); // Set the transformation SQL RelationalViewTable viewTable = (RelationalViewTable)obj; TransformationHelper.createTransformation(baseTable, viewTable.getTransformationSQL()); } break; case TYPES.VIEW: { throw new UnsupportedOperationException(Messages.virtualViewUnsupportedMessage); } case TYPES.PROCEDURE: { EObject procedure = createProcedure(obj, modelResource); modelResource.getEmfResource().getContents().add(procedure); // Set the transformation SQL RelationalViewProcedure viewProc = (RelationalViewProcedure)obj; TransformationHelper.createTransformation(procedure, viewProc.getTransformationSQL()); applyProcedureExtensionProperties((RelationalProcedure)obj,(Procedure) procedure); } break; case TYPES.INDEX: { super.buildObject(obj, modelResource, progressMonitor); } break; case TYPES.UNDEFINED: default: { RelationalPlugin.Util.log(IStatus.WARNING, NLS.bind(org.teiid.designer.relational.Messages.relationalModelFactory_unknown_object_type_0_cannot_be_processed, obj.getName())); } break; } return newEObject; } @Override protected void applyTableExtensionProperties(RelationalTable tableRef, BaseTable baseTable, boolean isVirtual) { // Set Extension Properties here final RelationalModelExtensionAssistant assistant = getExtensionAssistant(); if( assistant != null ) { try { if( ((RelationalViewTable)tableRef).isGlobalTempTable() ) { assistant.setPropertyValue(baseTable, BASE_TABLE_EXT_PROPERTIES.VIEW_TABLE_GLOBAL_TEMP_TABLE, Boolean.toString(true) ); } } catch (Exception ex) { RelationalPlugin.Util.log(IStatus.ERROR, ex, NLS.bind(org.teiid.designer.relational.Messages.relationalModelFactory_error_setting_extension_props_on_0, tableRef.getName())); } } } @Override protected void applyProcedureExtensionProperties( RelationalProcedure procedureRef, Procedure procedure) { RelationalViewProcedure viewProcedure = (RelationalViewProcedure)procedureRef; if( !viewProcedure.isFunction() ) { RestModelExtensionAssistant.setRestProperties( procedure, viewProcedure.getRestMethod(), viewProcedure.getRestUri(), viewProcedure.getRestCharSet(), viewProcedure.getRestHeaders(), viewProcedure.getRestDescription()); } super.applyProcedureExtensionProperties(procedureRef, procedure); } public void addTransformation(BaseTable baseTable, RelationalViewTable viewTable) { // Set the transformation SQL TransformationHelper.createTransformation(baseTable, viewTable.getTransformationSQL()); } }