/****************************************************************************** * Copyright (c) 2011-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.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.ToolTip; 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.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.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; import com.ebmwebsourcing.petals.common.generation.Mep; import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultTreeContentProvider; import com.ebmwebsourcing.petals.common.internal.provisional.utils.StringUtils; import com.ebmwebsourcing.petals.services.PetalsServicesPlugin; import com.ebmwebsourcing.petals.services.explorer.SourceManager; import com.ebmwebsourcing.petals.services.explorer.model.EndpointBean; import com.ebmwebsourcing.petals.services.explorer.model.ServiceUnitBean; import com.ebmwebsourcing.petals.services.explorer.sources.EndpointSource; import com.ebmwebsourcing.petals.services.utils.ConsumeUtils; /** * A dialog to select a service to consume and an operation to invoke. * @author Vincent Zurczak - EBM WebSourcing */ public class EnhancedConsumeDialog extends TitleAreaDialog { public final static QName NO_OPERATION = new QName( "http://petals.ow2.org/studio/", "no-operation" ); private final static String WILDCARD = "*"; private final static String DEFAULT_MSG = "Select a Petals service and one of its operations to invoke."; private final FormToolkit toolkit; private final Image edptImage, opImage, itfImage, srvImage; private QName itfToInvoke, srvToInvoke; private String edptToInvoke; private QName operationToInvoke; private Mep invocationMep; private boolean needOperation = true; private String filterItfName, filterItfNs; private String filterSrvName, filterSrvNs, filterEdpt, filterComp; private List<Mep> constrainedMep; /** * Constructor. * @param parentShell */ public EnhancedConsumeDialog( Shell parentShell ) { this( parentShell, null ); } /** * Constructor. * @param parentShell * @param toolkit */ public EnhancedConsumeDialog( Shell parentShell, FormToolkit toolkit ) { super( parentShell ); if( toolkit != null ) this.toolkit = toolkit; else this.toolkit = new FormToolkit( parentShell.getDisplay()); setShellStyle( SWT.PRIMARY_MODAL | SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX ); this.itfImage = PetalsServicesPlugin.loadImage( "icons/obj16/contract.gif" ); this.srvImage = PetalsServicesPlugin.loadImage( "icons/obj16/service.gif" ); this.edptImage = PetalsServicesPlugin.loadImage( "icons/obj16/Endpoint_3.gif" ); this.opImage = PetalsServicesPlugin.loadImage( "icons/obj16/operation_2.gif" ); } /* * (non-Jsdoc) * @see org.eclipse.jface.dialogs.TrayDialog * #close() */ @Override public boolean close() { boolean result = super.close(); if( this.edptImage != null && ! this.edptImage.isDisposed()) this.edptImage.dispose(); if( this.srvImage != null && ! this.srvImage.isDisposed()) this.srvImage.dispose(); if( this.itfImage != null && ! this.itfImage.isDisposed()) this.itfImage.dispose(); if( this.opImage != null && ! this.opImage.isDisposed()) this.opImage.dispose(); return result; } /* * (non-Jsdoc) * @see org.eclipse.jface.dialogs.TitleAreaDialog * #createDialogArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createDialogArea( final Composite parent ) { // General properties getShell().setText( "Consume a Petals Service" ); setTitle( "Consume a Petals Service" ); setMessage( DEFAULT_MSG ); Composite outterComposite = new Composite( parent, SWT.BORDER ); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; outterComposite.setLayout( layout ); outterComposite.setLayoutData( new GridData( GridData.FILL_BOTH )); ScrolledForm form = this.toolkit.createScrolledForm( outterComposite ); form.setLayoutData( new GridData( GridData.FILL_BOTH )); Composite container = form.getBody(); TableWrapLayout tableWrapLayout = new TableWrapLayout(); tableWrapLayout.topMargin = 12; layout = new GridLayout(); layout.verticalSpacing = 9; layout.marginTop = 7; container.setLayout( layout ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); // Create the search filter Section filterSection = this.toolkit.createSection( container, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | Section.DESCRIPTION ); filterSection.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); filterSection.clientVerticalSpacing = 10; filterSection.setText( "Search Filters" ); filterSection.setDescription( "Filter the displayed services." ); Composite subContainer = this.toolkit.createComposite( filterSection ); layout = new GridLayout( 4, false ); layout.marginWidth = 0; layout.marginBottom = 10; layout.horizontalSpacing = 10; subContainer.setLayout( layout ); subContainer.setLayoutData( new TableWrapData( TableWrapData.FILL_GRAB )); filterSection.setClient( subContainer ); this.toolkit.createLabel( subContainer, "Interface Name:" ); final Text itfNameText = this.toolkit.createText( subContainer, "", SWT.BORDER | SWT.SINGLE ); itfNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); itfNameText.setText( this.filterItfName == null ? WILDCARD : this.filterItfName ); this.toolkit.createLabel( subContainer, "Interface Namespace:" ); final Text itfNsText = this.toolkit.createText( subContainer, "", SWT.BORDER | SWT.SINGLE ); itfNsText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); itfNsText.setText( this.filterItfNs == null ? WILDCARD : this.filterItfNs ); this.toolkit.createLabel( subContainer, "Service Name:" ); final Text srvNameText = this.toolkit.createText( subContainer, "", SWT.BORDER | SWT.SINGLE ); srvNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); srvNameText.setText( this.filterSrvName == null ? WILDCARD : this.filterSrvName ); this.toolkit.createLabel( subContainer, "Service Namespace:" ); final Text srvNsText = this.toolkit.createText( subContainer, "", SWT.BORDER | SWT.SINGLE ); srvNsText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); srvNsText.setText( this.filterSrvNs == null ? WILDCARD : this.filterSrvNs ); this.toolkit.createLabel( subContainer, "End-point Name:" ); final Text edptNameText = this.toolkit.createText( subContainer, "", SWT.BORDER | SWT.SINGLE ); edptNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); edptNameText.setText( this.filterEdpt == null ? WILDCARD : this.filterEdpt ); this.toolkit.createLabel( subContainer, "Target Component:" ); final Text compText = this.toolkit.createText( subContainer, "", SWT.BORDER | SWT.SINGLE ); compText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); compText.setText( this.filterComp == null ? WILDCARD : this.filterComp ); // The tree to list all the services Composite bottomComposite = this.toolkit.createComposite( container ); layout = new GridLayout( 2, true ); layout.marginWidth = 0; bottomComposite.setLayout( layout ); bottomComposite.setLayoutData( new GridData( GridData.FILL_BOTH )); Section section = this.toolkit.createSection( bottomComposite, ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED | Section.DESCRIPTION ); section.setLayoutData( new GridData( GridData.FILL_BOTH )); section.clientVerticalSpacing = 10; section.setText( "Available Services" ); section.setDescription( "A list of all the known Petals services." ); subContainer = this.toolkit.createComposite( section ); layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; subContainer.setLayout( layout ); subContainer.setLayoutData( new TableWrapData( TableWrapData.FILL )); section.setClient( subContainer ); Tree tree = this.toolkit.createTree( subContainer, SWT.BORDER | SWT.HIDE_SELECTION | SWT.FULL_SELECTION ); GridData layoutData = new GridData( GridData.FILL_BOTH ); layoutData.widthHint = 400; layoutData.heightHint = 400; tree.setLayoutData( layoutData ); final TreeViewer treeViewer = new TreeViewer( tree ); treeViewer.setContentProvider( new ServiceContentProvider()); treeViewer.setLabelProvider( new ServiceLabelProvider()); treeViewer.addFilter( new ServiceViewerFilter()); ColumnViewerToolTipSupport.enableFor( treeViewer, ToolTip.NO_RECREATE ); // Prepare the input... Map<QName,ItfBean> itfNameToInterface = new HashMap<QName,ItfBean> (); for( EndpointSource src : SourceManager.getInstance().getSources()) { for( ServiceUnitBean su : src.getServiceUnits()) { for( EndpointBean bean : su.getEndpoints()) { // Handle the interface name ItfBean itfBean = itfNameToInterface.get( bean.getInterfaceName()); if( itfBean == null ) { itfBean = new ItfBean(); itfBean.itfName = bean.getInterfaceName(); itfNameToInterface.put( itfBean.itfName, itfBean ); } // Handle the service name SrvBean srvBean = itfBean.srvNameToService.get( bean.getServiceName()); if( srvBean == null ) { srvBean = new SrvBean(); srvBean.itf = itfBean; srvBean.srvName = bean.getServiceName(); itfBean.srvNameToService.put( srvBean.srvName, srvBean ); } // Handle the end-point name EdptBean edptBean = new EdptBean(); edptBean.edptBean = bean; srvBean.endpoints.add( edptBean ); } } } // ... and set it! treeViewer.setInput( itfNameToInterface ); // The properties of the selection final Composite leftComposite = this.toolkit.createComposite( bottomComposite ); leftComposite.setLayoutData( new GridData( GridData.FILL_BOTH )); layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; leftComposite.setLayout( layout ); // Show a default widget on the left (waiting for a new selection) // It will be deleted as soon as a selection is made in the tree section = this.toolkit.createSection( leftComposite, ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED ); section.setLayoutData( new GridData( GridData.FILL_BOTH )); section.clientVerticalSpacing = 10; section.setText( "Properties" ); final Composite propertiesComposite = this.toolkit.createComposite( section ); layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.horizontalSpacing = 10; layout.verticalSpacing = 2; propertiesComposite.setLayout( layout ); propertiesComposite.setLayoutData( new TableWrapData( TableWrapData.FILL_GRAB )); section.setClient( propertiesComposite ); this.toolkit.createLabel( propertiesComposite, "Select a service identifier in the tree on the left." ); this.toolkit.createLabel( propertiesComposite, "Its properties will be displayed here." ); // Listeners ModifyListener modifyListener = new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { String value = ((Text) e.widget).getText().trim(); if( e.widget == itfNameText ) EnhancedConsumeDialog.this.filterItfName = value; else if( e.widget == itfNsText ) EnhancedConsumeDialog.this.filterItfNs = value; else if( e.widget == srvNameText ) EnhancedConsumeDialog.this.filterSrvName = value; else if( e.widget == srvNsText ) EnhancedConsumeDialog.this.filterSrvNs = value; else if( e.widget == edptNameText ) EnhancedConsumeDialog.this.filterEdpt = value; else if( e.widget == compText ) EnhancedConsumeDialog.this.filterComp = value; treeViewer.refresh(); } }; itfNameText.addModifyListener( modifyListener ); itfNsText.addModifyListener( modifyListener ); srvNameText.addModifyListener( modifyListener ); srvNsText.addModifyListener( modifyListener ); edptNameText.addModifyListener( modifyListener ); compText.addModifyListener( modifyListener ); treeViewer.addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event ) { EnhancedConsumeDialog.this.operationToInvoke = null; EnhancedConsumeDialog.this.invocationMep = null; EnhancedConsumeDialog.this.itfToInvoke = null; EnhancedConsumeDialog.this.srvToInvoke = null; EnhancedConsumeDialog.this.edptToInvoke = null; handleSelection( event, leftComposite ); validate(); parent.layout(); } }); if( ! StringUtils.isEmpty( this.filterItfName ) || ! StringUtils.isEmpty( this.filterItfNs ) || ! StringUtils.isEmpty( this.filterSrvName ) || ! StringUtils.isEmpty( this.filterSrvNs ) || ! StringUtils.isEmpty( this.filterEdpt ) || ! StringUtils.isEmpty( this.filterComp )) filterSection.setExpanded( true ); return container; } /* * (non-Jsdoc) * @see org.eclipse.jface.dialogs.TrayDialog * #createButtonBar(org.eclipse.swt.widgets.Composite) */ @Override protected Control createButtonBar( Composite parent ) { Composite comp = (Composite) super.createButtonBar( parent ); comp.setBackground( parent.getDisplay().getSystemColor( SWT.COLOR_WHITE )); Button okButton = getButton( IDialogConstants.OK_ID ); if( okButton != null ) okButton.getParent().setBackground( parent.getDisplay().getSystemColor( SWT.COLOR_WHITE )); return comp; } /** * Handles the selection in the service hierarchy. * @param event the selection event * @param parent the composite where new widgets should be added */ private void handleSelection( SelectionChangedEvent event, Composite parent ) { Object o = ((IStructuredSelection) event.getSelection()).getFirstElement(); for( Control c : parent.getChildren()) c.dispose(); Section section = this.toolkit.createSection( parent, ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED | Section.DESCRIPTION ); section.setLayoutData( new GridData( GridData.FILL_BOTH )); section.clientVerticalSpacing = 10; section.setText( "Properties" ); section.setDescription( "The properties of the selection." ); final Composite propertiesComposite = this.toolkit.createComposite( section ); GridLayout layout = new GridLayout( 2, false ); layout.marginHeight = 0; layout.marginWidth = 0; layout.horizontalSpacing = 10; propertiesComposite.setLayout( layout ); propertiesComposite.setLayoutData( new TableWrapData( TableWrapData.FILL_GRAB )); section.setClient( propertiesComposite ); // What do we have? if( o instanceof ItfBean ) this.itfToInvoke = ((ItfBean) o).itfName; if( o instanceof SrvBean ) { this.srvToInvoke = ((SrvBean) o).srvName; this.itfToInvoke = ((SrvBean) o).itf.itfName; } EndpointBean bean = null; if( o instanceof EdptBean ) { bean = ((EdptBean) o).edptBean; this.edptToInvoke = bean.getEndpointName(); this.srvToInvoke = bean.getServiceName(); this.itfToInvoke = bean.getInterfaceName(); } // Show what we can if( this.itfToInvoke != null ) { this.toolkit.createLabel( propertiesComposite, "Interface Name:" ); Text text = this.toolkit.createText( propertiesComposite, this.itfToInvoke.getLocalPart(), SWT.READ_ONLY ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); this.toolkit.createLabel( propertiesComposite, "Interface Namespace:" ); text = this.toolkit.createText( propertiesComposite, this.itfToInvoke.getNamespaceURI(), SWT.READ_ONLY ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); } if( this.srvToInvoke != null ) { this.toolkit.createLabel( propertiesComposite, "Service Name:" ); Text text = this.toolkit.createText( propertiesComposite, this.srvToInvoke.getLocalPart(), SWT.READ_ONLY ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); this.toolkit.createLabel( propertiesComposite, "Service Namespace:" ); text = this.toolkit.createText( propertiesComposite, this.srvToInvoke.getNamespaceURI(), SWT.READ_ONLY ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); } if( bean != null ) { this.toolkit.createLabel( propertiesComposite, "End-point Name:" ); Text text = this.toolkit.createText( propertiesComposite, bean.getEndpointName(), SWT.READ_ONLY ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); this.toolkit.createLabel( propertiesComposite, "Target Component:" ); String value = bean.getComponentName() != null ? bean.getComponentName() : ""; text = this.toolkit.createText( propertiesComposite, value, SWT.READ_ONLY ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); } // Show operations section = this.toolkit.createSection( parent, ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED | Section.DESCRIPTION ); section.setLayoutData( new GridData( GridData.FILL_BOTH )); section.clientVerticalSpacing = 10; section.setText( "Operations" ); section.setDescription( "The operations for the selected service's end-point." ); final Composite subContainer = this.toolkit.createComposite( section ); layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.horizontalSpacing = 10; subContainer.setLayout( layout ); subContainer.setLayoutData( new TableWrapData( TableWrapData.FILL_GRAB )); section.setClient( subContainer ); final Table table = this.toolkit.createTable( subContainer, SWT.BORDER | SWT.SINGLE ); table.setLayoutData( new GridData( GridData.FILL_BOTH )); Map<QName,Mep> ops = ConsumeUtils.getValidOperationsForConsume( this.itfToInvoke, this.srvToInvoke, this.edptToInvoke ); for( Map.Entry<QName,Mep> entry : ops.entrySet()) { TableItem item = new TableItem( table, SWT.NONE ); item.setText( entry.getKey().getLocalPart() + " - " + entry.getValue()); item.setImage( this.opImage ); item.setData( entry ); } table.addSelectionListener( new SelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { widgetDefaultSelected( e ); } @Override public void widgetDefaultSelected( SelectionEvent e ) { TableItem[] items = table.getSelection(); if( items != null && items.length > 0 ) { Map.Entry<?,?> entry = (Map.Entry<?,?>) items[ 0 ].getData(); EnhancedConsumeDialog.this.operationToInvoke = (QName) entry.getKey(); EnhancedConsumeDialog.this.invocationMep = (Mep) entry.getValue(); validate(); } } }); final Button b = this.toolkit.createButton( subContainer, "Let the component choose the operation to invoke.", SWT.CHECK ); b.addSelectionListener( new SelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { EnhancedConsumeDialog.this.needOperation = ! b.getSelection(); table.setEnabled( EnhancedConsumeDialog.this.needOperation ); if( ! EnhancedConsumeDialog.this.needOperation ) { EnhancedConsumeDialog.this.operationToInvoke = null; EnhancedConsumeDialog.this.invocationMep = null; } validate(); } @Override public void widgetDefaultSelected( SelectionEvent e ) { widgetSelected( e ); } }); b.setSelection( ! this.needOperation ); table.setEnabled( this.needOperation ); parent.layout(); } /** * @param filterItfName the filterItfName to set */ public void setFilterItfName( String filterItfName ) { this.filterItfName = filterItfName; } /** * @param needOperation the needOperation to set */ public void setNeedOperation( boolean needOperation ) { this.needOperation = needOperation; } /** * @return the constrainedMep */ public List<Mep> getConstrainedMep() { return this.constrainedMep; } /** * @param constrainedMep the constrainedMep to set */ public void setConstrainedMep( List<Mep> constrainedMep ) { this.constrainedMep = constrainedMep; } /** * @param filterItfNs the filterItfNs to set */ public void setFilterItfNs( String filterItfNs ) { this.filterItfNs = filterItfNs; } /** * @param filterSrvName the filterSrvName to set */ public void setFilterSrvName( String filterSrvName ) { this.filterSrvName = filterSrvName; } /** * @param filterSrvNs the filterSrvNs to set */ public void setFilterSrvNs( String filterSrvNs ) { this.filterSrvNs = filterSrvNs; } /** * @param filterEdpt the filterEdpt to set */ public void setFilterEdpt( String filterEdpt ) { this.filterEdpt = filterEdpt; } /** * @return the operationToInvoke */ public QName getOperationToInvoke() { return this.operationToInvoke == null ? NO_OPERATION : this.operationToInvoke; } /** * @return the invocationMep */ public Mep getInvocationMep() { return this.invocationMep == null ? Mep.UNKNOWN : this.invocationMep; } /** * @return the itfToInvoke */ public QName getItfToInvoke() { return this.itfToInvoke; } /** * @return the srvToInvoke */ public QName getSrvToInvoke() { return this.srvToInvoke; } /** * @return the edptToInvoke */ public String getEdptToInvoke() { return this.edptToInvoke; } /** * Validates the selection. */ private void validate() { String msg = null, warning = null; if( this.itfToInvoke == null && this.srvToInvoke == null && this.itfToInvoke == null ) msg = "You must select a service to consume (invoke)."; else if( this.operationToInvoke == null && this.needOperation ) msg = "You must select an operation to invoke."; else if( this.constrainedMep != null && ! this.constrainedMep.isEmpty() && ! this.constrainedMep.contains( this.invocationMep )) warning = "This operation is associated with a MEP which is not supported by the current component."; setMessage( warning, IMessageProvider.WARNING ); setErrorMessage( msg ); if( warning == null && msg == null ) setMessage( DEFAULT_MSG ); Button okButton = getButton( IDialogConstants.OK_ID ); if( okButton != null ) okButton.setEnabled( msg == null ); } /** * A content provider for the viewer. */ private static class ServiceContentProvider extends DefaultTreeContentProvider { @Override public boolean hasChildren( Object element ) { return element instanceof SrvBean || element instanceof ItfBean; } @Override public Object[] getElements( Object inputElement ) { return ((Map<?,?>) inputElement).values().toArray(); } @Override public Object[] getChildren( Object parentElement ) { Object[] result = null; if( parentElement instanceof ItfBean ) result = ((ItfBean) parentElement).srvNameToService.values().toArray(); else if( parentElement instanceof SrvBean ) result = ((SrvBean) parentElement).endpoints.toArray(); if( result == null ) result = new Object[ 0 ]; return result; } } /** * The filter for the viewer. */ private class ServiceViewerFilter extends ViewerFilter { @Override public boolean select( Viewer viewer, Object parentElement, Object element ) { boolean result = false; if( element instanceof ItfBean ) { ItfBean q = (ItfBean) element; boolean loc = StringUtils.isEmpty( EnhancedConsumeDialog.this.filterItfName ) || WILDCARD.equals( EnhancedConsumeDialog.this.filterItfName ) || q.itfName.getLocalPart().startsWith( EnhancedConsumeDialog.this.filterItfName ); boolean ns = StringUtils.isEmpty( EnhancedConsumeDialog.this.filterItfNs ) || WILDCARD.equals( EnhancedConsumeDialog.this.filterItfNs ) || q.itfName.getNamespaceURI().startsWith( EnhancedConsumeDialog.this.filterItfNs ); if( loc && ns ) { List<SrvBean> srvBeans = filterServices(((ItfBean) element).srvNameToService.values()); for( SrvBean srvBean : srvBeans ) { List<EdptBean> beans = filterEndpoints( srvBean.endpoints); if( beans.size() > 0 ) { result = true; break; } } } } else if( element instanceof SrvBean ) { List<SrvBean> srvBeans = filterServices( Arrays.asList((SrvBean) element)); if( srvBeans.size() == 1 ) { List<EdptBean> beans = filterEndpoints(((SrvBean) element).endpoints); result = beans.size() > 0; } } else if( element instanceof EdptBean ) { List<EdptBean> beans = filterEndpoints( Arrays.asList((EdptBean) element)); result = beans.size() == 1; } return result; } /** * Filters a list of end-points using the filtering criteria. * @param endpoints * @return a non-null list */ private List<EdptBean> filterEndpoints( Collection<EdptBean> endpoints ) { List<EdptBean> filteredList = new ArrayList<EdptBean> (); for( EdptBean edptBean : endpoints ) { EndpointBean bean = edptBean.edptBean; boolean edpt = StringUtils.isEmpty( EnhancedConsumeDialog.this.filterEdpt ) || WILDCARD.equals( EnhancedConsumeDialog.this.filterEdpt ) || bean.getEndpointName().startsWith( EnhancedConsumeDialog.this.filterEdpt ); boolean comp = StringUtils.isEmpty( EnhancedConsumeDialog.this.filterComp ) || WILDCARD.equals( EnhancedConsumeDialog.this.filterComp ) || bean.getComponentName() == null || bean.getComponentName().startsWith( EnhancedConsumeDialog.this.filterComp ); if( comp && edpt ) filteredList.add( edptBean ); } return filteredList; } /** * Filters a list of services using the filtering criteria. * @param endpoints * @return a non-null list */ private List<SrvBean> filterServices( Collection<SrvBean> services ) { List<SrvBean> filteredList = new ArrayList<SrvBean> (); for( SrvBean srvBean : services ) { boolean loc = StringUtils.isEmpty( EnhancedConsumeDialog.this.filterSrvName ) || WILDCARD.equals( EnhancedConsumeDialog.this.filterSrvName ) || srvBean.srvName.getLocalPart().startsWith( EnhancedConsumeDialog.this.filterSrvName ); boolean ns = StringUtils.isEmpty( EnhancedConsumeDialog.this.filterSrvNs ) || WILDCARD.equals( EnhancedConsumeDialog.this.filterSrvNs ) || srvBean.srvName.getNamespaceURI().startsWith( EnhancedConsumeDialog.this.filterSrvNs ); if( loc && ns ) filteredList.add( srvBean ); } return filteredList; } } /** * The label provider for the viewer. */ private class ServiceLabelProvider extends ColumnLabelProvider { @Override public String getText( Object element ) { QName qname = null; if( element instanceof ItfBean ) qname = ((ItfBean) element).itfName; else if( element instanceof SrvBean ) qname = ((SrvBean) element).srvName; String text = ""; if( qname != null ) text = qname.getLocalPart(); else if( element instanceof EdptBean ) text = ((EdptBean) element).edptBean.getEndpointName(); return text; } @Override public Image getImage( Object element ) { Image result = null; if( element instanceof ItfBean ) result = EnhancedConsumeDialog.this.itfImage; else if( element instanceof SrvBean ) result = EnhancedConsumeDialog.this.srvImage; else if( element instanceof EdptBean ) result = EnhancedConsumeDialog.this.edptImage; return result; } @Override public String getToolTipText( Object element ) { QName qname = null; if( element instanceof ItfBean ) qname = ((ItfBean) element).itfName; else if( element instanceof SrvBean ) qname = ((SrvBean) element).srvName; String text = ""; if( qname != null ) text = qname.getLocalPart() + " - " + qname.getNamespaceURI(); else if( element instanceof EdptBean ) text = ((EdptBean) element).edptBean.getEndpointName(); return text; } } /** * A bean that describes an interface. */ private static class ItfBean { QName itfName; Map<QName,SrvBean> srvNameToService = new HashMap<QName,SrvBean> (); } /** * A bean that describes a service. */ private static class SrvBean { QName srvName; ItfBean itf; List<EdptBean> endpoints = new ArrayList<EdptBean> (); } /** * A bean that describes an end-point. */ private static class EdptBean { EndpointBean edptBean; } }