blob: 7c25471c3eeca0f05506fc1051d57ae3d77f27dc [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.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import org.eclipse.bpel.model.BPELFactory;
import org.eclipse.bpel.model.Invoke;
import org.eclipse.bpel.model.OnEvent;
import org.eclipse.bpel.model.OnMessage;
import org.eclipse.bpel.model.PartnerLink;
import org.eclipse.bpel.model.Process;
import org.eclipse.bpel.model.Receive;
import org.eclipse.bpel.model.Reply;
import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType;
import org.eclipse.bpel.model.partnerlinktype.PartnerlinktypeFactory;
import org.eclipse.bpel.model.partnerlinktype.Role;
import org.eclipse.bpel.model.util.BPELUtils;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.commands.CompoundCommand;
import org.eclipse.bpel.ui.commands.InsertInContainerCommand;
import org.eclipse.bpel.ui.commands.SetNameCommand;
import org.eclipse.bpel.ui.properties.PropertiesLabelProvider;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.bpel.ui.util.NameDialog;
import org.eclipse.bpel.ui.util.NamespaceUtils;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.PortType;
/**
* Asks the user to select a partner.
*/
public class PartnerLinkSelectorDialog extends SelectionAndCreationDialog {
protected static class PortTypeLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (element instanceof PartnerLink) {
PartnerLink partner = (PartnerLink)element;
Role role = (partner.getMyRole() != null) ? partner.getMyRole() : partner.getPartnerRole();
if (role != null) {
PortType portType = ModelHelper.getPortType(role);
if (portType != null) {
QName qname = portType.getQName();
String uri = NamespaceUtils.convertUriToNamespace(qname.getNamespaceURI());
return uri + " - " + qname.getLocalPart(); //$NON-NLS-1$
}
}
}
return Messages.PartnerLinkSelectorDialog_0;
}
}
protected EObject modelObject;
protected Text filterText;
/**
* The modelObject represents the object which will hold the selected PartnerLink.
*/
public PartnerLinkSelectorDialog(Shell parent, EObject modelObject) {
super(parent, new PropertiesLabelProvider(), new PortTypeLabelProvider());
this.modelObject = modelObject;
setTitle(Messages.PartnerLinkSelectorDialog_1);
setMessage(Messages.PartnerLinkSelectorDialog_2);
setUpperListLabel(Messages.PartnerLinkSelectorDialog_3);
setLowerListLabel(Messages.PartnerLinkSelectorDialog_4);
refreshPartners();
}
protected void refreshPartners() {
PartnerLink[] partners = getPartnerLinks(modelObject);
setElements(partners);
if (fFilteredList != null) {
setListElements(partners);
}
}
/**
* Gets the partner links that can be applied to the model object.
*/
protected PartnerLink[] getPartnerLinks(EObject target) {
PartnerLink[] partners = BPELUtil.getVisiblePartnerLinks(target);
List result = new ArrayList();
for (int i = 0 ; i < partners.length; i++) {
if (isCompatible(target, partners[i])) {
result.add(partners[i]);
}
}
return (PartnerLink[])result.toArray(new PartnerLink[result.size()]);
}
/**
* Incompatible partners are the ones that do not have a role compatible
* with the target. If the partner has no roles defined yet it is
* considered compatible.
*/
protected boolean isCompatible(EObject target, PartnerLink partner) {
if (partner.getMyRole() == null && partner.getPartnerRole() == null) return true;
if (target instanceof Invoke && partner.getPartnerRole() != null) return true;
if ((target instanceof Receive || target instanceof OnEvent || target instanceof OnMessage || target instanceof Reply) && partner.getMyRole() != null) return true;
return false;
}
/**
* Returns the chosen variable or null.
*/
public PartnerLink getPartnerLink() {
if (getResult().length > 0) {
return (PartnerLink)getResult()[0];
}
return null;
}
@Override
protected void handleNewButtonPushed() {
PartnerLink partner = BPELFactory.eINSTANCE.createPartnerLink();
Process process = BPELUtils.getProcess(modelObject);
String newName = filterText.getText();
newName = BPELUtil.generateUniqueModelName(process, newName, partner);
NameDialog nameDialog = new NameDialog(getShell(), Messages.PartnerLinkSelectorDialog_5, Messages.PartnerLinkSelectorDialog_6,
newName, BPELUtil.getNCNameValidator());
if (nameDialog.open() == Window.OK) {
String newPartnerName = nameDialog.getValue();
PartnerLinkType plt = PartnerlinktypeFactory.eINSTANCE.createPartnerLinkType();
Definition artifactsDefinition = ModelHelper.getBPELEditor(process).getArtifactsDefinition();
CompoundCommand command = new CompoundCommand();
command.add(new InsertInContainerCommand(process, partner, null));
command.add(ModelHelper.getCreatePartnerLinkTypeCommand(process, partner, plt, artifactsDefinition, getRoleKind()));
command.add(new SetNameCommand(partner, newPartnerName));
ModelHelper.getBPELEditor(process).getCommandStack().execute(command);
refreshPartners();
setFilter(partner.getName());
setLowerSelectedElement(partner);
// give focus to the dialog's OK button
getOkButton().setFocus();
}
}
/**
* Only used to get the Text instance.
*/
@Override
protected Text createFilterText(Composite parent) {
filterText = super.createFilterText(parent);
return filterText;
}
protected int getRoleKind() {
if (modelObject instanceof Invoke) {
return ModelHelper.PARTNER_ROLE;
}
return ModelHelper.MY_ROLE;
}
}