/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.modelgenerator.wsdl.ui.wizards.soap.panels; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.core.designer.util.FileUtils; import org.teiid.designer.datatools.profiles.ws.IWSProfileConstants; import org.teiid.designer.modelgenerator.wsdl.model.Fault; import org.teiid.designer.modelgenerator.wsdl.model.Model; import org.teiid.designer.modelgenerator.wsdl.model.ModelGenerationException; import org.teiid.designer.modelgenerator.wsdl.model.Operation; import org.teiid.designer.modelgenerator.wsdl.model.WSDLElement; import org.teiid.designer.modelgenerator.wsdl.ui.Messages; import org.teiid.designer.modelgenerator.wsdl.ui.ModelGeneratorWsdlUiConstants; import org.teiid.designer.modelgenerator.wsdl.ui.util.ModelGeneratorWsdlUiUtil; import org.teiid.designer.modelgenerator.wsdl.ui.wizards.WSDLImportWizardManager; import org.teiid.designer.modelgenerator.wsdl.ui.wizards.soap.WsdlDefinitionPage; import org.teiid.designer.query.proc.wsdl.model.IPort; import org.teiid.designer.ui.common.table.TableViewerBuilder; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.util.WidgetUtil; import org.teiid.designer.ui.common.viewsupport.UiBusyIndicator; import org.teiid.designer.ui.common.widget.Label; /** * UI panel for selection of a wsdl's operations * * @since 8.0 */ public class WsdlOperationsPanel implements FileUtils.Constants, CoreStringUtil.Constants, ModelGeneratorWsdlUiConstants, ModelGeneratorWsdlUiConstants.Images { Text defaultBindingText; Combo defaultServiceModeCombo; /** The checkbox table viewer */ TableViewerBuilder operationsViewerBuilder; TableViewerColumn operationNameColumn; /** Buttons for tree selection */ Button selectAllButton; Button deselectAllButton; /** Text area for display of selection details */ Text detailsTextBox; Composite parentComposite; /** The import manager. */ WSDLImportWizardManager importManager; WsdlDefinitionPage wsdlPage; /** The WSDL model representation */ Model wsdlModel = null; private IStatus panelStatus; /** * Create a new instance * * @param parent * @param wsdlPage * @param theImportManager */ public WsdlOperationsPanel(Composite parent, WsdlDefinitionPage wsdlPage, WSDLImportWizardManager theImportManager) { super(); this.parentComposite = parent; this.wsdlPage = wsdlPage; this.importManager = theImportManager; this.importManager.setSelectedOperations(new ArrayList()); Composite portPanel = WidgetFactory.createPanel(parent, SWT.NONE, GridData.FILL_HORIZONTAL); GridLayout layout = new GridLayout(4, false); portPanel.setLayout(layout); Label label = WidgetFactory.createLabel(portPanel, Messages.DefaultBinding); GridData gd = new GridData(); gd.verticalAlignment=SWT.CENTER; label.setLayoutData(gd); label.setToolTipText(Messages.DefaultBinding_tooltip); defaultBindingText = new Text(portPanel, SWT.BORDER | SWT.SINGLE); defaultBindingText.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW)); defaultBindingText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); gd = new GridData(); gd.verticalAlignment=SWT.CENTER; gd.widthHint = 200; defaultBindingText.setLayoutData(gd); defaultBindingText.setToolTipText(Messages.DefaultBinding_tooltip); label = WidgetFactory.createLabel(portPanel, Messages.DefaultServiceMode); gd = new GridData(); gd.verticalAlignment=SWT.CENTER; label.setLayoutData(gd); label.setToolTipText(Messages.DefaultServiceMode_tooltip); this.defaultServiceModeCombo = WidgetFactory.createCombo(portPanel, SWT.READ_ONLY, GridData.FILL_HORIZONTAL, WSDLImportWizardManager.SERVICE_MODES, true); this.defaultServiceModeCombo.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE)); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalSpan=1; this.defaultServiceModeCombo.setToolTipText(Messages.DefaultServiceMode_tooltip); this.defaultServiceModeCombo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { // Need to sync the worker with the current profile handleDefaultServiceModeSelected(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.defaultServiceModeCombo.select(1); createPanel(parent); } void updateTreeSelectionDetails() { TableItem[] selections = this.operationsViewerBuilder.getTable().getSelection(); if (selections != null && selections.length > 0) { if( selections.length == 1 ) { TableItem selectedItem = selections[0]; updateSelectionDetailsArea(selectedItem.getData()); } else { this.detailsTextBox.setText(Messages.MultipleOperationsSelected_msg); } } else { this.detailsTextBox.setText(Messages.NoOperationsSelected_msg); } } /** * Create the panel in the given parent * * @param theParent * * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) * @since 4.2 */ public void createPanel(Composite theParent) { final int COLUMNS = 1; Composite pnlMain = WidgetFactory.createPanel(theParent, SWT.NONE, GridData.FILL_BOTH); GridLayout layout = new GridLayout(COLUMNS, false); pnlMain.setLayout(layout); createCheckboxTableComposite(pnlMain, Messages.WsdlOperationsPage_checkboxTreeGroup_title); } /** * create the checkbox tree Composite * * @param parent * the parent composite * @param title * the group title */ private void createCheckboxTableComposite(Composite parent, String title) { // -------------------------- // Group for checkbox table // -------------------------- Group group = WidgetFactory.createGroup(parent, title, GridData.FILL_BOTH, 1, 2); // ---------------------------- // Select/DeSelect Buttons // ---------------------------- Composite buttonComposite = WidgetFactory.createPanel(group, SWT.NONE, GridData.FILL_VERTICAL); GridLayout layout = new GridLayout(1, false); buttonComposite.setLayout(layout); this.selectAllButton = WidgetFactory.createButton(buttonComposite, Messages.WsdlOperationsPage_selectAllButton_text, GridData.FILL_HORIZONTAL); this.selectAllButton.setToolTipText(Messages.WsdlOperationsPage_selectAllButton_tipText); this.deselectAllButton = WidgetFactory.createButton(buttonComposite, Messages.WsdlOperationsPage_deselectAllButton_text, GridData.FILL_HORIZONTAL); this.deselectAllButton.setToolTipText(Messages.WsdlOperationsPage_deselectAllButton_tipText); this.selectAllButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { setAllNodesSelected(true); updateImportManager(); setPageStatus(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); this.deselectAllButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { setAllNodesSelected(false); updateImportManager(); setPageStatus(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); // ---------------------------- // TableViewer // ---------------------------- this.operationsViewerBuilder = new TableViewerBuilder(group, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.CHECK); this.operationsViewerBuilder.setContentProvider(new CheckboxTreeContentProvider()); this.operationsViewerBuilder.setLabelProvider(new CheckboxTreeLabelProvider()); // Check events can occur separate from selection events. // In this case move the selected node. // Also trigger selection of node in model. this.operationsViewerBuilder.getTable().addSelectionListener( new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { updateTreeSelectionDetails(); if (e.detail == SWT.CHECK) { updateImportManager(); setPageStatus(); } } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); // create columns operationNameColumn = this.operationsViewerBuilder.createColumn(SWT.LEFT, 100, 50, false); operationNameColumn.getColumn().setText(Messages.Operation); operationNameColumn.setLabelProvider(new OperationsColumnLabelProvider()); CLabel theLabel = new CLabel(group, SWT.NONE); theLabel.setText(Messages.WsdlOperationsPage_detailsTextbox_title); GridData gridData = new GridData(SWT.NONE); gridData.horizontalSpan = 1; theLabel.setLayoutData(gridData); this.detailsTextBox = new Text(group, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); //WidgetFactory.createTextBox(detailsComposite, SWT.NONE, GridData.FILL_BOTH); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.heightHint = 70; gridData.horizontalSpan = 2; this.detailsTextBox.setLayoutData(gridData); detailsTextBox.setEditable(false); } /** * update method for selection details area */ private void updateSelectionDetailsArea(Object selectedObject) { StringBuffer sb = new StringBuffer(); if (selectedObject instanceof Operation) { addOperationDetails((Operation) selectedObject, sb); } this.detailsTextBox.setText(sb.toString()); } private void addOperationDetails(Operation operation, StringBuffer sb) { sb.append("Operation: " + operation.getName() + '\n'); //$NON-NLS-1$ sb.append("\tbinding: \t\t" + operation.getBinding().getName() + '\n'); //$NON-NLS-1$ sb.append("\tport: \t\t\t" + operation.getBinding().getPort().getName() + '\n'); //$NON-NLS-1$ sb.append("\tservice: \t\t\t" + operation.getBinding().getPort().getService().getName() + '\n'); //$NON-NLS-1$ sb.append("\tid: \t\t\t\t" + operation.getId() + '\n'); //$NON-NLS-1$ sb.append("\tinput message: \t" + operation.getInputMessage().getName() + '\n'); //$NON-NLS-1$ String outputMsg = "<none>"; //$NON-NLS-1$ if (operation.getOutputMessage() != null) { outputMsg = operation.getOutputMessage().getName(); } sb.append("\toutput message: \t" + outputMsg + '\n'); //$NON-NLS-1$ Fault[] faults = operation.getFaults(); sb.append("\tfault names: \t\t"); //$NON-NLS-1$ if (faults == null || faults.length == 0) { sb.append("none"); //$NON-NLS-1$ } else { for (int i = 0; i < faults.length; i++) { Fault theFault = faults[i]; sb.append(theFault.getName()); if (i != faults.length - 1) { sb.append(", "); //$NON-NLS-1$ } } } // -------------------------------------------------------- // Add Problem Messages // -------------------------------------------------------- if (!operation.canModel()) { String[] errorMsgs = operation.getProblemMessages(); for (int i = 0; i < errorMsgs.length; i++) { sb.append('\n'); sb.append(errorMsgs[i]); } } } private void updateImportManager() { this.importManager.setSelectedOperations(getSelectedOperations()); } private List<Operation> getSelectedOperations() { List<Operation> ops = new ArrayList<Operation>(); for( TableItem item : operationsViewerBuilder.getTable().getItems()) { if( item.getChecked() ) { ops.add((Operation)item.getData()); } } return ops; } /** * Populate the UI based on the wsdl in the connection profile * * @param profileChanged */ public void notifyWsdlChanged(final boolean profileChanged) { /* * Depending on the size of the WSDL selected in the connection profile, * this can take a little while so indicate the user should wait. */ UiBusyIndicator.showWhile(parentComposite.getDisplay(), new Runnable() { @Override public void run() { panelStatus = Status.OK_STATUS; try { wsdlModel = importManager.getWSDLModel(); } catch (ModelGenerationException e) { wsdlModel = null; Status exStatus = new Status(IStatus.ERROR, PLUGIN_ID, 0, Messages.WsdlOperationsPage_dialog_wsdlParseError_msg, e); Shell shell = parentComposite.getShell(); ErrorDialog.openError(shell, null, Messages.WsdlOperationsPage_dialog_wsdlParseError_title, exStatus); panelStatus = exStatus; operationsViewerBuilder.getTable().clearAll(); operationsViewerBuilder.setInput(new Object()); } // Set the default binding label Properties properties = new Properties(); if( importManager.getConnectionProfile() != null ) { properties = importManager.getConnectionProfile().getBaseProperties(); } String binding = properties.getProperty(IWSProfileConstants.SOAP_BINDING); if (binding == null) binding = IPort.SOAP11; WidgetUtil.setText(defaultBindingText, binding); // Populate the operations table String portName = properties.getProperty(IWSProfileConstants.END_POINT_NAME_PROP_ID); Operation[] operations = new Operation[0]; if (wsdlModel != null && portName != null) { operations = wsdlModel.getModelableOperations(portName); } operationsViewerBuilder.setInput(new OperationsContainer(operations)); operationsViewerBuilder.getTableViewer().refresh(true); if( profileChanged || importManager.getSelectedOperations().isEmpty()) { importManager.setSelectedOperations(new ArrayList()); setAllNodesSelected(true); } else { selectNodesFromImportManager(); } updateImportManager(); } }); } private void handleDefaultServiceModeSelected() { this.importManager.setTranslatorDefaultServiceMode(this.defaultServiceModeCombo.getText()); } private void setPageStatus() { if (panelStatus.isOK()) { panelStatus = Status.OK_STATUS; } this.wsdlPage.setPageStatus(); } /** * @return the status of the panel */ public IStatus getStatus() { return panelStatus; } private void selectNodesFromImportManager() { for( Operation oper : importManager.getSelectedOperations() ) { for( TableItem item : operationsViewerBuilder.getTable().getItems()) { if( oper == item.getData() ) { item.setChecked(true); } } } } private void setAllNodesSelected(boolean bSelected) { if( bSelected ) { for( TableItem item : operationsViewerBuilder.getTable().getItems()) { item.setChecked(true); } } else { for( TableItem item : operationsViewerBuilder.getTable().getItems()) { item.setChecked(false); } } this.operationsViewerBuilder.getTableViewer().refresh(); } class CheckboxTreeLabelProvider extends LabelProvider { private final Image OPERATION_ICON_IMG = ModelGeneratorWsdlUiUtil.getImage(OPERATION_ICON); final WorkbenchLabelProvider workbenchProvider = new WorkbenchLabelProvider(); @Override public Image getImage(final Object node) { if (node instanceof Operation) { return OPERATION_ICON_IMG; } return null; } @Override public String getText(final Object node) { if (node instanceof Model) { return "theModel"; //$NON-NLS-1$ } else if (node instanceof WSDLElement) { return ((WSDLElement) node).getName(); } return "unknownElement"; //$NON-NLS-1$ } } class CheckboxTreeContentProvider implements ITreeContentProvider { @Override public void dispose() { } @Override public Object[] getChildren(final Object node) { if (wsdlModel != null) { if( node instanceof OperationsContainer ) { return ((OperationsContainer)node).getOperations(); } } return EMPTY_STRING_ARRAY; } @Override public Object[] getElements(final Object inputElement) { if( inputElement instanceof OperationsContainer ) { return ((OperationsContainer)inputElement).getOperations(); } return new Object[0]; } @Override public Object getParent(final Object node) { return null; } @Override public boolean hasChildren(final Object node) { if (wsdlModel != null) { if (node instanceof OperationsContainer) { return ((OperationsContainer)node).getOperations().length > 0; } } return false; } @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { } } class OperationsColumnLabelProvider extends ColumnLabelProvider { private final Image PORT_ICON_IMG = ModelGeneratorWsdlUiUtil.getImage(PORT_ICON); public OperationsColumnLabelProvider() { super(); } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object) */ @Override public String getText(Object element) { // Element should be a "File" if( element instanceof Operation) { Operation op = ((Operation) element); StringBuilder sb = new StringBuilder(op.getName()); //sb.append(" < Binding : ").append(op.getBinding().getName()).append(" < Service : ").append(op.getBinding().getPort().getService().getName()); return sb.toString(); } return EMPTY_STRING; } /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object) */ @Override public String getToolTipText(Object element) { return ""; //$NON-NLS-1$ } @Override public Image getImage(Object element) { return PORT_ICON_IMG; } } class OperationsContainer { Operation[] operations; public OperationsContainer(Operation[] ops) { super(); operations = ops; } public Operation[] getOperations() { return this.operations; } } }