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