blob: d73b0c765275cc4be57183f12ae7567926372010 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}