/******************************************************************************* | |
* 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.HashMap; | |
import java.util.Map; | |
import org.eclipse.bpel.ui.BPELUIPlugin; | |
import org.eclipse.bpel.ui.IBPELUIConstants; | |
import org.eclipse.bpel.ui.Templates; | |
import org.eclipse.bpel.ui.Templates.Template; | |
import org.eclipse.jface.dialogs.IMessageProvider; | |
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.layout.GridData; | |
import org.eclipse.swt.layout.GridLayout; | |
import org.eclipse.swt.widgets.Combo; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Control; | |
import org.eclipse.swt.widgets.Event; | |
import org.eclipse.swt.widgets.Group; | |
import org.eclipse.swt.widgets.Label; | |
import org.eclipse.swt.widgets.Text; | |
/** | |
* The page of the wizard to deal with the WSDL to create. | |
* @author Michal Chmielewski - Oracle | |
* @author Bob Brodt - Red Hat | |
* @author Vincent Zurczak - EBM WebSourcing | |
*/ | |
public class NewBpelFileTemplatePage extends WizardPage { | |
/** | |
* The page's name, so that it can be referenced from other pages. | |
*/ | |
public static final String PAGE_NAME = "wsdl-creation-page"; | |
private static final String SOAP_BINDING = "SOAP"; | |
private static final String HTTP_BINDING = "HTTP"; | |
private static final String SOAP_NAMESPACE="http://schemas.xmlsoap.org/wsdl/soap/"; | |
private static final String HTTP_NAMESPACE="http://schemas.xmlsoap.org/wsdl/http/"; | |
private String processTemplateName, serviceName, address, binding, portName; | |
private Text serviceNameText, portNameText, addressText; | |
private final Map<String,String> processTemplateProperties; | |
/** | |
* Constructor. | |
*/ | |
public NewBpelFileTemplatePage() { | |
super( PAGE_NAME ); | |
this.processTemplateProperties = new HashMap<String,String> (); | |
setTitle( Messages.NewFileWizard_WSDLCustomPage_Title ); | |
setDescription( Messages.NewFileWizard_WSDLCustomPage_Description ); | |
setImageDescriptor( BPELUIPlugin.INSTANCE.getImageDescriptor( IBPELUIConstants.ICON_WIZARD_BANNER )); | |
this.binding = SOAP_BINDING; | |
String[] tplNames = BPELUIPlugin.INSTANCE.getTemplates().getTemplateNames(); | |
if( tplNames != null && tplNames.length > 0 ) | |
this.processTemplateName = tplNames[ 0 ]; | |
} | |
/* | |
* (non-Javadoc) | |
* @see org.eclipse.jface.wizard.WizardPage | |
* #getNextPage() | |
*/ | |
@Override | |
public IWizardPage getNextPage() { | |
// We need to do that since the page order depends on user choices | |
IWizardPage nextPage = getWizard().getPage( NewBpelFileLocationPage.PAGE_NAME ); | |
nextPage.setPreviousPage( this ); | |
return nextPage; | |
} | |
/* | |
* (non-Javadoc) | |
* @see org.eclipse.jface.dialogs.IDialogPage | |
* #createControl(org.eclipse.swt.widgets.Composite) | |
*/ | |
@Override | |
public void createControl( Composite parent ) { | |
// Create the container | |
Composite container = new Composite( parent, SWT.NONE ); | |
initializeDialogUnits( parent ); | |
container.setLayout( new GridLayout( 2, false )); | |
container.setLayoutData( new GridData( GridData.FILL_BOTH )); | |
setControl( container ); | |
// Create the form | |
Label l = new Label( container, SWT.NONE ); | |
l.setText( Messages.NewFileWizardPage1_7 ); | |
l.setToolTipText( "The template to use for the creation of the new process" ); | |
final Combo processTemplateCombo = new Combo( container, SWT.DROP_DOWN | SWT.SIMPLE | SWT.READ_ONLY ); | |
processTemplateCombo.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); | |
processTemplateCombo.setItems( BPELUIPlugin.INSTANCE.getTemplates().getTemplateNames()); | |
// Show the description of the selected template | |
final Text descriptionText = new Text( container, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.WRAP ); | |
descriptionText.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE )); | |
GridData layoutData = new GridData( GridData.FILL_HORIZONTAL ); | |
layoutData.heightHint = 100; | |
layoutData.widthHint = 500; | |
layoutData.horizontalSpan = 2; | |
descriptionText.setLayoutData( layoutData ); | |
// Add a group for the properties of the template | |
final Group propertiesGroup = new Group( container, SWT.SHADOW_ETCHED_OUT ); | |
propertiesGroup.setText( "Template Properties" ); | |
propertiesGroup.setLayout( new GridLayout( 2, false )); | |
layoutData = new GridData( GridData.FILL_HORIZONTAL ); | |
layoutData.horizontalSpan = 2; | |
layoutData.verticalIndent = 16; | |
propertiesGroup.setLayoutData( layoutData ); | |
// Update the UI when the selected template changes | |
processTemplateCombo.addSelectionListener( new SelectionListener() { | |
@Override | |
public void widgetSelected( SelectionEvent e ) { | |
widgetDefaultSelected( e ); | |
} | |
@Override | |
public void widgetDefaultSelected( SelectionEvent e ) { | |
NewBpelFileTemplatePage.this.processTemplateName = processTemplateCombo.getText(); | |
Template tpl = getSelectedTemplate(); | |
String desc = tpl == null ? "No description was found." : tpl.getDescription(); | |
descriptionText.setText( desc ); | |
refreshTemplateWidgets( propertiesGroup ); | |
updateStatus(); | |
} | |
}); | |
// Initialize the remaining stuff | |
processTemplateCombo.select( 0 ); | |
processTemplateCombo.notifyListeners( SWT.Selection, new Event()); | |
if( getErrorMessage() != null ) { | |
setPageComplete( false ); | |
setErrorMessage( null ); | |
} | |
} | |
/** | |
* Refreshes the widgets with options for the templates. | |
* @param container the parent container | |
*/ | |
private void refreshTemplateWidgets( Composite container ) { | |
// Remove the widgets | |
for( Control c : container.getChildren()) | |
c.dispose(); | |
// Add the widgets: first, the service name | |
Label l = new Label( container, SWT.NONE ); | |
l.setText( Messages.NewFileWizard_WSDLCustomPage_ServiceLable ); | |
this.serviceNameText = new Text( container, SWT.BORDER | SWT.SINGLE ); | |
this.serviceNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); | |
if( this.serviceName != null ) | |
this.serviceNameText.setText( this.serviceName ); | |
this.serviceNameText.addModifyListener( new ModifyListener() { | |
@Override | |
public void modifyText( ModifyEvent e ) { | |
NewBpelFileTemplatePage.this.serviceName = ((Text) e.widget).getText(); | |
updateStatus(); | |
} | |
}); | |
// Other widgets do not have to be shown for the "empty" template | |
// https://issues.jboss.org/browse/JBIDE-7165 | |
Template tpl = getSelectedTemplate(); | |
String tplKey = tpl == null ? null : tpl.getKey(); | |
if( ! Templates.TEMPLATE_KEY_EMPTY.equals( tplKey )) { | |
// The port name | |
l = new Label( container, SWT.NONE ); | |
l.setText( Messages.NewFileWizard_WSDLCustomPage_PortLabel ); | |
this.portNameText = new Text( container, SWT.BORDER | SWT.SINGLE ); | |
this.portNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); | |
if( this.portName != null ) | |
this.portNameText.setText( this.portName ); | |
this.portNameText.addModifyListener( new ModifyListener() { | |
@Override | |
public void modifyText( ModifyEvent e ) { | |
NewBpelFileTemplatePage.this.portName = ((Text) e.widget).getText(); | |
updateStatus(); | |
} | |
}); | |
// The address | |
l = new Label( container, SWT.NONE ); | |
l.setText( Messages.NewFileWizard_WSDLCustomPage_AddressLabel ); | |
this.addressText = new Text( container, SWT.BORDER | SWT.SINGLE ); | |
this.addressText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); | |
if( this.address != null ) | |
this.addressText.setText( this.address ); | |
this.addressText.addModifyListener( new ModifyListener() { | |
@Override | |
public void modifyText( ModifyEvent e ) { | |
NewBpelFileTemplatePage.this.address = ((Text) e.widget).getText(); | |
updateStatus(); | |
} | |
}); | |
// The binding | |
l = new Label( container, SWT.NONE ); | |
l.setText( Messages.NewFileWizard_WSDLCustomPage_BindingLabel ); | |
Combo bindingCombo = new Combo( container, SWT.BORDER | SWT.DROP_DOWN | SWT.SIMPLE | SWT.READ_ONLY ); | |
GridData layoutData = new GridData(); | |
layoutData.widthHint = 200; | |
bindingCombo.setLayoutData( layoutData ); | |
bindingCombo.setItems( new String[] { SOAP_BINDING, HTTP_BINDING }); | |
int index = HTTP_BINDING.equals( this.binding ) ? 1 : 0; | |
bindingCombo.select( index ); | |
bindingCombo.notifyListeners( SWT.Selection, new Event()); | |
bindingCombo.addModifyListener( new ModifyListener() { | |
@Override | |
public void modifyText( ModifyEvent e ) { | |
NewBpelFileTemplatePage.this.binding = ((Combo) e.widget).getText(); | |
updateStatus(); | |
} | |
}); | |
} | |
// Lay out the parent | |
container.layout(); | |
container.getParent().layout(); | |
} | |
/* | |
* (non-Javadoc) | |
* @see org.eclipse.jface.dialogs.DialogPage | |
* #setVisible(boolean) | |
*/ | |
@Override | |
public void setVisible( boolean visible ) { | |
// Update some fields | |
if( this.serviceNameText != null && ! this.serviceNameText.isDisposed()) { | |
String pName = getWizard().getDialogSettings().get( NewBpelFileWizard.DIALOG_SETTINGS_PROCESS_NAME ); | |
if( pName != null ) { | |
this.serviceNameText.setText( pName + "Service" ); | |
if( this.portNameText != null && ! this.portNameText.isDisposed()) | |
this.portNameText.setText( pName + "Port" ); | |
if( this.addressText != null && ! this.addressText.isDisposed()) | |
this.addressText.setText( "http://localhost:8080/" + pName ); | |
} | |
} | |
// Do the usual work | |
super.setVisible( visible ); | |
} | |
/** | |
* @return the processTemplateProperties | |
*/ | |
public Map<String, String> getProcessTemplateProperties() { | |
return this.processTemplateProperties; | |
} | |
/** | |
* @return the selected template or null if no template was selected | |
*/ | |
public Template getSelectedTemplate() { | |
return this.processTemplateName == null ? null : BPELUIPlugin.INSTANCE.getTemplates().getTemplateByName( this.processTemplateName ); | |
} | |
/** | |
* Validates the page data and updates the page state in consequence. | |
*/ | |
private void updateStatus() { | |
String errorMsg = validatePage(); | |
setPageComplete( errorMsg == null ); | |
setErrorMessage( errorMsg ); | |
// Specific behavior for the empty template | |
// The created file will be marked as invalid | |
String msg = null; | |
Template tpl = getSelectedTemplate(); | |
String tplKey = tpl == null ? null : tpl.getKey(); | |
if( Templates.TEMPLATE_KEY_EMPTY.equals( tplKey )) | |
msg = "Beware, empty processes are marked as invalid by the BPEL validator."; | |
setMessage( msg, IMessageProvider.WARNING ); | |
} | |
/** | |
* 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 | |
Template tpl; | |
if(( tpl = getSelectedTemplate()) == null ) | |
errorMsg = "The selected template does not match a concrete one."; // Should never happen, but... | |
else if( this.serviceName == null || this.serviceName.trim().length() == 0 ) | |
errorMsg = "You have to specify the service name."; | |
else if( this.serviceName.matches( "\\s" )) | |
errorMsg = "The service name cannot contain spaces or white characters."; | |
if( this.portName == null || this.portName.trim().length() == 0 ) | |
errorMsg = "You have to specify the port name."; | |
else if( this.portName.matches( "\\s" )) | |
errorMsg = "The port name cannot contain spaces or white characters."; | |
if( this.address == null || this.address.trim().length() == 0 ) | |
errorMsg = "You have to specify the service address."; | |
else if( this.address.matches( "\\s" )) | |
errorMsg = "The address cannot contain spaces or white characters."; | |
// No error => store properties for the templates | |
if( errorMsg == null ) { | |
this.processTemplateProperties.put( Templates.PROPERTY_NAME, this.processTemplateName ); | |
this.processTemplateProperties.put( Templates.PROPERTY_KEY, tpl.getKey()); // https://jira.jboss.org/browse/JBIDE-7165 | |
this.processTemplateProperties.put( "serviceName", this.serviceName ); //$NON-NLS-1$ | |
this.processTemplateProperties.put( "portName", this.portName ); //$NON-NLS-1$ | |
this.processTemplateProperties.put( "address", this.address ); //$NON-NLS-1$ | |
this.processTemplateProperties.put( "protocol", this.binding.toLowerCase()); //$NON-NLS-1$ | |
if( SOAP_BINDING.equals( this.binding )) | |
this.processTemplateProperties.put( "protocolNamespace", SOAP_NAMESPACE ); | |
else | |
this.processTemplateProperties.put( "protocolNamespace", HTTP_NAMESPACE ); | |
} | |
return errorMsg; | |
} | |
} |