package org.teiid.designer.relational.ui.webservice; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.wizard.IWizardPage; import org.teiid.core.designer.ModelerCoreException; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.metamodel.MetamodelDescriptor; 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.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.RelationalFactory; import org.teiid.designer.metamodels.relational.RelationalPackage; import org.teiid.designer.relational.ui.UiConstants; import org.teiid.designer.ui.wizards.INewModelWizardContributor; /** * @since 8.0 */ public class WebServiceRelationalModelContributor implements INewModelWizardContributor { public static final String RELATIONAL_PACKAGE_URI = RelationalPackage.eNS_URI; public static final RelationalFactory factory = RelationalFactory.eINSTANCE; public static final DatatypeManager datatypeManager = ModelerCore.getWorkspaceDatatypeManager(); private static boolean isTransactionable = ModelerCore.getPlugin() != null; // // Instance variables: // private IWizardPage[] pages; private WebServiceRelationalModelWizardPage webServiceProcedures; /** * Construct an instance of WebServiceRelationalModelContributor. */ public WebServiceRelationalModelContributor() { super(); } @Override public boolean canFinishEarly(IWizardPage theCurrentPage) { return false; } @Override public void createWizardPages(ISelection selection, IResource targetResource, IPath targetFilePath, MetamodelDescriptor descriptor, boolean isVirtual) { pages = new IWizardPage[1]; webServiceProcedures = new WebServiceRelationalModelWizardPage( "webServiceProceduresPage"); //$NON-NLS-1$ pages[0] = webServiceProcedures; } @Override public void currentPageChanged(IWizardPage page) { // TODO Auto-generated method stub } @Override public void doCancel() { // TODO Auto-generated method stub } @Override public void doFinish(ModelResource modelResource, IProgressMonitor monitor) { String transactionName = UiConstants.Util.getString("WebServiceRelationalModelContributor.transactionName"); //$NON-NLS-1$ boolean started = ModelerCore.startTxn(transactionName, this); boolean succeeded = false; try { if( webServiceProcedures.doGenerateInvoke() ) { addInvokeProcedure(modelResource); } if( webServiceProcedures.doGenerateInvokeHttp() ) { addInvokeHttpProcedure(modelResource); } succeeded = true; } catch (Exception ex) { String message = UiConstants.Util.getString("WebServiceRelationalModelContributor.doFinishError", //$NON-NLS-1$ modelResource.getItemName()); UiConstants.Util.log(IStatus.ERROR, ex, message); } finally { if (started) { if(succeeded) { ModelerCore.commitTxn(); } else { ModelerCore.rollbackTxn(); } } } } private void addInvokeProcedure(ModelResource mr) throws ModelerCoreException { EObject stringType = datatypeManager.findDatatype("string"); //$NON-NLS-1$ EObject booleanType = datatypeManager.findDatatype("boolean"); //$NON-NLS-1$ EObject xmlLiteralType = datatypeManager.findDatatype("XMLLiteral"); //$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 = 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 = 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)); } 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 = 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 = 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); if( blobType != null) { 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 = factory.createProcedureParameter(); param.setProcedure(proc); param.setName("headers"); //$NON-NLS-1$ param.setDirection(DirectionKind.OUT_LITERAL); param.setNullable(NullableType.NULLABLE_LITERAL); if( stringType != null) { param.setType(clobType); } addValue(mr, proc, getModelResourceContents(mr)); } private void addValue(final Object owner, final Object value, EList feature) { try { if( isTransactionable ) { ModelerCore.getModelEditor().addValue(owner, value, feature); } else { feature.add(value); } } catch (ModelerCoreException err) { UiConstants.Util.log(IStatus.ERROR, err, UiConstants.Util.getString("FlatFileRelationalModelContributor.addValueError", value, owner)); //$NON-NLS-1$ } } private EList getModelResourceContents(ModelResource resource ) { EList eList = null; try { eList = resource.getEmfResource().getContents(); } catch (ModelWorkspaceException e) { UiConstants.Util.log(IStatus.ERROR, e, UiConstants.Util.getString("FlatFileRelationalModelContributor.getModelContentsError", resource.getItemName())); //$NON-NLS-1$ } return eList; } @Override public IWizardPage[] getWizardPages() { return pages; } @Override public void inputChanged(ISelection selection, IResource targetResource, MetamodelDescriptor descriptor, boolean isVirtual) { // TODO Auto-generated method stub } @Override public ModelResource getSelectedModelResource() { return null; } @Override public boolean copyAllDescriptions() { return false; } }