| /******************************************************************************* |
| * 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; |
| } |
| } |