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