/****************************************************************************** * 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.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; 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.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.FormText; import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultSelectionListener; import com.ebmwebsourcing.petals.common.internal.provisional.swt.LinkWithImageComposite; import com.ebmwebsourcing.petals.common.internal.provisional.swt.TextWithButtonComposite; import com.ebmwebsourcing.petals.common.internal.provisional.ui.StyledElementListSelectionDialog; import com.ebmwebsourcing.petals.common.internal.provisional.utils.StringUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.SwtFactory; import com.ebmwebsourcing.petals.common.internal.provisional.utils.WsdlUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.WsdlUtils.JbiBasicBean; import com.ebmwebsourcing.petals.services.PetalsServicesPlugin; import com.ebmwebsourcing.petals.services.su.Messages; import com.ebmwebsourcing.petals.services.su.extensions.SuWizardSettings; import com.ebmwebsourcing.petals.services.utils.PCStyledLabelProvider; import com.sun.java.xml.ns.jbi.AbstractEndpoint; /** * JBI page to "provide" a Petals service. * @author Vincent Zurczak - EBM WebSourcing */ public class JbiProvidePage extends JbiAbstractPage { protected String wsdlUrl, wsdlParsingError; protected boolean importWsdl = true; private LinkWithImageComposite wsdlHelper; private ControlDecoration wsdlTextDecoration; private List<JbiBasicBean> jbiBasicBeans; /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.DialogPage * #getDescription() */ @Override public String getDescription() { this.jbiBasicBeans = new ArrayList<WsdlUtils.JbiBasicBean> (); if( getWizard().getComponentVersionDescription().isBc()) return "Define the JBI identifier of the resource to expose as a Petals service."; else return "Define the JBI identifier of the Petals service to create."; } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.tools.eclipse.su.main.pages.AbstractJbiPage * #createCustomControls(org.eclipse.swt.widgets.Composite) */ @Override public void createCustomControls( Composite container ) { if( getWizard().getSettings().showWsdl) addWsdlBrowser( container ); createCommonControls( container, 20 ); createAutoGenerationWidget( container ); createExplanationBox( container ); this.srvQText.getLocalPartText().addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { if( ! JbiProvidePage.this.edptText.isEnabled()) return; String srv = ((StyledText) e.widget).getText().trim(); JbiProvidePage.this.edptText.setText( srv.length() == 0 ? "" : srv + "Endpoint" ); } }); } /** * Shows an explanation text. * @param container */ private void createExplanationBox( Composite container ) { FormText ft = new FormText( container, SWT.BORDER | SWT.WRAP ); ft.marginWidth = 7; ft.marginHeight = 7; GridData layoutData = new GridData( GridData.FILL_HORIZONTAL ); layoutData.horizontalSpan = 2; layoutData.verticalIndent = 30; layoutData.widthHint = 380; layoutData.heightHint = 100; ft.setLayoutData( layoutData ); ft.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_INFO_BACKGROUND )); ft.setImage( "tip", this.tipImage ); StringBuilder sb = new StringBuilder(); sb.append( "<form>" ); sb.append( "<p><img href=\"tip\" /> <b>Auto Generated End-points</b></p>" ); sb.append( "<p>End-points that are generated at deployment time allow to " ); sb.append( "instantiate several services from a single Service Unit. " ); sb.append( "These services will have the same behavior, same interface, same service name, " ); sb.append( "but they will have a different end point, and thus, a different identifier.</p>" ); sb.append( "</form>" ); ft.setText( sb.toString(), true, false ); } /** * The widgets to indicate to the user that he can choose "auto-generation" for the SU end-point. * @param container */ private void createAutoGenerationWidget( Composite container ) { // Add the button asking if we should generate the end-point. new Label( container, SWT.NONE ).setText( "" ); //$NON-NLS-1$ Button endpointAutoGenerated = SwtFactory.createCheckBoxButton( container, Messages.ProvideJbiPage_8, Messages.ProvideJbiPage_9, false ); endpointAutoGenerated.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Button button = (Button) e.widget; if( button.getSelection()) { // button is checked JbiProvidePage.this.edptText.setEnabled( false ); getNewlyCreatedEndpoint().setEndpointName( getWizard().getComponentVersionDescription().getAutoGeneratedEndpointValue()); } else { // button is not checked JbiProvidePage.this.edptText.setEnabled( true ); getNewlyCreatedEndpoint().setEndpointName( JbiProvidePage.this.edptText.getText()); } validate(); } }); } /** * Adds the WSDL browser in the page (case: looking for the WSDL on the hard drive). * @param table */ private void addWsdlBrowser( final Composite table ) { // The WSDL helper SwtFactory.createLabel( table, "", null ); this.wsdlHelper = SwtFactory.createDecoredLink( table, "", this.tipImage ); SwtFactory.applyHorizontalGridData( this.wsdlHelper ); this.wsdlHelper.setVisible( false ); this.wsdlHelper.getLink().addSelectionListener( new DefaultSelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { PCStyledLabelProvider lp = new PCStyledLabelProvider( getControl()); StyledElementListSelectionDialog dlg = new StyledElementListSelectionDialog( getShell(), lp ); dlg.setFilter( "*" ); dlg.setSize( 120, 20 ); dlg.setMultipleSelection( false ); dlg.setTitle( "Service Selection" ); dlg.setMessage( "Select the service to expose inside Petals." ); dlg.setElements( JbiProvidePage.this.jbiBasicBeans.toArray()); if( dlg.open() == Window.OK ) selectJbiBasicBean((JbiBasicBean) dlg.getResult()[ 0 ]); lp.dispose(); } }); // Create the browser SwtFactory.createLabel( table, Messages.ProvideJbiPage_13, "The service description file" ); final TextWithButtonComposite wsdlBrowser = SwtFactory.createFileBrowser( table, false, true, "WSDL" ); wsdlBrowser.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); wsdlBrowser.getText().addModifyListener( new ModifyListener() { @Override public void modifyText(ModifyEvent e) { JbiProvidePage.this.wsdlUrl = ((Text) e.widget).getText().trim(); validate (); } }); // Import the WSDL SwtFactory.createLabel( table, "", null ); Button wsdlImportButton = SwtFactory.createCheckBoxButton( table, "Import the WSDL in the project to create", null, this.importWsdl ); wsdlImportButton.addSelectionListener( new DefaultSelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { JbiProvidePage.this.importWsdl = ((Button) e.widget).getSelection(); } }); // Add a decoration on the text. this.wsdlTextDecoration = new ControlDecoration( wsdlBrowser.getText(), SWT.LEFT | SWT.BOTTOM ); this.wsdlTextDecoration.setImage( PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJS_ERROR_TSK )); this.wsdlTextDecoration.hide(); // Add listeners wsdlBrowser.getText().addTraverseListener( new TraverseListener() { @Override public void keyTraversed( TraverseEvent e ) { runWsdlParsing(); } }); wsdlBrowser.getButton().addSelectionListener( new DefaultSelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { if( ! StringUtils.isEmpty( wsdlBrowser.getText().getText())) runWsdlParsing(); } }); } /** * Runs the WSDL parsing and updates the WSDL text decoration. * @param wsdlUrl the URL of the WSDL to parse */ private void runWsdlParsing() { // The runnable IRunnableWithProgress wsdlParsingOperation = new IRunnableWithProgress() { @Override public void run( IProgressMonitor monitor ) throws InvocationTargetException { monitor.beginTask( Messages.ProvideJbiPage_24, 2 ); monitor.worked( 1 ); JbiProvidePage.this.wsdlParsingError = null; JbiProvidePage.this.jbiBasicBeans.clear(); try { if( ! StringUtils.isEmpty( JbiProvidePage.this.wsdlUrl )) { JbiProvidePage.this.jbiBasicBeans.addAll( WsdlUtils.INSTANCE.parse( JbiProvidePage.this.wsdlUrl )); if( JbiProvidePage.this.jbiBasicBeans.isEmpty()) JbiProvidePage.this.wsdlParsingError = "The WSDL does not contain any service desription."; } } catch( IllegalArgumentException e1 ) { JbiProvidePage.this.wsdlParsingError = "The WSDL URI is invalid."; } catch( InvocationTargetException e1 ) { JbiProvidePage.this.wsdlParsingError = Messages.ProvideJbiPage_25; } finally { monitor.done(); } } }; // Run it try { getContainer().run( true, false, wsdlParsingOperation ); } catch( Exception e ) { PetalsServicesPlugin.log( e, IStatus.ERROR ); } // Update the UI JbiProvidePage.this.wsdlTextDecoration.setDescriptionText( this.wsdlParsingError ); if( this.wsdlParsingError == null ) JbiProvidePage.this.wsdlTextDecoration.hide(); else JbiProvidePage.this.wsdlTextDecoration.show(); int size = this.jbiBasicBeans.size(); if( size > 1 ) this.wsdlHelper.getLink().setText( "<A>Select another service</A> in the WSDL" + " (" + size + " available)" ); else if( size == 1 ) this.wsdlHelper.getLink().setText( "<A>Restore from the WSDL values</A>" + " (" + size + " service available)" ); this.wsdlHelper.setVisible( size > 0 ); this.wsdlHelper.layout(); if( this.jbiBasicBeans.size() > 0 ) selectJbiBasicBean( this.jbiBasicBeans.get( 0 )); } /** * Sets values from the selected bean. * @param bean */ private void selectJbiBasicBean( JbiBasicBean bean ) { this.itfQText.setValue( bean.getInterfaceName()); this.srvQText.setValue( bean.getServiceName()); this.edptText.setText( bean.getEndpointName() != null ? bean.getEndpointName() : "" ); SuWizardSettings settings = getWizard().getSettings(); settings.soapAddress = bean.getSoapAddress(); settings.soapVersion = bean.getSoapVersion().toString(); settings.soapOriginalPort = bean.getEndpointName(); settings.wsdlUri = this.wsdlUrl; } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.wizards.pages.AbstractSuPage * #validate() */ @Override public boolean validate() { setMessage( null ); // WSDL URL if( this.wsdlTextDecoration != null && this.wsdlTextDecoration.isVisible()) { updateStatus( Messages.ProvideJbiPage_31 ); return false; } // 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( settings.validateServiceName && ae.getServiceName() == null ) { updateStatus( "You have to provide the service name." ); return false; } // End-point name if( settings.validateEndpointName && StringUtils.isEmpty( ae.getEndpointName())) { updateStatus( Messages.ProvideJbiPage_37 ); return false; } // Update data updateStatus( null ); return true; } /** * @return the importWsdl */ public boolean isImportWsdl() { return this.importWsdl; } /** * @return the wsdlUrl */ public String getWsdlUrl() { return this.wsdlUrl; } }