/****************************************************************************** * Copyright (c) 2008-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsourcing.petals.services.su.wizards.pages; import java.util.Arrays; import java.util.List; import javax.xml.namespace.QName; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import com.ebmwebsourcing.petals.common.generation.Mep; import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultSelectionListener; import com.ebmwebsourcing.petals.common.internal.provisional.swt.QNameText; import com.ebmwebsourcing.petals.common.internal.provisional.utils.StringUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.SwtFactory; import com.ebmwebsourcing.petals.services.su.extensions.SuWizardSettings; import com.ebmwebsourcing.petals.services.su.ui.EnhancedConsumeDialog; import com.sun.java.xml.ns.jbi.AbstractEndpoint; /** * JBI page for Binding Components in "consume". * @author Vincent Zurczak - EBM WebSourcing */ public class JbiConsumePage extends JbiAbstractPage { private Button invokeByServiceButton, invokeByEndpointButton; private QNameText operationQText; private ComboViewer mepViewer; private List<Mep> supportedMep; private boolean invokeByServiceName = false; private boolean invokeByEndpointName = false; /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.DialogPage * #getDescription() */ @Override public String getDescription() { return "Specify the invocation properties of a Petals service."; } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.tools.eclipse.su.main.pages.AbstractJbiPage * #createCustomControls(org.eclipse.swt.widgets.Composite) */ @Override public void createCustomControls( Composite container ) { // Prepare the supported MEP Mep[] meps = getWizard().getComponentVersionDescription().getSupportedMep(); if( meps == null ) meps = new Mep[ 0 ]; this.supportedMep = Arrays.asList( meps ); // Usual controls addWorkspaceBrowser( container ); createCommonControls( container, 20 ); createCheckboxes( container ); // Disable invocation by end-point for auto-generated end-points this.edptText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { String autogenValue = getWizard().getComponentVersionDescription().getAutoGeneratedEndpointValue(); boolean autogen = autogenValue.equals( JbiConsumePage.this.edptText.getText().trim()); if( autogen ) { JbiConsumePage.this.invokeByEndpointName = false; JbiConsumePage.this.invokeByEndpointButton.setSelection( false ); } } }); } /** * The widgets to define the invocation properties. * @param container */ private void createCheckboxes( Composite container ) { // Add the button asking if we should generate the end-point. SwtFactory.createLabel( container, "", null ); //$NON-NLS-1$ this.invokeByServiceButton = SwtFactory.createCheckBoxButton( container, "Invoke by service name", "Use this service name in the selection of a service provider", this.invokeByServiceName ); SwtFactory.createLabel( container, "", null ); //$NON-NLS-1$ this.invokeByEndpointButton = SwtFactory.createCheckBoxButton( container, "Invoke by end-point name", "Use this end-point name in the selection of a service provider", this.invokeByEndpointName ); this.invokeByEndpointButton.setEnabled( this.invokeByServiceName ); // Add the MEP and operation widgets SuWizardSettings settings = getWizard().getSettings(); if( settings.showOperationName ) { Label l = SwtFactory.createLabel( container, "Operation Name:", null ); //$NON-NLS-1$ GridDataFactory.swtDefaults().indent( 0, 20 ).applyTo( l ); this.operationQText = SwtFactory.createQNameTextField( container, false, "Operation", "http://Your.Operation.Namespace/" ); GridDataFactory.swtDefaults().align( SWT.FILL, SWT.CENTER ).indent( 0, 20 ).applyTo( this.operationQText ); this.operationQText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { getWizard().getSettings().invokedOperation = JbiConsumePage.this.operationQText.getValue(); validate(); } }); } if( settings.showMep ) { SwtFactory.createLabel( container, "Invocation MEP *:", "The Message Exchange Pattern" ); this.mepViewer = SwtFactory.createDefaultComboViewer( container, true, true, Mep.values()); this.mepViewer.addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event ) { Mep mep = (Mep) ((IStructuredSelection) JbiConsumePage.this.mepViewer.getSelection()).getFirstElement(); getWizard().getSettings().invocationMep = mep; validate(); } }); } // Listeners this.invokeByServiceButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // Update the UI JbiConsumePage.this.invokeByServiceName = ((Button) e.widget).getSelection(); JbiConsumePage.this.srvQText.setEnabled( JbiConsumePage.this.invokeByServiceName ); if( ! JbiConsumePage.this.invokeByServiceName ) { JbiConsumePage.this.invokeByEndpointName = false; JbiConsumePage.this.invokeByEndpointButton.setSelection( false ); JbiConsumePage.this.edptText.setEnabled( false ); } JbiConsumePage.this.invokeByEndpointButton.setEnabled( JbiConsumePage.this.invokeByServiceName ); JbiConsumePage.this.invokeByEndpointButton.notifyListeners( SWT.Selection, new Event()); // Update the model if( JbiConsumePage.this.invokeByServiceName ) getNewlyCreatedEndpoint().setServiceName( JbiConsumePage.this.srvQText.getValue()); else getNewlyCreatedEndpoint().setServiceName( null ); validate(); } }); this.invokeByEndpointButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { // Update the UI JbiConsumePage.this.invokeByEndpointName = ((Button) e.widget).getSelection(); JbiConsumePage.this.edptText.setEnabled( JbiConsumePage.this.invokeByEndpointName ); // Update the model if( JbiConsumePage.this.invokeByEndpointName ) getNewlyCreatedEndpoint().setEndpointName( JbiConsumePage.this.edptText.getText()); else getNewlyCreatedEndpoint().setEndpointName( null ); validate(); } }); this.invokeByServiceButton.notifyListeners( SWT.Selection, new Event()); this.invokeByEndpointButton.notifyListeners( SWT.Selection, new Event()); } /** * Adds a browser to look for "provide" end-points in the workspace. * @param table */ private void addWorkspaceBrowser( final Composite table ) { Composite container = SwtFactory.createComposite( table ); SwtFactory.applyNewGridLayout( container, 2, false, 5, 0, 5, 0 ); SwtFactory.applyHorizontalGridData( container, 2 ); new Label( container, SWT.NONE ).setImage( this.tipImage ); // Add an hyper link Link selectLink = new Link( container, SWT.NONE ); selectLink.setText( "<A>Select a service</A> from the Petals Services view to fill in these fields automatically." ); selectLink.setToolTipText( "Select an end-point to consume among the currently referenced end-points" ); selectLink.addSelectionListener( new DefaultSelectionListener() { @Override public void widgetSelected(SelectionEvent e) { EnhancedConsumeDialog dlg = new EnhancedConsumeDialog( getShell()); dlg.setConstrainedMep( JbiConsumePage.this.supportedMep ); SuWizardSettings settings = getWizard().getSettings(); boolean needOperation = settings.showOperationName && settings.showMep; dlg.setNeedOperation( needOperation ); if( dlg.open() == Window.OK ) { JbiConsumePage.this.itfQText.setValue( dlg.getItfToInvoke()); JbiConsumePage.this.srvQText.setValue( dlg.getSrvToInvoke()); JbiConsumePage.this.edptText.setText( dlg.getEdptToInvoke() == null ? "" : dlg.getEdptToInvoke()); QName op = dlg.getOperationToInvoke(); if( EnhancedConsumeDialog.NO_OPERATION.equals( op )) op = null; if( JbiConsumePage.this.operationQText != null ) JbiConsumePage.this.operationQText.setValue( op ); if( JbiConsumePage.this.mepViewer != null ) { JbiConsumePage.this.mepViewer.setSelection( new StructuredSelection( dlg.getInvocationMep())); JbiConsumePage.this.mepViewer.getCombo().notifyListeners( SWT.Selection, new Event()); } } } }); } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.tools.eclipse.su.main.pages.AbstractSuPage * #validate() */ @Override public boolean validate() { setMessage( null ); setMessage( null, IMessageProvider.WARNING ); // Interface name AbstractEndpoint ae = getNewlyCreatedEndpoint(); SuWizardSettings settings = getWizard().getSettings(); if( settings.validateInterface && ae.getInterfaceName() == null ) { updateStatus( "You have to provide the interface name." ); return false; } // Service name if( this.invokeByServiceName && ae.getServiceName() == null ) { updateStatus( "You have to provide the service name" ); return false; } // End-point name if( this.invokeByEndpointName && StringUtils.isEmpty( ae.getEndpointName())) { updateStatus( "You have to define the end-point name." ); return false; } if( this.invokeByEndpointName && getWizard().getComponentVersionDescription().getAutoGeneratedEndpointValue().equals( ae.getEndpointName())) { updateStatus( "You cannot invoke by end-point name with autogenerated end-points." ); return false; } // MEP if( getWizard().getSettings().invocationMep == null ) { updateStatus( "You have to define the invocation MEP." ); return false; } // Update data. updateStatus( null ); // Make sure this service can be invoked (MEP) Mep invocationMep = getWizard().getSettings().invocationMep; if( invocationMep != null && ! this.supportedMep.isEmpty() && ! this.supportedMep.contains( invocationMep )) { String msg = "This invocation MEP is not supported by the component. Only " + Mep.listMep( this.supportedMep ) + " MEPs are supported."; setMessage( msg, IMessageProvider.WARNING ); } return true; } }