/*
* 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.modelgenerator.wsdl.ui.wizards.soap;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.ide.IDE;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.modelgenerator.wsdl.ModelBuildingException;
import org.teiid.designer.modelgenerator.wsdl.RelationalModelBuilder;
import org.teiid.designer.modelgenerator.wsdl.model.Model;
import org.teiid.designer.modelgenerator.wsdl.model.ModelGenerationException;
import org.teiid.designer.modelgenerator.wsdl.ui.Messages;
import org.teiid.designer.modelgenerator.wsdl.ui.ModelGeneratorWsdlUiConstants;
import org.teiid.designer.modelgenerator.wsdl.ui.ModelGeneratorWsdlUiPlugin;
import org.teiid.designer.modelgenerator.wsdl.ui.ModelGeneratorWsdlUiConstants.Images;
import org.teiid.designer.modelgenerator.wsdl.ui.wizards.WSDLImportWizardManager;
import org.teiid.designer.schema.tools.processing.SchemaProcessingException;
import org.teiid.designer.ui.common.util.UiUtil;
import org.teiid.designer.ui.common.wizard.AbstractWizard;
import org.teiid.designer.ui.common.wizard.NoOpenProjectsWizardPage;
import org.teiid.designer.ui.viewsupport.DesignerPropertiesUtil;
import org.teiid.designer.ui.viewsupport.IPropertiesContext;
import org.teiid.designer.ui.viewsupport.ModelerUiViewUtils;
/**
* @since 8.0
*/
public class ImportWsdlSoapWizard extends AbstractWizard implements IImportWizard, IPropertiesContext {
private static final String TITLE = Messages.ImportWsdlSoapWizard_title;
private static final ImageDescriptor IMAGE = ModelGeneratorWsdlUiPlugin.getDefault().getImageDescriptor(Images.IMPORT_WSDL_ICON);
/** This manager interfaces with the relational from wsdl generator */
private WSDLImportWizardManager importManager = new WSDLImportWizardManager();
/** The page where the WSDL source file and Relational target model are selected. */
private WsdlDefinitionPage selectWsdlPage;
/** The page where the user provides details to the generated create and extract procedures */
private WizardPage operationsDetailsPage;
private WizardPage modelDefinitionPage;
private WizardPage dataSourceDefinitionPage;
private WizardPage operationsOptionsPage;
private IStructuredSelection selection;
private boolean openProjectExists = true;
private IProject newProject;
/**
* Creates a wizard for generating relational entities from WSDL source.
*/
public ImportWsdlSoapWizard() {
super(ModelGeneratorWsdlUiPlugin.getDefault(), TITLE, IMAGE);
}
/**
* @see org.eclipse.jface.wizard.IWizard#createPageControls(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPageControls( Composite pageContainer ) {
super.createPageControls(pageContainer);
updateForProperties();
}
/**
* Method declared on IWorkbenchWizard.
*/
@Override
public void init( IWorkbench workbench,
IStructuredSelection currentSelection ) {
IProject targetProject = null;
this.selection = currentSelection;
List selectedResources = IDE.computeSelectedResources(currentSelection);
if (!selectedResources.isEmpty()) {
this.selection = new StructuredSelection(selectedResources);
}
openProjectExists = ModelerUiViewUtils.workspaceHasOpenModelProjects();
if( !openProjectExists ) {
newProject = ModelerUiViewUtils.queryUserToCreateModelProject();
if( newProject != null ) {
selection = new StructuredSelection(newProject);
targetProject = newProject;
openProjectExists = true;
} else {
openProjectExists = false;
}
}
Object selectedObj = selection.getFirstElement();
if( targetProject == null ) {
if( selectedObj instanceof IResource ) {
targetProject = ((IResource)selectedObj).getProject();
}
}
this.importManager.setTargetProject(targetProject);
createWizardPages(this.selection);
setNeedsProgressMonitor(true);
}
/**
* Create Wizard pages for the wizard
*
* @param theSelection the initial workspace selection
*/
@SuppressWarnings("unused")
public void createWizardPages( ISelection theSelection ) {
if( !this.openProjectExists ) {
addPage(NoOpenProjectsWizardPage.getStandardPage());
return;
}
// construct pages
SELECT_WSDL_PAGE : {
this.selectWsdlPage = new WsdlDefinitionPage(this.importManager, this);
this.selectWsdlPage.setPageComplete(false);
addPage(this.selectWsdlPage);
}
SELECT_MODEL_DEFINITION_PAGE : {
this.modelDefinitionPage = new ModelDefinitionPage(this.importManager, this);
this.modelDefinitionPage.setPageComplete(false);
addPage(this.modelDefinitionPage);
}
DEFINE_JNDI_DATA_SOURCE_PAGE : {
this.dataSourceDefinitionPage = new ImportWsdlDataSourceDefinitionPage(this.importManager, this);
this.dataSourceDefinitionPage.setPageComplete(true);
addPage(this.dataSourceDefinitionPage);
}
SELECT_OPERATIONS_PAGE : {
this.operationsOptionsPage = new OperationsOptionsPage(this.importManager, this);
this.operationsOptionsPage.setPageComplete(false);
addPage(this.operationsOptionsPage);
}
OPERATIONS_DETAILS_PAGE : {
this.operationsDetailsPage = new OperationsDetailsPage(this.importManager);
this.operationsDetailsPage.setPageComplete(false);
addPage(this.operationsDetailsPage);
}
// give the WSDL selection page the current workspace selection
this.selectWsdlPage.setInitialSelection(theSelection);
}
/**
* @see org.eclipse.jface.wizard.IWizard#performFinish()
* @since 4.0
*/
@Override
public boolean finish() {
if( !this.importManager.doGenerateDefaultProcedures() ) {
runFinishWithDetails();
return true;
}
boolean result = false;
// Save object selections from previous page
final IRunnableWithProgress op = new IRunnableWithProgress() {
@Override
public void run( final IProgressMonitor monitor ) throws InvocationTargetException {
// Wrap in transaction so it doesn't result in Significant Undoable
boolean started = ModelerCore.startTxn(false, false, "Generate Models From WSDL", //$NON-NLS-1$
new Object());
boolean succeeded = false;
try {
runFinishAsDefault(monitor);
succeeded = true;
} catch (ModelBuildingException mbe) {
mbe.printStackTrace(System.err);
throw new InvocationTargetException(mbe);
} catch (Throwable t) {
throw new InvocationTargetException(t);
} finally {
if (started) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
}
};
try {
ProgressMonitorDialog dlg = new ProgressMonitorDialog(getShell());
dlg.run(true, true, op);
result = true;
} catch (Throwable err) {
if (err instanceof InvocationTargetException) {
Throwable t = ((InvocationTargetException)err).getTargetException();
final IStatus iteStatus = new Status(IStatus.ERROR, ModelGeneratorWsdlUiConstants.PLUGIN_ID, IStatus.ERROR, Messages.ImportWsdlSoapWizard_importError_msg, t);
ErrorDialog.openError(this.getShell(),
Messages.ImportWsdlSoapWizard_importError_title,
Messages.ImportWsdlSoapWizard_importError_msg, iteStatus);
t.printStackTrace(System.err);
} else {
final IStatus status = new Status(IStatus.ERROR, ModelGeneratorWsdlUiConstants.PLUGIN_ID, IStatus.ERROR, Messages.ImportWsdlSoapWizard_importError_msg, err);
ErrorDialog.openError(this.getShell(),
Messages.ImportWsdlSoapWizard_importError_title,
Messages.ImportWsdlSoapWizard_importError_msg, status);
err.printStackTrace(System.err);
}
} finally {
dispose();
}
return result;
}
private void runFinishAsDefault(final IProgressMonitor theMonitor ) throws ModelGenerationException, SchemaProcessingException, ModelBuildingException {
// Target Model Name
// Target location for the new model
IContainer container = this.importManager.getViewModelLocation();
// The Selected Operations
Model model = importManager.getWSDLModel();
RelationalModelBuilder modelBuilder = new RelationalModelBuilder(model, this.importManager.getConnectionProfile());
try {
modelBuilder.modelOperations(this.importManager.getSelectedOperations(),
this.importManager.getSourceModelLocation(), this.importManager.getSourceModelName(),
this.importManager.getViewModelLocation(), this.importManager.getViewModelName());
} catch (ModelWorkspaceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ModelerCoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void runFinishWithDetails( ) {
UiUtil.runInSwtThread(new Runnable() {
@Override
public void run() {
ImportWsdlProcessor processor = new ImportWsdlProcessor(importManager, Display.getCurrent().getActiveShell());
processor.execute();
}
}, false);
}
/**
*
*/
public void notifyManagerChanged() {
// First, check the importManager's doGenerateDefaultProcedures() method.
boolean doGenerate = this.importManager.doGenerateDefaultProcedures();
if( doGenerate ) {
// Remove page 3
removePage(this.operationsDetailsPage);
} else {
addPage(this.operationsDetailsPage);
}
}
@Override
public void setProperties(Properties props) {
this.importManager.setDesignerProperties(props);
}
protected void updateForProperties() {
Properties designerProperties = this.importManager.getDesignerProperties();
if (designerProperties == null) {
return;
}
// Check for sources and views folders in Property Definitions
if( this.importManager.getSourceModelLocation() == null) {
IContainer project = DesignerPropertiesUtil.getProject(designerProperties);
IContainer srcResource = DesignerPropertiesUtil.getSourcesFolder(designerProperties);
if (srcResource != null) {
this.importManager.setSourceModelLocation(srcResource);
} else if( project != null ) {
this.importManager.setSourceModelLocation(project);
}
}
// Check for sources and views folders in Property Definitions
if( this.importManager.getViewModelLocation() == null) {
IContainer project = DesignerPropertiesUtil.getProject(designerProperties);
IContainer viewResource = DesignerPropertiesUtil.getViewsFolder(designerProperties);
if (viewResource != null) {
this.importManager.setViewModelLocation(viewResource);
} else if( project != null ) {
this.importManager.setViewModelLocation(project);
}
}
if( this.importManager.getConnectionProfile() == null ) {
// check for Connection Profile in property definitions
String profileName = DesignerPropertiesUtil.getConnectionProfileName(designerProperties);
if( profileName != null && !profileName.isEmpty() ) {
// Select profile
selectWsdlPage.selectConnectionProfile(profileName);
}
}
if( !this.openProjectExists) {
DesignerPropertiesUtil.setProjectStatus(designerProperties, IPropertiesContext.NO_OPEN_PROJECT);
}
}
}