blob: 86d2b544933f2402367d15471a3f1cb6af28924a [file] [log] [blame]
/*******************************************************************************
* 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);
}
}