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