/******************************************************************************* | |
* Copyright (c) 2006, 2012 Oracle Corporation and others. | |
* | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* Oracle Corporation | |
*******************************************************************************/ | |
package org.eclipse.bpel.ui.wizards; | |
import java.util.Date; | |
import java.util.HashMap; | |
import java.util.Map; | |
import org.eclipse.bpel.common.ui.details.viewers.ComboViewer; | |
import org.eclipse.bpel.model.util.BPELConstants; | |
import org.eclipse.bpel.ui.BPELUIPlugin; | |
import org.eclipse.bpel.ui.IBPELUIConstants; | |
import org.eclipse.core.resources.IResource; | |
import org.eclipse.core.resources.ResourcesPlugin; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.jface.dialogs.IDialogSettings; | |
import org.eclipse.jface.resource.ImageDescriptor; | |
import org.eclipse.jface.viewers.ArrayContentProvider; | |
import org.eclipse.jface.viewers.ISelectionChangedListener; | |
import org.eclipse.jface.viewers.IStructuredSelection; | |
import org.eclipse.jface.viewers.LabelProvider; | |
import org.eclipse.jface.viewers.SelectionChangedEvent; | |
import org.eclipse.jface.viewers.StructuredSelection; | |
import org.eclipse.jface.wizard.IWizardPage; | |
import org.eclipse.jface.wizard.WizardPage; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.events.ModifyEvent; | |
import org.eclipse.swt.events.ModifyListener; | |
import org.eclipse.swt.events.SelectionEvent; | |
import org.eclipse.swt.events.SelectionListener; | |
import org.eclipse.swt.graphics.Image; | |
import org.eclipse.swt.layout.GridData; | |
import org.eclipse.swt.layout.GridLayout; | |
import org.eclipse.swt.widgets.Button; | |
import org.eclipse.swt.widgets.Combo; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Event; | |
import org.eclipse.swt.widgets.Label; | |
import org.eclipse.swt.widgets.Text; | |
import org.eclipse.ui.plugin.AbstractUIPlugin; | |
/** | |
* The first page of the wizard to create a new BPEL process. | |
* <p> | |
* This page deals with the creation mode and the general properties of the BPEL to create. | |
* </p> | |
* | |
* @author Michal Chmielewski - Oracle | |
* @author Vincent Zurczak - EBM WebSourcing | |
*/ | |
public class NewBpelFileFirstPage extends WizardPage { | |
/** | |
* The page's name, so that it can be referenced from other pages. | |
*/ | |
public static final String PAGE_NAME = "bpel-first-page"; | |
/** | |
* The creation mode. | |
*/ | |
private BpelCreationMode creationMode; | |
/** | |
* The process name and name space. | |
*/ | |
private String processName, processNamespace; | |
/** | |
* True to create an abstract process, false otherwise. | |
*/ | |
private boolean abstractProcess; | |
/** | |
* The properties to pass to the template. | |
*/ | |
private final Map<String,Object> processTemplateProperties; | |
/** | |
* Images used in the wizard. | |
*/ | |
private Image wsdlImg, arrowImg, bpelImg, tplImg; | |
/** | |
* Constructor. | |
*/ | |
public NewBpelFileFirstPage() { | |
super( PAGE_NAME ); | |
setTitle( Messages.NewFileWizardPage1_2 ); | |
setDescription( Messages.NewFileWizardPage1_3 ); | |
setImageDescriptor( BPELUIPlugin.INSTANCE.getImageDescriptor( IBPELUIConstants.ICON_WIZARD_BANNER )); | |
this.processTemplateProperties = new HashMap<String,Object> (); | |
try { | |
ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/wsdl.png" ); | |
this.wsdlImg = desc.createImage(); | |
} catch( Exception e ) { | |
BPELUIPlugin.log( e, IStatus.WARNING ); | |
} | |
try { | |
ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/bpel-skeleton-2.png" ); | |
this.bpelImg = desc.createImage(); | |
} catch( Exception e ) { | |
BPELUIPlugin.log( e, IStatus.WARNING ); | |
} | |
try { | |
ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/arrow.png" ); | |
this.arrowImg = desc.createImage(); | |
} catch( Exception e ) { | |
BPELUIPlugin.log( e, IStatus.WARNING ); | |
} | |
try { | |
ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/templates.png" ); | |
this.tplImg = desc.createImage(); | |
} catch( Exception e ) { | |
BPELUIPlugin.log( e, IStatus.WARNING ); | |
} | |
} | |
/* | |
* (non-Javadoc) | |
* @see org.eclipse.jface.dialogs.DialogPage | |
* #dispose() | |
*/ | |
@Override | |
public void dispose() { | |
if( this.wsdlImg != null && ! this.wsdlImg.isDisposed()) | |
this.wsdlImg.dispose(); | |
if( this.arrowImg != null && ! this.arrowImg.isDisposed()) | |
this.arrowImg.dispose(); | |
if( this.bpelImg != null && ! this.bpelImg.isDisposed()) | |
this.bpelImg.dispose(); | |
if( this.tplImg != null && ! this.tplImg.isDisposed()) | |
this.tplImg.dispose(); | |
super.dispose(); | |
} | |
/* | |
* (non-Javadoc) | |
* @see org.eclipse.jface.wizard.WizardPage | |
* #getNextPage() | |
*/ | |
@Override | |
public IWizardPage getNextPage() { | |
IWizardPage nextPage; | |
if( this.creationMode == BpelCreationMode.CREATE_NEW_BPEL ) | |
nextPage = getWizard().getPage( NewBpelFileTemplatePage.PAGE_NAME ); | |
else | |
nextPage = getWizard().getPage( NewBpelFilePortTypePage.PAGE_NAME ); | |
nextPage.setPreviousPage( this ); | |
return nextPage; | |
} | |
/** | |
* @return the abstractProcess | |
*/ | |
public boolean isAbstractProcess() { | |
return this.abstractProcess; | |
} | |
/** | |
* @return the properties for the templates | |
*/ | |
public Map<String,Object> getProcessTemplateProperties() { | |
return this.processTemplateProperties; | |
} | |
/** | |
* @return the creationMode | |
*/ | |
public BpelCreationMode getCreationMode() { | |
return this.creationMode; | |
} | |
/* | |
* (non-Javadoc) | |
* @see org.eclipse.jface.dialogs.IDialogPage | |
* #createControl(org.eclipse.swt.widgets.Composite) | |
*/ | |
@Override | |
public void createControl( Composite parent ) { | |
// Create the container | |
final Composite container = new Composite( parent, SWT.NONE ); | |
container.setFont( parent.getFont()); | |
initializeDialogUnits( parent ); | |
container.setLayout( new GridLayout( 2, false )); | |
container.setLayoutData( new GridData( GridData.FILL_BOTH )); | |
setControl( container ); | |
// Add a combo to select the creation mode | |
Label label = new Label( container, SWT.NONE ); | |
label.setText( "Creation Mode:" ); | |
label.setToolTipText( "Select the way to create a new BPEL process" ); | |
final ComboViewer creationViewer = new ComboViewer( container, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY ); | |
creationViewer.setContentProvider( new ArrayContentProvider()); | |
creationViewer.setLabelProvider( new LabelProvider()); | |
creationViewer.setInput( BpelCreationMode.values()); | |
// Add the other common widgets | |
Label l = new Label( container, SWT.NONE ); | |
l.setText( Messages.NewFileWizardPage1_5 ); | |
l.setToolTipText( "The name of the BPEL process" ); | |
Text processNameText = new Text( container, SWT.BORDER | SWT.SINGLE ); | |
processNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); | |
if( this.processName != null ) | |
processNameText.setText( this.processName ); | |
processNameText.addModifyListener( new ModifyListener() { | |
@Override | |
public void modifyText( ModifyEvent e ) { | |
NewBpelFileFirstPage.this.processName = ((Text) e.widget).getText(); | |
updateStatus(); | |
} | |
}); | |
l = new Label( container, SWT.NONE ); | |
l.setText( Messages.NewFileWizardPage1_6 ); | |
l.setToolTipText( "The target namespace of the BPEL process" ); | |
Combo processNamespaceCombo = new Combo( container, SWT.DROP_DOWN | SWT.SIMPLE ); | |
processNamespaceCombo.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); | |
processNamespaceCombo.setItems( BPELUIPlugin.INSTANCE.getTemplates().getNamespaceNames()); | |
if( this.processNamespace != null ) | |
processNamespaceCombo.setText( this.processNamespace ); | |
processNamespaceCombo.addModifyListener( new ModifyListener() { | |
@Override | |
public void modifyText( ModifyEvent e ) { | |
NewBpelFileFirstPage.this.processNamespace = ((Combo) e.widget).getText(); | |
updateStatus(); | |
} | |
}); | |
new Label( container, SWT.NONE ); | |
final Button abstractProcessButton = new Button( container, SWT.CHECK ); | |
abstractProcessButton.setText( "Abstract Process" ); | |
abstractProcessButton.setToolTipText( "Make the created process abstract" ); | |
abstractProcessButton.addSelectionListener( new SelectionListener() { | |
@Override | |
public void widgetSelected( SelectionEvent e ) { | |
widgetDefaultSelected( e ); | |
} | |
@Override | |
public void widgetDefaultSelected( SelectionEvent e ) { | |
NewBpelFileFirstPage.this.abstractProcess = ((Button) e.widget).getSelection(); | |
updateStatus(); | |
} | |
}); | |
// Add an image to illustrate the creation mode | |
Composite imageContainer = new Composite( container, SWT.BORDER ); | |
imageContainer.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE )); | |
GridLayout layout = new GridLayout( 3, false ); | |
layout.horizontalSpacing = 0; | |
layout.marginTop = 12; | |
imageContainer.setLayout( layout ); | |
GridData layoutData = new GridData( GridData.FILL_HORIZONTAL ); | |
layoutData.horizontalSpan = 2; | |
layoutData.verticalIndent = 21; | |
imageContainer.setLayoutData( layoutData ); | |
final Label imgLeftLabel = new Label( imageContainer, SWT.NONE ); | |
imgLeftLabel.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE )); | |
Label imgCenterLabel = new Label( imageContainer, SWT.NONE ); | |
imgCenterLabel.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE )); | |
imgCenterLabel.setLayoutData( new GridData( SWT.CENTER, SWT.CENTER, true, true )); | |
imgCenterLabel.setImage( this.arrowImg ); | |
Label imgRightLabel = new Label( imageContainer, SWT.NONE ); | |
imgRightLabel.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE )); | |
imgRightLabel.setImage( this.bpelImg ); | |
final Text explainationText = new Text( imageContainer, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP ); | |
explainationText.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE )); | |
layoutData = new GridData( GridData.FILL_HORIZONTAL ); | |
layoutData.horizontalSpan = 3; | |
layoutData.verticalIndent = 21; | |
explainationText.setLayoutData( layoutData ); | |
// Detect when the creation mode changes | |
creationViewer.addSelectionChangedListener( new ISelectionChangedListener() { | |
@Override | |
public void selectionChanged( SelectionChangedEvent event ) { | |
NewBpelFileFirstPage.this.creationMode = (BpelCreationMode) ((IStructuredSelection) creationViewer.getSelection()).getFirstElement(); | |
explainationText.setText( NewBpelFileFirstPage.this.creationMode.getDescription()); | |
if( NewBpelFileFirstPage.this.creationMode == BpelCreationMode.GENERATE_BPEL_FROM_WSDL ) | |
imgLeftLabel.setImage( NewBpelFileFirstPage.this.wsdlImg ); | |
else | |
imgLeftLabel.setImage( NewBpelFileFirstPage.this.tplImg ); | |
imgLeftLabel.getParent().layout(); | |
imgLeftLabel.getParent().getParent().layout(); | |
updateStatus(); | |
} | |
}); | |
// Initialize all the stuff | |
creationViewer.setSelection( new StructuredSelection( BpelCreationMode.CREATE_NEW_BPEL )); | |
creationViewer.getCombo().notifyListeners( SWT.Selection, new Event()); | |
if( getErrorMessage() != null ) { | |
setPageComplete( false ); | |
setErrorMessage( null ); | |
} | |
} | |
/** | |
* Validates the page data and updates the page state in consequence. | |
*/ | |
private void updateStatus() { | |
String errorMsg = validatePage(); | |
setPageComplete( errorMsg == null ); | |
setErrorMessage( errorMsg ); | |
} | |
/** | |
* Validates the page data and stores valid values for further use. | |
* @return an error message or null if everything is right | |
*/ | |
private String validatePage() { | |
String errorMsg = null; | |
// Validate the page fields | |
IStatus nameStatus; | |
if( this.processName == null || this.processName.trim().length() == 0 ) | |
errorMsg = "You have to specify the process name."; | |
else if( this.processName.matches( "\\s" )) | |
errorMsg = "The process name cannot contain spaces or white characters."; | |
else if( ! ( nameStatus = ResourcesPlugin.getWorkspace().validateName( this.processName, IResource.FILE )).isOK()) | |
errorMsg = nameStatus.getMessage(); | |
else if( this.processNamespace == null || this.processNamespace.trim().length() == 0 ) | |
errorMsg = "You have to specify the process namespace."; | |
// No error => store properties for the templates | |
if( errorMsg == null | |
&& this.creationMode == BpelCreationMode.CREATE_NEW_BPEL ) { | |
String bpelNamespace = this.abstractProcess ? BPELConstants.NAMESPACE_ABSTRACT_2007 : BPELConstants.NAMESPACE; | |
this.processTemplateProperties.put( "processName", this.processName ); //$NON-NLS-1$ | |
this.processTemplateProperties.put( "namespace", this.processNamespace ); //$NON-NLS-1$ | |
this.processTemplateProperties.put( "bpelNamespace", bpelNamespace ); //$NON-NLS-1$ | |
this.processTemplateProperties.put( "date", new Date()); //$NON-NLS-1$ | |
} | |
// Save some fields for further use | |
IDialogSettings settings = getWizard().getDialogSettings(); | |
if( settings != null ) | |
settings.put( NewBpelFileWizard.DIALOG_SETTINGS_PROCESS_NAME, this.processName ); | |
return errorMsg; | |
} | |
/** | |
* The different modes to create a new BPEL to edit. | |
*/ | |
public static enum BpelCreationMode { | |
CREATE_NEW_BPEL, GENERATE_BPEL_FROM_WSDL; | |
/* | |
* (non-Javadoc) | |
* @see java.lang.Enum#toString() | |
*/ | |
@Override | |
public String toString() { | |
String result; | |
switch( this ) { | |
case CREATE_NEW_BPEL: | |
result = "Create a BPEL process from a template"; | |
break; | |
case GENERATE_BPEL_FROM_WSDL: | |
result = "Create a BPEL process from a service description"; | |
break; | |
default: | |
result = ""; | |
} | |
return result; | |
}; | |
/** | |
* @return a more detailed description | |
*/ | |
public String getDescription() { | |
String result; | |
switch( this ) { | |
case CREATE_NEW_BPEL: | |
result = "This will generate a skeleton of BPEL process.\nThis skeleton is based on pre-defined templates."; | |
break; | |
case GENERATE_BPEL_FROM_WSDL: | |
result = "This will generate a skeleton of BPEL process to implement a given WSDL contract.\n" | |
+ "\t \u2666 \tThe resulting process starts with a pick activity.\n" | |
+ "\t \u2666 \tMessage dispatching depends on the invoked operation."; | |
break; | |
default: | |
result = ""; | |
} | |
return result; | |
} | |
} | |
} |