/******************************************************************************* * Copyright (c) 2005, 2012 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui.dialogs; import java.util.List; import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType; import org.eclipse.bpel.model.util.BPELUtils; import org.eclipse.bpel.ui.Messages; import org.eclipse.bpel.ui.details.providers.CompositeContentProvider; import org.eclipse.bpel.ui.details.providers.GatedContentProvider; import org.eclipse.bpel.ui.details.providers.ModelLabelProvider; import org.eclipse.bpel.ui.details.providers.PartnerLinkTypeContentProvider; import org.eclipse.bpel.ui.details.providers.PartnerLinkTypeTreeContentProvider; import org.eclipse.bpel.ui.details.providers.PortTypeContentProvider; import org.eclipse.bpel.ui.details.providers.WSDLDefinitionFromResourceContentProvider; import org.eclipse.bpel.ui.util.ModelHelper; import org.eclipse.bpel.ui.wizards.CreatePartnerLinkWizard; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.wst.wsdl.Definition; import org.eclipse.wst.wsdl.PortType; /** * Browse for partner link types available and choose that partner link type. * * In BPEL, partner link types are extensions on the WSDL definitions. * * When browsing for partner link types, two modes are supported by this dialog. * 1) Browsing partner link types which exist in imported WSDLs. * 2) Browsing for available partner links. This includes partner * link types visible in the workspace. * * In addition, one can arbitrarily add an import to the process if the WSDL * representing the partner links is somewhere else (URL, outside file, etc). * * @author Michal Chmielewski (michal.chmielewski@oracle.com) */ public class PartnerLinkTypeSelectorDialog extends BrowseSelectorDialog { private static final int BID_SHOW_PORT_TYPES = IDialogConstants.CLIENT_ID + 200; private static final String SHOW_PORT_TYPES = Messages.PartnerLinkTypeSelectorDialog_0; private boolean showPortTypes = false; GatedContentProvider portTypeContentProvider; PartnerLinkType fPartnerLinkType; /** Show port types check box button */ Button fShowPortTypes; /** * Create a brand new shiny Partner Link Type Selector dialog. * * @param parent the parent shell * @param eObj a BPEL model object */ public PartnerLinkTypeSelectorDialog (Shell parent, EObject eObj ) { super(parent, new ModelLabelProvider(eObj)); this.modelObject = eObj; portTypeContentProvider = new GatedContentProvider ( new PortTypeContentProvider () ); // This content provider sets up elements in the list CompositeContentProvider ccp = new CompositeContentProvider (); ccp.add ( new PartnerLinkTypeContentProvider() ); ccp.add ( portTypeContentProvider ); contentProvider = ccp; // This content provider sets up WSDLDefinitions resources resourceContentProvider = new WSDLDefinitionFromResourceContentProvider( modelObject.eResource().getResourceSet() ); // that's for the tree view treeContentProvider = new PartnerLinkTypeTreeContentProvider(true); setTitle(Messages.PartnerLinkTypeSelectorDialog_1); setLowerViewLabel(Messages.PartnerLinkTypeSelectorDialog_2); setBrowseFromLabel(Messages.PartnerLinkTypeSelectorDialog_3); IDialogSettings settings = getDialogSettings(); try { showPortTypes = settings.getBoolean(SHOW_PORT_TYPES); } catch (Exception ex) { showPortTypes = false; } portTypeContentProvider.setEnabled( showPortTypes ); } @Override protected Control createContents(Composite parent) { Control control = super.createContents(parent); refresh(); return control; } @Override protected void saveSettings () { super.saveSettings(); IDialogSettings settings = getDialogSettings(); settings.put ( SHOW_PORT_TYPES, showPortTypes); } /** * Handle the check button and radio button callbacks. * * @param id * @param checked * @param bRefresh perform refresh at the end */ @Override protected void buttonPressed (int id, boolean checked, boolean bRefresh ) { switch (id) { case BID_SHOW_PORT_TYPES : showPortTypes = checked; portTypeContentProvider.setEnabled( showPortTypes ); break; default : super.buttonPressed(id, checked, bRefresh ); return ; } if (bRefresh) { refresh(); } } @Override protected void computeResult() { if (fPartnerLinkType != null) { setResult(0, fPartnerLinkType); } else { super.computeResult(); } } @Override protected void okPressed() { computeResult(); Object obj = getFirstResult(); if (obj instanceof PortType) { PortType pt = (PortType) obj; CreatePartnerLinkWizard wizard = new CreatePartnerLinkWizard(); wizard.setMandatoryPortType( pt ); wizard.setBPELEditor( ModelHelper.getBPELEditor( pt ) ); WizardDialog dialog = new WizardDialog(getShell(), wizard); if (dialog.open() == Window.CANCEL) { return ; } fPartnerLinkType = wizard.getPartnerLinkType(); if (fPartnerLinkType == null) { return ; } if (!checkNamespace(fPartnerLinkType)){ return; } super.okPressed(); return ; } if (obj instanceof PartnerLinkType) { if (!checkNamespace((PartnerLinkType)obj)){ return; } super.okPressed(); return; } // throw new IllegalStateException(Messages.PartnerLinkTypeSelectorDialog_4); } private boolean checkNamespace(PartnerLinkType obj) { // Now check if the target namespace has a prefix mappings. String targetNamespace = obj.getEnclosingDefinition().getTargetNamespace(); String prefix = BPELUtils.getNamespacePrefix (modelObject, targetNamespace); if (prefix != null) { return true; } // We have to map the namespace to a prefix. NamespaceMappingDialog dialog = new NamespaceMappingDialog(getShell(), modelObject); dialog.setNamespace( targetNamespace ); if (dialog.open() == Window.CANCEL) { return false; } // define the prefix BPELUtils.setPrefix(BPELUtils.getProcess(modelObject), targetNamespace, dialog.getPrefix()); return true; } @Override protected void createBrowseFilterGroupButtons ( Group group ) { fShowPortTypes = createCheckButton(group,Messages.PartnerLinkTypeSelectorDialog_5, BID_SHOW_PORT_TYPES, showPortTypes ); super.createBrowseFilterGroupButtons( group ); } /** * Add an import using an explicit import dialog selection. * * We safeguard against adding duplicate types to the BPEL model here as well. * */ @Override protected void handleAddImport() { SchemaImportDialog dialog = new SchemaImportDialog(getShell(),modelObject); dialog.configureAsWSDLImport(); if (dialog.open() == Window.CANCEL) { return ; } Object obj = dialog.getFirstResult(); if (obj == null) { return ; } if (handleAddImport( obj )) { showImportedTypes(); refresh(); } } @Override protected void showImportedTypes () { fShowPortTypes.setSelection(true); buttonPressed(BID_SHOW_PORT_TYPES,true, false); super.showImportedTypes(); } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, BID_ADD_IMPORT, Messages.PartnerLinkTypeSelectorDialog_6, false); super.createButtonsForButtonBar(parent); } /** * In the case of partner link types, we need to see a few more levels * */ @Override protected int getAutoExpandLevel () { return 5; } @Override protected List<Definition> collectItemsFromImports ( ) { return ModelHelper.getDefinitions(modelObject); } }