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