/******************************************************************************* | |
* 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 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.bpel.ui.util; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.Comparator; | |
import java.util.HashSet; | |
import java.util.Iterator; | |
import java.util.LinkedList; | |
import java.util.List; | |
import java.util.Set; | |
import javax.wsdl.Input; | |
import javax.wsdl.Output; | |
import javax.xml.namespace.QName; | |
import org.eclipse.bpel.common.extension.model.ExtensionMap; | |
import org.eclipse.bpel.common.extension.model.ExtensionmodelFactory; | |
import org.eclipse.bpel.common.extension.model.adapters.ExtendedObjectUserAdapter; | |
import org.eclipse.bpel.model.Activity; | |
import org.eclipse.bpel.model.Assign; | |
import org.eclipse.bpel.model.BPELFactory; | |
import org.eclipse.bpel.model.BPELPackage; | |
import org.eclipse.bpel.model.Catch; | |
import org.eclipse.bpel.model.CatchAll; | |
import org.eclipse.bpel.model.CompensationHandler; | |
import org.eclipse.bpel.model.CorrelationSet; | |
import org.eclipse.bpel.model.Correlations; | |
import org.eclipse.bpel.model.Else; | |
import org.eclipse.bpel.model.ElseIf; | |
import org.eclipse.bpel.model.EventHandler; | |
import org.eclipse.bpel.model.FaultHandler; | |
import org.eclipse.bpel.model.ForEach; | |
import org.eclipse.bpel.model.FromParts; | |
import org.eclipse.bpel.model.If; | |
import org.eclipse.bpel.model.Import; | |
import org.eclipse.bpel.model.Invoke; | |
import org.eclipse.bpel.model.MessageExchange; | |
import org.eclipse.bpel.model.OnAlarm; | |
import org.eclipse.bpel.model.OnEvent; | |
import org.eclipse.bpel.model.OnMessage; | |
import org.eclipse.bpel.model.PartnerActivity; | |
import org.eclipse.bpel.model.PartnerLink; | |
import org.eclipse.bpel.model.Pick; | |
import org.eclipse.bpel.model.Process; | |
import org.eclipse.bpel.model.Receive; | |
import org.eclipse.bpel.model.RepeatUntil; | |
import org.eclipse.bpel.model.Reply; | |
import org.eclipse.bpel.model.Scope; | |
import org.eclipse.bpel.model.TerminationHandler; | |
import org.eclipse.bpel.model.Throw; | |
import org.eclipse.bpel.model.ToParts; | |
import org.eclipse.bpel.model.Validate; | |
import org.eclipse.bpel.model.Variable; | |
import org.eclipse.bpel.model.Variables; | |
import org.eclipse.bpel.model.While; | |
import org.eclipse.bpel.model.messageproperties.Property; | |
import org.eclipse.bpel.model.messageproperties.PropertyAlias; | |
import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType; | |
import org.eclipse.bpel.model.partnerlinktype.PartnerlinktypeFactory; | |
import org.eclipse.bpel.model.partnerlinktype.PartnerlinktypePackage; | |
import org.eclipse.bpel.model.partnerlinktype.Role; | |
import org.eclipse.bpel.model.util.BPELUtils; | |
import org.eclipse.bpel.model.util.ImportResolver; | |
import org.eclipse.bpel.model.util.ImportResolverRegistry; | |
import org.eclipse.bpel.ui.BPELEditor; | |
import org.eclipse.bpel.ui.IBPELUIConstants; | |
import org.eclipse.bpel.ui.Policy; | |
import org.eclipse.bpel.ui.adapters.IContainer; | |
import org.eclipse.bpel.ui.adapters.IExtensionFactory; | |
import org.eclipse.bpel.ui.adapters.INamedElement; | |
import org.eclipse.bpel.ui.commands.AddRoleCommand; | |
import org.eclipse.bpel.ui.commands.CompoundCommand; | |
import org.eclipse.bpel.ui.commands.CreatePartnerLinkTypeCommand; | |
import org.eclipse.bpel.ui.commands.SetPartnerLinkTypeCommand; | |
import org.eclipse.bpel.ui.commands.SetRoleCommand; | |
import org.eclipse.bpel.ui.commands.SetUniqueNameCommand; | |
import org.eclipse.bpel.ui.uiextensionmodel.ActivityExtension; | |
import org.eclipse.bpel.ui.uiextensionmodel.CaseExtension; | |
import org.eclipse.bpel.ui.uiextensionmodel.OnAlarmExtension; | |
import org.eclipse.bpel.ui.uiextensionmodel.OnEventExtension; | |
import org.eclipse.bpel.ui.uiextensionmodel.OnMessageExtension; | |
import org.eclipse.bpel.ui.uiextensionmodel.ProcessExtension; | |
import org.eclipse.bpel.ui.uiextensionmodel.StartNode; | |
import org.eclipse.draw2d.geometry.Dimension; | |
import org.eclipse.draw2d.geometry.Point; | |
import org.eclipse.emf.common.notify.Notification; | |
import org.eclipse.emf.common.util.EList; | |
import org.eclipse.emf.common.util.TreeIterator; | |
import org.eclipse.emf.ecore.EClass; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.resource.Resource; | |
import org.eclipse.emf.ecore.resource.ResourceSet; | |
import org.eclipse.gef.commands.Command; | |
import org.eclipse.wst.wsdl.Definition; | |
import org.eclipse.wst.wsdl.ExtensibilityElement; | |
import org.eclipse.wst.wsdl.ExtensibleElement; | |
import org.eclipse.wst.wsdl.Fault; | |
import org.eclipse.wst.wsdl.Message; | |
import org.eclipse.wst.wsdl.Operation; | |
import org.eclipse.wst.wsdl.Part; | |
import org.eclipse.wst.wsdl.PortType; | |
import org.eclipse.wst.wsdl.WSDLPackage; | |
import org.eclipse.xsd.XSDElementDeclaration; | |
import org.eclipse.xsd.XSDTypeDefinition; | |
import org.eclipse.xsd.impl.XSDSchemaImpl; | |
import org.eclipse.xsd.util.XSDConstants; | |
/** | |
* This class provides a common interface (i.e. setXX/getXX/isXXAffected) to certain | |
* properties which exist across several model object types. | |
* | |
* Generally, you should only call the interfaces methods on model objects which | |
* support the particular property; generally, these helpers will throw | |
* IllegalArgumentException on objects which don't support the property in question. | |
* This is analogous to the way casting an object to an interface type would throw | |
* a ClassCastException if the object didn't support (implement) that interface. | |
*/ | |
@SuppressWarnings("nls") | |
public class ModelHelper { | |
public static Object[] EMPTY_ARRAY = new Object[0]; | |
// These constants are used by getVariable() and setVariable(). | |
public static final int OUTGOING = 0; | |
public static final int INCOMING = 1; | |
public static final int NOT_SPECIFIED = 4; | |
// These constants are used by getRole() and setRole(). | |
public static final int MY_ROLE = 0; | |
public static final int PARTNER_ROLE = 1; | |
public static String getDisplayName(Object context) { | |
if (context instanceof ElseIf) { | |
CaseExtension extension = (CaseExtension)getExtension((ElseIf)context); | |
return extension==null? null : extension.getDisplayName(); | |
} | |
if (context instanceof OnMessage) { | |
OnMessageExtension extension = (OnMessageExtension)getExtension((OnMessage)context); | |
return extension==null? null : extension.getDisplayName(); | |
} | |
if (context instanceof OnEvent) { | |
OnEventExtension extension = (OnEventExtension)getExtension((OnEvent)context); | |
return extension==null? null : extension.getDisplayName(); | |
} | |
if (context instanceof OnAlarm) { | |
OnAlarmExtension extension = (OnAlarmExtension)getExtension((OnAlarm)context); | |
return extension==null? null : extension.getDisplayName(); | |
} | |
return null; | |
} | |
public static boolean supportsJoinFailure(Object context) { | |
if (context instanceof Activity) return true; | |
if (context instanceof Process) return true; | |
return false; | |
} | |
public static boolean isSetSuppressJoinFailure(Object context) { | |
if (context instanceof Activity) return ((Activity)context).isSetSuppressJoinFailure(); | |
if (context instanceof Process) return ((Process)context).isSetSuppressJoinFailure(); | |
throw new IllegalArgumentException(); | |
} | |
public static Boolean getSuppressJoinFailure2(Object context) { | |
if (context instanceof Activity) return ((Activity)context).getSuppressJoinFailure(); | |
if (context instanceof Process) return ((Process)context).getSuppressJoinFailure(); | |
throw new IllegalArgumentException(); | |
} | |
// Hack to hide the fact that null is not the same as unset. | |
public static Boolean getSuppressJoinFailure(Object context) { | |
return isSetSuppressJoinFailure(context)? getSuppressJoinFailure2(context) : null; | |
} | |
public static void setSuppressJoinFailure(Object context, Boolean value) { | |
if (context instanceof Activity) { | |
if (value == null) { | |
((Activity)context).unsetSuppressJoinFailure(); return; | |
} else { | |
((Activity)context).setSuppressJoinFailure(value); return; | |
} | |
} | |
if (context instanceof Process) { | |
if (value == null) { | |
((Process)context).unsetSuppressJoinFailure(); return; | |
} else { | |
((Process)context).setSuppressJoinFailure(value); return; | |
} | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isSuppressJoinFailureAffected(Object context, Notification n) { | |
if (context instanceof Activity) { | |
return (n.getFeatureID(Activity.class) == BPELPackage.ACTIVITY__SUPPRESS_JOIN_FAILURE); | |
} | |
if (context instanceof Process) { | |
return (n.getFeatureID(Process.class) == BPELPackage.PROCESS__SUPPRESS_JOIN_FAILURE); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isMessageActivity(Object context, int direction) { | |
switch (direction) { | |
case OUTGOING: | |
if (context instanceof Reply) return true; | |
if (context instanceof Invoke) return true; | |
break; | |
case INCOMING: | |
if (context instanceof Receive) return true; | |
if (context instanceof OnMessage) return true; | |
if (context instanceof OnEvent) return true; | |
if (context instanceof Invoke) { | |
// check if our operation exists and is two way! | |
// If it doesn't exist, return true anyways. | |
Operation op = ModelHelper.getOperation(context); | |
if (op != null) | |
if (op.getOutput() == null) return false; | |
return true; | |
} | |
break; | |
} | |
return false; | |
} | |
public static Variable getVariable(Object context, int direction) { | |
// This is the only activity that has 2 variables at this point. | |
if (context instanceof Invoke) { | |
if (direction == INCOMING) { | |
return ((Invoke)context).getOutputVariable(); | |
} | |
return ((Invoke)context).getInputVariable(); | |
} | |
if (context instanceof Reply) { | |
return ((Reply)context).getVariable(); | |
} | |
if (context instanceof Throw) { | |
return ((Throw)context).getFaultVariable(); | |
} | |
if (context instanceof Reply) { | |
return ((Reply)context).getVariable(); | |
} | |
if (context instanceof Throw) { | |
return ((Throw)context).getFaultVariable(); | |
} | |
if (context instanceof Receive) { | |
return ((Receive)context).getVariable(); | |
} | |
if (context instanceof OnMessage) { | |
return ((OnMessage)context).getVariable(); | |
} | |
if (context instanceof OnEvent) { | |
return ((OnEvent)context).getVariable(); | |
} | |
if (context instanceof Catch) { | |
return ((Catch)context).getFaultVariable(); | |
} | |
if (context instanceof ForEach) { | |
return ((ForEach)context).getCounterName(); | |
} | |
throw new IllegalArgumentException("This model object has no variable to get"); //$NON-NLS-1$ | |
} | |
public static void setVariable(Object context, Variable v, int direction) { | |
if (context instanceof Invoke) { | |
if (direction == INCOMING) { | |
((Invoke)context).setOutputVariable(v); | |
} else { | |
((Invoke)context).setInputVariable(v); return; | |
} | |
} else if (context instanceof Reply) { | |
((Reply)context).setVariable(v); | |
} else if (context instanceof Invoke) { | |
((Invoke)context).setInputVariable(v); | |
} else if (context instanceof Throw) { | |
((Throw)context).setFaultVariable(v); | |
} else if (context instanceof Receive) { | |
((Receive)context).setVariable(v); | |
} else if (context instanceof OnMessage) { | |
((OnMessage)context).setVariable(v); | |
} else if (context instanceof OnEvent) { | |
((OnEvent)context).setVariable(v); | |
} else if (context instanceof Invoke) { | |
((Invoke)context).setOutputVariable(v); | |
} else if (context instanceof Catch) { | |
((Catch)context).setFaultVariable(v); | |
} else if (context instanceof ForEach) { | |
((ForEach)context).setCounterName(v); | |
} else { | |
throw new IllegalArgumentException("This model object has no variable to set"); //$NON-NLS-1$ | |
} | |
} | |
public static boolean isVariableAffected (Object context, Notification n, int direction) { | |
if (context instanceof Invoke) { | |
if (direction == INCOMING) { | |
return (n.getFeatureID(Invoke.class) == BPELPackage.INVOKE__OUTPUT_VARIABLE); | |
} | |
return (n.getFeatureID(Invoke.class) == BPELPackage.INVOKE__INPUT_VARIABLE); | |
} | |
if (context instanceof Reply) { | |
return (n.getFeatureID(Reply.class) == BPELPackage.REPLY__VARIABLE); | |
} | |
if (context instanceof Throw) { | |
return (n.getFeatureID(Throw.class) == BPELPackage.THROW__FAULT_VARIABLE); | |
} | |
if (context instanceof Receive) { | |
return (n.getFeatureID(Receive.class) == BPELPackage.RECEIVE__VARIABLE); | |
} | |
if (context instanceof OnMessage) { | |
return (n.getFeatureID(OnMessage.class) == BPELPackage.ON_MESSAGE__VARIABLE); | |
} | |
if (context instanceof OnEvent) { | |
return (n.getFeatureID(OnEvent.class) == BPELPackage.ON_EVENT__VARIABLE); | |
} | |
if (context instanceof Catch) { | |
return (n.getFeatureID(Catch.class) == BPELPackage.CATCH__FAULT_VARIABLE); | |
} | |
return false; | |
} | |
public static MessageExchange getMessageExchange(Object context) { | |
if (context instanceof Receive) { | |
return ((Receive)context).getMessageExchange(); | |
} | |
if (context instanceof OnMessage) { | |
return ((OnMessage)context).getMessageExchange(); | |
} | |
if (context instanceof OnEvent) { | |
return ((OnEvent)context).getMessageExchange(); | |
} | |
if (context instanceof Reply) { | |
return ((Reply)context).getMessageExchange(); | |
} | |
throw new IllegalArgumentException("Object has no message exchange."); //$NON-NLS-1$ | |
} | |
public static void setMessageExchange(Object context, MessageExchange messageExchange) { | |
if (context instanceof Receive) { | |
((Receive)context).setMessageExchange(messageExchange); return; | |
} | |
if (context instanceof OnMessage) { | |
((OnMessage)context).setMessageExchange(messageExchange); return; | |
} | |
if (context instanceof OnEvent) { | |
((OnEvent)context).setMessageExchange(messageExchange); return; | |
} | |
if (context instanceof Reply) { | |
((Reply)context).setMessageExchange(messageExchange); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static PartnerLink getPartnerLink(Object context) { | |
if (context instanceof Invoke) { | |
return ((Invoke)context).getPartnerLink(); | |
} | |
if (context instanceof Receive) { | |
return ((Receive)context).getPartnerLink(); | |
} | |
if (context instanceof OnMessage) { | |
return ((OnMessage)context).getPartnerLink(); | |
} | |
if (context instanceof OnEvent) { | |
return ((OnEvent)context).getPartnerLink(); | |
} | |
if (context instanceof Reply) { | |
return ((Reply)context).getPartnerLink(); | |
} | |
throw new IllegalArgumentException("Object has no partner link."); //$NON-NLS-1$ | |
} | |
public static void setPartnerLink(Object context, PartnerLink partner) { | |
if (context instanceof Invoke) { | |
((Invoke)context).setPartnerLink(partner); return; | |
} | |
if (context instanceof Receive) { | |
((Receive)context).setPartnerLink(partner); return; | |
} | |
if (context instanceof OnMessage) { | |
((OnMessage)context).setPartnerLink(partner); return; | |
} | |
if (context instanceof OnEvent) { | |
((OnEvent)context).setPartnerLink(partner); return; | |
} | |
if (context instanceof Reply) { | |
((Reply)context).setPartnerLink(partner); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isPartnerAffected(Object context, Notification n) { | |
if (context instanceof Invoke) { | |
return (n.getFeatureID(Invoke.class) == BPELPackage.INVOKE__PARTNER_LINK); | |
} | |
if (context instanceof Receive) { | |
return (n.getFeatureID(Receive.class) == BPELPackage.RECEIVE__PARTNER_LINK); | |
} | |
if (context instanceof OnMessage) { | |
return (n.getFeatureID(OnMessage.class) == BPELPackage.ON_MESSAGE__PARTNER_LINK); | |
} | |
if (context instanceof OnEvent) { | |
return (n.getFeatureID(OnEvent.class) == BPELPackage.ON_EVENT__PARTNER_LINK); | |
} | |
if (context instanceof Reply) { | |
return (n.getFeatureID(Reply.class) == BPELPackage.REPLY__PARTNER_LINK); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isMessageExchangeAffected(Object context, Notification n) { | |
if (context instanceof Receive) { | |
return (n.getFeatureID(Receive.class) == BPELPackage.RECEIVE__MESSAGE_EXCHANGE); | |
} | |
if (context instanceof OnMessage) { | |
return (n.getFeatureID(OnMessage.class) == BPELPackage.ON_MESSAGE__MESSAGE_EXCHANGE); | |
} | |
if (context instanceof OnEvent) { | |
return (n.getFeatureID(OnEvent.class) == BPELPackage.ON_EVENT__MESSAGE_EXCHANGE); | |
} | |
if (context instanceof Reply) { | |
return (n.getFeatureID(Reply.class) == BPELPackage.REPLY__MESSAGE_EXCHANGE); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static PortType getPortType(Object context) { | |
if (context instanceof Invoke) return ((Invoke)context).getPortType(); | |
if (context instanceof Receive) return ((Receive)context).getPortType(); | |
if (context instanceof OnMessage) return ((OnMessage)context).getPortType(); | |
if (context instanceof OnEvent) return ((OnEvent)context).getPortType(); | |
if (context instanceof Reply) return ((Reply)context).getPortType(); | |
if (context instanceof Role) return (PortType)((Role)context).getPortType(); | |
throw new IllegalArgumentException(); | |
} | |
public static void setPortType(Object context, PortType portType) { | |
if (context instanceof Invoke) { | |
((Invoke)context).setPortType(portType); return; | |
} | |
if (context instanceof Receive) { | |
((Receive)context).setPortType(portType); return; | |
} | |
if (context instanceof OnMessage) { | |
((OnMessage)context).setPortType(portType); return; | |
} | |
if (context instanceof OnEvent) { | |
((OnEvent)context).setPortType(portType); return; | |
} | |
if (context instanceof Reply) { | |
((Reply)context).setPortType(portType); return; | |
} | |
if (context instanceof Role) { | |
((Role)context).setPortType(portType); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isPortTypeAffected(Object context, Notification n) { | |
if (context instanceof Invoke) { | |
return (n.getFeatureID(Invoke.class) == BPELPackage.INVOKE__PORT_TYPE); | |
} | |
if (context instanceof Receive) { | |
return (n.getFeatureID(Receive.class) == BPELPackage.RECEIVE__PORT_TYPE); | |
} | |
if (context instanceof OnMessage) { | |
return (n.getFeatureID(OnMessage.class) == BPELPackage.ON_MESSAGE__PORT_TYPE); | |
} | |
if (context instanceof OnEvent) { | |
return (n.getFeatureID(OnEvent.class) == BPELPackage.ON_EVENT__PORT_TYPE); | |
} | |
if (context instanceof Reply) { | |
return (n.getFeatureID(Reply.class) == BPELPackage.REPLY__PORT_TYPE); | |
} | |
if (context instanceof Role) { | |
return (n.getFeatureID(Role.class) == PartnerlinktypePackage.ROLE__PORT_TYPE); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static Operation getOperation(Object context) { | |
if (context instanceof Invoke) return ((Invoke)context).getOperation(); | |
if (context instanceof Receive) return ((Receive)context).getOperation(); | |
if (context instanceof OnMessage) return ((OnMessage)context).getOperation(); | |
if (context instanceof OnEvent) return ((OnEvent)context).getOperation(); | |
if (context instanceof Reply) return ((Reply)context).getOperation(); | |
throw new IllegalArgumentException(); | |
} | |
public static void setOperation(Object context, Operation operation) { | |
if (context instanceof Invoke) { | |
((Invoke)context).setOperation(operation); return; | |
} | |
if (context instanceof Receive) { | |
((Receive)context).setOperation(operation); return; | |
} | |
if (context instanceof OnMessage) { | |
((OnMessage)context).setOperation(operation); return; | |
} | |
if (context instanceof OnEvent) { | |
((OnEvent)context).setOperation(operation); return; | |
} | |
if (context instanceof Reply) { | |
((Reply)context).setOperation(operation); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isOperationAffected(Object context, Notification n) { | |
if (context instanceof Invoke) { | |
return (n.getFeatureID(Invoke.class) == BPELPackage.INVOKE__OPERATION); | |
} | |
if (context instanceof Receive) { | |
return (n.getFeatureID(Receive.class) == BPELPackage.RECEIVE__OPERATION); | |
} | |
if (context instanceof OnMessage) { | |
return (n.getFeatureID(OnMessage.class) == BPELPackage.ON_MESSAGE__OPERATION); | |
} | |
if (context instanceof OnEvent) { | |
return (n.getFeatureID(OnEvent.class) == BPELPackage.ON_EVENT__OPERATION); | |
} | |
if (context instanceof Reply) { | |
return (n.getFeatureID(Reply.class) == BPELPackage.REPLY__OPERATION); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static Boolean getCreateInstance(Object context) { | |
if (context instanceof Receive) return ((Receive)context).getCreateInstance(); | |
if (context instanceof Pick) return ((Pick)context).getCreateInstance(); | |
throw new IllegalArgumentException(); | |
} | |
public static Boolean getValidate(Object context) { | |
if (context instanceof Assign) return ((Assign)context).getValidate(); | |
throw new IllegalArgumentException(); | |
} | |
public static void setCreateInstance(Object context, Boolean createInstance) { | |
if (context instanceof Receive) { | |
((Receive)context).setCreateInstance(createInstance); return; | |
} | |
if (context instanceof Pick) { | |
((Pick)context).setCreateInstance(createInstance); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static void setValidate(Object context, Boolean validateXML) { | |
if (context instanceof Assign) { | |
((Assign)context).setValidate(validateXML); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isCreateInstanceAffected(Object context, Notification n) { | |
if (context instanceof Receive) { | |
return (n.getFeatureID(Receive.class) == BPELPackage.RECEIVE__CREATE_INSTANCE); | |
} | |
if (context instanceof Pick) { | |
return (n.getFeatureID(Pick.class) == BPELPackage.PICK__CREATE_INSTANCE); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static String getFaultName(Object context) { | |
QName qname = getFaultQName(context); | |
return (qname == null)? null : qname.getLocalPart(); | |
} | |
public static QName getFaultQName(Object context) { | |
if (context instanceof Throw) { | |
return ((Throw)context).getFaultName(); | |
} | |
if (context instanceof Catch) { | |
return ((Catch)context).getFaultName(); | |
} | |
if (context instanceof Reply) { | |
return ((Reply)context).getFaultName(); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static void setFaultName(Object context, String faultName) { | |
if (context instanceof Throw) { | |
String oldNS = getFaultNamespace(context); | |
QName newQName = null; | |
newQName = new QName(oldNS, faultName == null || faultName.equals("") ? ((Throw)context).getName() + "DefaultFaultName" : faultName); | |
((Throw)context).setFaultName(newQName); return; | |
} | |
if (context instanceof Catch) { | |
String oldNS = getFaultNamespace(context); | |
QName newQName = null; | |
if (faultName != null) newQName = new QName(oldNS, faultName); | |
((Catch)context).setFaultName(newQName); return; | |
} | |
if (context instanceof Reply) { | |
String oldNS = getFaultNamespace(context); | |
QName newQName = null; | |
if (faultName != null) newQName = new QName(oldNS, faultName); | |
((Reply)context).setFaultName(newQName); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isFaultNameAffected(Object context, Notification n) { | |
if (context instanceof Throw) { | |
return (n.getFeatureID(Throw.class) == BPELPackage.THROW__FAULT_NAME); | |
} | |
if (context instanceof Catch) { | |
return (n.getFeatureID(Catch.class) == BPELPackage.CATCH__FAULT_NAME); | |
} | |
if (context instanceof Reply) { | |
return (n.getFeatureID(Reply.class) == BPELPackage.REPLY__FAULT_NAME); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static String getFaultNamespace(Object context) { | |
if (context instanceof Throw) { | |
QName qname = ((Throw)context).getFaultName(); | |
return (qname == null)? null : qname.getNamespaceURI(); | |
} | |
if (context instanceof Catch) { | |
QName qname = ((Catch)context).getFaultName(); | |
return (qname == null)? null : qname.getNamespaceURI(); | |
} | |
if (context instanceof Reply) { | |
QName qname = ((Reply)context).getFaultName(); | |
return (qname == null)? null : qname.getNamespaceURI(); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static void setFaultNamespace(Object context, String faultNS) { | |
if (context instanceof Throw) { | |
String oldName = getFaultName(context); | |
QName newQName = null; | |
newQName = new QName(faultNS, oldName == null || oldName.equals("") ? ((Throw)context).getName() + "DefaultFaultName" : oldName); | |
((Throw)context).setFaultName(newQName); return; | |
} | |
if (context instanceof Catch) { | |
String oldName = getFaultName(context); | |
QName newQName = null; | |
if (oldName != null) newQName = new QName(faultNS, oldName); | |
((Catch)context).setFaultName(newQName); return; | |
} | |
if (context instanceof Reply) { | |
String oldName = getFaultName(context); | |
QName newQName = null; | |
if (oldName != null) newQName = new QName(faultNS, oldName); | |
((Reply)context).setFaultName(newQName); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static boolean isFaultNamespaceAffected(Object context, Notification n) { | |
return isFaultNameAffected(context, n); | |
} | |
public static boolean isSingleActivityContainer(Object context) { | |
if (context instanceof ElseIf) return true; | |
if (context instanceof Else) return true; | |
if (context instanceof Catch) return true; | |
if (context instanceof CatchAll) return true; | |
if (context instanceof OnAlarm) return true; | |
if (context instanceof OnMessage) return true; | |
if (context instanceof OnEvent) return true; | |
if (context instanceof Process) return true; | |
if (context instanceof While) return true; | |
if (context instanceof RepeatUntil) return true; | |
return false; | |
} | |
public static Activity getActivity(Object context) { | |
if (context instanceof ElseIf) return ((ElseIf)context).getActivity(); | |
if (context instanceof Else) return ((Else)context).getActivity(); | |
if (context instanceof Catch) return ((Catch)context).getActivity(); | |
if (context instanceof CatchAll) return ((CatchAll)context).getActivity(); | |
if (context instanceof OnAlarm) return ((OnAlarm)context).getActivity(); | |
if (context instanceof OnMessage) return ((OnMessage)context).getActivity(); | |
if (context instanceof OnEvent) return ((OnEvent)context).getActivity(); | |
if (context instanceof Process) return ((Process)context).getActivity(); | |
if (context instanceof While) return ((While)context).getActivity(); | |
if (context instanceof RepeatUntil) return ((RepeatUntil)context).getActivity(); | |
if (context instanceof Scope) return ((Scope)context).getActivity(); | |
if (context instanceof FaultHandler) return getCatchAll((FaultHandler)context); | |
if (context instanceof CompensationHandler) return ((CompensationHandler)context).getActivity(); | |
if (context instanceof TerminationHandler) return ((TerminationHandler)context).getActivity(); | |
if (context instanceof If) return ((If) context).getActivity(); | |
if (context instanceof ForEach) { | |
return ((ForEach)context).getActivity(); | |
} | |
throw new IllegalArgumentException("ModelHelper.getActivity() - no activity for this context"); | |
} | |
// TODO: this method is never called - remove it??? | |
public static void setActivity(Object context, Activity activity) { | |
if (context instanceof ElseIf) { | |
((ElseIf)context).setActivity(activity); return; | |
} | |
if (context instanceof Else) { | |
((Else)context).setActivity(activity); return; | |
} | |
if (context instanceof Catch) { | |
((Catch)context).setActivity(activity); return; | |
} | |
if (context instanceof CatchAll) { | |
((CatchAll)context).setActivity(activity); return; | |
} | |
if (context instanceof OnAlarm) { | |
((OnAlarm)context).setActivity(activity); return; | |
} | |
if (context instanceof OnMessage) { | |
((OnMessage)context).setActivity(activity); return; | |
} | |
if (context instanceof OnEvent) { | |
((OnEvent)context).setActivity(activity); return; | |
} | |
if (context instanceof Process) { | |
((Process)context).setActivity(activity); return; | |
} | |
if (context instanceof While) { | |
((While)context).setActivity(activity); return; | |
} | |
if (context instanceof RepeatUntil) { | |
((RepeatUntil)context).setActivity(activity); return; | |
} | |
if (context instanceof Scope) { | |
((Scope)context).setActivity(activity); return; | |
} | |
if (context instanceof FaultHandler) { | |
setCatchAll((FaultHandler)context, activity); return; | |
} | |
if (context instanceof CompensationHandler) { | |
((CompensationHandler)context).setActivity(activity); return; | |
} | |
if (context instanceof TerminationHandler) { | |
((TerminationHandler)context).setActivity(activity); return; | |
} | |
if (context instanceof If) { | |
setElse((If)context, activity); return; | |
} | |
if (context instanceof ForEach) { | |
((ForEach)context).setActivity(activity); | |
return; | |
} | |
//TODO: ELSEIF ??? | |
throw new IllegalArgumentException("ModelHelper.setActivity() - cannot set activity in this context"); | |
} | |
// TODO: this method is never called - remove it??? | |
public static boolean isActivityAffected(Object context, Notification n) { | |
if (context instanceof ElseIf) { | |
return (n.getFeatureID(ElseIf.class) == BPELPackage.ELSE_IF__ACTIVITY); | |
} | |
if (context instanceof Catch) { | |
return (n.getFeatureID(Catch.class) == BPELPackage.CATCH__ACTIVITY); | |
} | |
if (context instanceof OnAlarm) { | |
return (n.getFeatureID(OnAlarm.class) == BPELPackage.ON_ALARM__ACTIVITY); | |
} | |
if (context instanceof OnMessage) { | |
return (n.getFeatureID(OnMessage.class) == BPELPackage.ON_MESSAGE__ACTIVITY); | |
} | |
if (context instanceof OnEvent) { | |
return (n.getFeatureID(OnEvent.class) == BPELPackage.ON_EVENT__ACTIVITY); | |
} | |
if (context instanceof Process) { | |
return (n.getFeatureID(Process.class) == BPELPackage.PROCESS__ACTIVITY); | |
} | |
if (context instanceof While) { | |
return (n.getFeatureID(While.class) == BPELPackage.WHILE__ACTIVITY); | |
} | |
if (context instanceof RepeatUntil) { | |
return (n.getFeatureID(RepeatUntil.class) == BPELPackage.REPEAT_UNTIL__ACTIVITY); | |
} | |
if (context instanceof Scope) { | |
return (n.getFeatureID(Scope.class) == BPELPackage.SCOPE__ACTIVITY); | |
} | |
if (context instanceof CompensationHandler) { | |
return (n.getFeatureID(CompensationHandler.class) == BPELPackage.COMPENSATION_HANDLER__ACTIVITY); | |
} | |
if (context instanceof TerminationHandler) { | |
return (n.getFeatureID(TerminationHandler.class) == BPELPackage.TERMINATION_HANDLER__ACTIVITY); | |
} | |
if (context instanceof FaultHandler) { | |
return isCatchAllAffected((FaultHandler)context, n); | |
} | |
if (context instanceof If) { | |
return isElseAffected((If)context, n); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static Activity getCatchAll(FaultHandler faultHandler) { | |
CatchAll catchAll = faultHandler.getCatchAll(); | |
return (catchAll == null)? null : catchAll.getActivity(); | |
} | |
public static void setCatchAll(FaultHandler faultHandler, Activity activity) { | |
if (activity == null) { | |
faultHandler.setCatchAll(null); | |
} else if (faultHandler.getCatchAll() == null) { | |
CatchAll catchAll = BPELFactory.eINSTANCE.createCatchAll(); | |
faultHandler.setCatchAll(catchAll); | |
catchAll.setActivity(activity); | |
} else { | |
faultHandler.getCatchAll().setActivity(activity); | |
} | |
} | |
public static boolean isCatchAllAffected(FaultHandler faultHandler, Notification n) { | |
if ((n.getNewValue() instanceof FaultHandler) || (n.getOldValue() instanceof FaultHandler)) { | |
return (n.getFeatureID(FaultHandler.class) == BPELPackage.FAULT_HANDLER__CATCH_ALL); | |
} | |
return (n.getFeatureID(CatchAll.class) == BPELPackage.CATCH_ALL__ACTIVITY); | |
} | |
// TODO: this method is never called - remove it??? | |
public static Activity getElse(If _if) { | |
Else _else = _if.getElse(); | |
return (_else == null)? null : _else.getActivity(); | |
} | |
//TODO: this method is never called - remove it??? | |
public static void setElse(If _if, Activity activity) { | |
if (activity == null) { | |
_if.setElse(null); | |
} else if (_if.getElse() == null) { | |
Else _else = BPELFactory.eINSTANCE.createElse(); | |
_if.setElse(_else); | |
_else.setActivity(activity); | |
} else { | |
_if.getElse().setActivity(activity); | |
} | |
} | |
// TODO: this method is never called - remove it??? | |
public static boolean isElseAffected(If _if, Notification n) { | |
if ((n.getNewValue() instanceof If) || (n.getOldValue() instanceof If)) { | |
return (n.getFeatureID(If.class) == BPELPackage.IF__ELSE); | |
} | |
return (n.getFeatureID(Else.class) == BPELPackage.ELSE__ACTIVITY); | |
} | |
public static boolean isRoleAffected(Object context, Notification n, int who) { | |
if (context instanceof PartnerLink) { | |
switch (who) { | |
case MY_ROLE: | |
return (n.getFeatureID(PartnerLink.class) == BPELPackage.PARTNER_LINK__MY_ROLE); | |
case PARTNER_ROLE: | |
return (n.getFeatureID(PartnerLink.class) == BPELPackage.PARTNER_LINK__PARTNER_ROLE); | |
} | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static Message getMessageType(Object context) { | |
if (context instanceof Variable) { | |
return ((Variable)context).getMessageType(); | |
} | |
if (context instanceof PropertyAlias) { | |
return (Message)((PropertyAlias)context).getMessageType(); | |
} | |
// https://issues.jboss.org/browse/JBIDE-8305 | |
if (context instanceof OnEvent) { | |
return (Message)((OnEvent)context).getMessageType(); | |
} | |
if (context instanceof org.eclipse.wst.wsdl.Input) { | |
return (Message)((org.eclipse.wst.wsdl.Input)context).getMessage(); | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static void setMessageType(Object context, Message messageType) { | |
if (context instanceof Variable) { | |
((Variable)context).setMessageType(messageType); return; | |
} | |
if (context instanceof PropertyAlias) { | |
((PropertyAlias)context).setMessageType(messageType); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static Correlations getCorrelations(Object context) { | |
if (context instanceof Receive) return ((Receive)context).getCorrelations(); | |
if (context instanceof Invoke) return ((Invoke)context).getCorrelations(); | |
if (context instanceof Reply) return ((Reply)context).getCorrelations(); | |
if (context instanceof OnMessage) return ((OnMessage)context).getCorrelations(); | |
if (context instanceof OnEvent) return ((OnEvent)context).getCorrelations(); | |
throw new IllegalArgumentException(); | |
} | |
static final Variable[] EMPTY_VARIABLE_LIST = new Variable[] {}; | |
/** | |
* | |
* @param msg | |
* @return | |
*/ | |
public static Variable[] getVariablesOfType (EObject context, final Message msg) { | |
return (Variable[]) ListMap.Map( | |
// List of visible variables | |
getVisibleVariables ( context ), | |
// select the ones that match the message type | |
new ListMap.Visitor() { | |
public Object visit(Object obj) { | |
Variable v = (Variable) obj; | |
return (v.getMessageType() == msg ? v : ListMap.IGNORE); | |
} | |
}, | |
// make the return as (Variable[]) | |
EMPTY_VARIABLE_LIST); | |
} | |
/** | |
* | |
* @param msg | |
* @return | |
*/ | |
public static Variable[] getVariablesOfType (EObject context, final XSDElementDeclaration decl) { | |
return (Variable[]) ListMap.Map( | |
// Visible variables | |
getVisibleVariables ( context ), | |
// only the ones of the type requested | |
new ListMap.Visitor() { | |
public Object visit(Object obj) { | |
Variable v = (Variable) obj; | |
return (v.getXSDElement() == decl ? v : ListMap.IGNORE); | |
} | |
}, | |
// make sure that the return of the type passed here | |
EMPTY_VARIABLE_LIST); | |
} | |
public static Variable[] getVisibleVariables ( EObject context ) { | |
List<Variable> list = new LinkedList<Variable>(); | |
EObject refObj = context; | |
while (refObj != null) { | |
List<Variable> refList = null; | |
if (refObj instanceof Process) { | |
Process process = (Process) refObj; | |
Variables variables = process.getVariables(); | |
refList = variables == null ? null : variables.getChildren(); | |
} else if (refObj instanceof Scope) { | |
Scope scope = (Scope) refObj; | |
Variables variables = scope.getVariables(); | |
refList = variables == null ? null : variables.getChildren(); | |
} | |
// If there are variables at this level, then check for | |
// make sure that you only add the ones that are visible | |
// (no name hiding). | |
if (refList != null) { | |
Iterator<Variable> it = refList.iterator(); | |
while (it.hasNext()) { | |
Variable next = it.next(); | |
Object elm = ListMap.findElement(list,next, | |
new Comparator<Object>() { | |
public int compare(Object o1, Object o2) { | |
Variable v1 = (Variable)o1; | |
Variable v2 = (Variable)o2; | |
return v1.getName().compareTo( v2.getName() ); | |
} | |
}); | |
if (elm == null) { | |
list.add(next); | |
} | |
} | |
} | |
refObj = refObj.eContainer(); | |
} | |
return list.toArray( EMPTY_VARIABLE_LIST ); | |
} | |
public static Variables getVariables(Object context) { | |
if (context instanceof Process) return ((Process)context).getVariables(); | |
if (context instanceof Scope) return ((Scope)context).getVariables(); | |
throw new IllegalArgumentException(); | |
} | |
public static EList<Variable> getValidateVariables(Object context) { | |
if (context instanceof Validate) return ((Validate)context).getVariables(); | |
throw new IllegalArgumentException(); | |
} | |
public static void setCorrelations(Object context, Correlations correlations) { | |
if (context instanceof Receive) { | |
((Receive)context).setCorrelations(correlations); return; | |
} | |
if (context instanceof Invoke) { | |
((Invoke)context).setCorrelations(correlations); return; | |
} | |
if (context instanceof Reply) { | |
((Reply)context).setCorrelations(correlations); return; | |
} | |
if (context instanceof OnMessage) { | |
((OnMessage)context).setCorrelations(correlations); return; | |
} | |
if (context instanceof OnEvent) { | |
((OnEvent)context).setCorrelations(correlations); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
public static PortType getRolePortType(Role role) { | |
if (role == null) return null; | |
return (PortType)role.getPortType(); | |
} | |
public static PortType getPartnerPortType(PartnerLink partner, int direction) { | |
if (partner != null) { | |
if (direction == ModelHelper.INCOMING) { | |
return getRolePortType(partner.getMyRole()); | |
} else if (direction == ModelHelper.OUTGOING) { | |
return getRolePortType(partner.getPartnerRole()); | |
} | |
} | |
return null; | |
} | |
public static Fault getWSDLFault(Object context) { | |
Operation operation = getOperation(context); | |
if (operation == null) return null; | |
String operationNS = operation.getEnclosingDefinition() != null? | |
operation.getEnclosingDefinition().getTargetNamespace() : null; | |
if (operationNS == null) return null; | |
if (!operationNS.equals(ModelHelper.getFaultNamespace(context))) return null; | |
String faultName = ModelHelper.getFaultName(context); | |
if (faultName == null || "".equals(faultName)) return null; //$NON-NLS-1$ | |
for (Iterator<Fault> it = operation.getEFaults().iterator(); it.hasNext(); ) { | |
Fault fault = it.next(); | |
if (faultName.equals(fault.getName())) return fault; | |
} | |
return null; | |
} | |
public static void setWSDLFault(Object context, Fault fault) { | |
QName newQName = fault==null? null : new QName( | |
fault.getEnclosingDefinition().getTargetNamespace(), fault.getName()); | |
if (context instanceof Throw) { | |
((Throw)context).setFaultName(newQName); return; | |
} | |
if (context instanceof Catch) { | |
((Catch)context).setFaultName(newQName); return; | |
} | |
if (context instanceof Reply) { | |
((Reply)context).setFaultName(newQName); return; | |
} | |
throw new IllegalArgumentException(); | |
} | |
/** | |
* Helper to get model extensions for a model object (e.g. BPEL Plus extensions). | |
*/ | |
public static ExtensibilityElement getExtensibilityElement(Object input, Class clazz) { | |
if (!(input instanceof ExtensibleElement)) throw new IllegalArgumentException(); | |
ExtensibleElement element = (ExtensibleElement)input; | |
for (Iterator<ExtensibilityElement> it = element.getExtensibilityElements().iterator(); it.hasNext(); ) { | |
ExtensibilityElement extension = it.next(); | |
if (clazz.isInstance(extension)) return extension; | |
} | |
return null; | |
} | |
/** | |
* Another helper to get model extensions for a model object (e.g. BPEL Plus extensions). | |
* This one accepts an EClass instead of a Class. | |
*/ | |
public static ExtensibilityElement getExtensibilityElement(Object input, EClass clazz) { | |
if (!(input instanceof ExtensibleElement)) throw new IllegalArgumentException(); | |
ExtensibleElement element = (ExtensibleElement)input; | |
for (Iterator<ExtensibilityElement> it = element.getExtensibilityElements().iterator(); it.hasNext(); ) { | |
ExtensibilityElement extension = it.next(); | |
if (clazz.isSuperTypeOf(extension.eClass())) return extension; | |
} | |
return null; | |
} | |
public static boolean isExtensionListAffected(Notification n) { | |
return (n.getFeatureID(ExtensibleElement.class) == | |
WSDLPackage.EXTENSIBLE_ELEMENT__EEXTENSIBILITY_ELEMENTS); | |
} | |
/** | |
* Helper to create an extension (if necessary) and add it to the ExtensionMap. | |
* The ModelAutoUndoRecorder will do this automatically for any object that is | |
* inserted into the ResourceSet, so you should only need to call this if you | |
* have created new model objects and not yet added them to the ResourceSet and | |
* you want to do things to the extension. | |
*/ | |
public static void createExtensionIfNecessary (ExtensionMap extensionMap, EObject input) { | |
if (extensionMap == null || input == null || input.eIsProxy()) return; | |
try { | |
if (extensionMap.get(input) != null) return; | |
} catch (NullPointerException e) { | |
// this is a bug in the ExtensionMapImpl. | |
// Just assume there is no extension (fall through) | |
} | |
// https://jira.jboss.org/browse/JBIDE-7520 | |
extensionMap.remove(input); | |
// If it supports IExtensionFactory, create an extension and add it to the map. | |
IExtensionFactory extensionFactory = BPELUtil.adapt( input, IExtensionFactory.class); | |
if (extensionFactory != null) { | |
if (Policy.DEBUG) System.out.println("creating extension for: "+input); //$NON-NLS-1$ | |
EObject extension = extensionFactory.createExtension(input); | |
if (extension != null) { | |
extensionMap.put(input, extension); | |
} | |
} | |
} | |
/** | |
* Helper to return the UIExtensionModel object (i.e. from our ExtensionMap) for a | |
* given object, without requiring the ExtensionMap as a parameter. If the object | |
* does not have a UIExtension, null is returned. | |
*/ | |
public static EObject getExtension(EObject input) { | |
ExtendedObjectUserAdapter adapter = (ExtendedObjectUserAdapter) | |
ExtensionmodelFactory.eINSTANCE.getExtensionAdapter(input, | |
IBPELUIConstants.MODEL_EXTENSIONS_NAMESPACE); | |
return (adapter==null)? null : (EObject)adapter.get(input); | |
} | |
// TODO: is this unused? | |
public static FaultHandler getContainingFaultHandler(Object object) { | |
if (object instanceof Process) return null; | |
if (object instanceof FaultHandler) return (FaultHandler)object; | |
if (object instanceof EObject) { | |
return getContainingFaultHandler(((EObject)object).eContainer()); | |
} | |
// Don't know what it is, probably not in a fault handler. | |
return null; | |
} | |
// TODO: is this unused? | |
public static CompensationHandler getContainingCompensationHandler(Object object) { | |
if (object instanceof Process) return null; | |
if (object instanceof CompensationHandler) return (CompensationHandler)object; | |
if (object instanceof EObject) { | |
return getContainingCompensationHandler(((EObject)object).eContainer()); | |
} | |
// Don't know what it is, probably not in a compensation handler. | |
return null; | |
} | |
// TODO: is this unused? | |
public static EventHandler getContainingEventHandler(Object object) { | |
if (object instanceof Process) return null; | |
if (object instanceof EventHandler) return (EventHandler)object; | |
if (object instanceof EObject) { | |
return getContainingEventHandler(((EObject)object).eContainer()); | |
} | |
// Don't know what it is, probably not in an event handler. | |
return null; | |
} | |
public static EObject getContainingScope(Object object) { | |
if (object instanceof Process) return (EObject)object; | |
if (object instanceof Scope) return (EObject)object; | |
if (object instanceof EObject) { | |
return getContainingScope(((EObject)object).eContainer()); | |
} | |
return null; | |
} | |
// /** | |
// * Returns the root process for any model object | |
// **/ | |
// public static Process getProcess(Object object) { | |
// if (object instanceof EObject) { | |
// // check if *this* is already the process object | |
// if (object instanceof Process) | |
// return (Process)object; | |
// EObject cont = ((EObject)object).eContainer(); | |
// while (cont != null) { | |
// if (cont.eClass() == BPELPackage.eINSTANCE.getProcess()) | |
// return (Process)cont; | |
// cont = cont.eContainer(); | |
// } | |
// } | |
// return null; | |
// } | |
/** | |
* Checks to see if an object is contained by a specified parent | |
*/ | |
public static boolean isChildContainedBy(Object modelParent, Object object) { | |
EObject cont = ((EObject)object).eContainer(); | |
while (cont != null) { | |
if (modelParent == cont) | |
return true; | |
cont = cont.eContainer(); | |
} | |
return false; | |
} | |
/** | |
* Adds the given modelObject and all of its contained objects to the given collection | |
* (where containment is determined by the IContainer heirarchy). | |
*/ | |
public static void addSubtreeToCollection(Object modelObject, Collection<Object> collection) { | |
collection.add(modelObject); | |
IContainer container = BPELUtil.adapt(modelObject, IContainer.class); | |
if (container != null) { | |
for (Iterator it = container.getChildren(modelObject).iterator(); it.hasNext(); ) { | |
addSubtreeToCollection(it.next(), collection); | |
} | |
} | |
} | |
public static void setLocation(Activity activity, Point pos) { | |
ActivityExtension extension = (ActivityExtension)getExtension(activity); | |
if (extension != null) { | |
extension.setX(pos.x); | |
extension.setY(pos.y); | |
} | |
} | |
public static Point getLocation(Activity activity) { | |
ActivityExtension extension = (ActivityExtension)getExtension(activity); | |
// HACK! Sometimes we are refreshing the appearance in a batched adapter | |
// after the extension has been removed (when Undoing its creation for example). | |
if (extension == null) return new Point(0,0); | |
return new Point(extension.getX(), extension.getY()); | |
} | |
public static void setSize(Activity activity, Dimension size) { | |
ActivityExtension extension = (ActivityExtension)getExtension(activity); | |
extension.setWidth(size.width); | |
extension.setHeight(size.height); | |
} | |
public static Dimension getSize(Activity activity) { | |
ActivityExtension extension = (ActivityExtension)getExtension(activity); | |
// HACK! Sometimes we are refreshing the appearance in a batched adapter | |
// after the extension has been removed (when Undoing its creation for example). | |
if (extension == null) return new Dimension(1,1); | |
return new Dimension(extension.getWidth(), extension.getHeight()); | |
} | |
/** | |
* Given a model object (or Resource or ResourceSet), return the BPELEditor | |
* that this model belongs to. | |
* | |
* @throws IllegalArgumentException if modelObject is not EObject, Resource or ResourceSet. | |
*/ | |
public static BPELEditor getBPELEditor(Object modelObject) { | |
if (modelObject instanceof StartNode) { | |
modelObject = ((StartNode)modelObject).getProcess(); | |
} | |
if (modelObject instanceof EObject) { | |
Resource r = ((EObject)modelObject).eResource(); | |
if (r != null) { | |
return BPELEditor.getBPELEditor(r.getResourceSet()); | |
} | |
throw new IllegalArgumentException("EObject does not have an eResource()"); | |
} else if (modelObject instanceof Resource) { | |
return BPELEditor.getBPELEditor(((Resource)modelObject).getResourceSet()); | |
} else if (modelObject instanceof ResourceSet) { | |
return BPELEditor.getBPELEditor((ResourceSet)modelObject); | |
} | |
throw new IllegalArgumentException("Not an EObject/Resource/ResourceSet"); | |
} | |
public static boolean isHorizontalLayout(Object modelObject) { | |
BPELEditor bpelEditor = ModelHelper.getBPELEditor(modelObject); | |
if (bpelEditor != null) { | |
return bpelEditor.isHorizontalLayout(); | |
} else { | |
return false; | |
} | |
} | |
public static TreeIterator getAllContents(Object modelObject) { | |
if (modelObject instanceof EObject) { | |
return ((EObject)modelObject).eAllContents(); | |
} else if (modelObject instanceof Resource) { | |
return ((Resource)modelObject).getAllContents(); | |
} else if (modelObject instanceof ResourceSet) { | |
return ((ResourceSet)modelObject).getAllContents(); | |
} | |
throw new IllegalArgumentException(); | |
} | |
/** | |
* Searches the specified modelObject for a contained element with the | |
* specified name and of the specified type. Candidates are matched by | |
* using the INamedElement adapter. | |
* | |
* @param modelObject | |
* the object to search, must not be <code>null</code> | |
* @param name | |
* the name to look for, must not be <code>null</code> | |
* @param type | |
* the type to look for, may be <code>null</code> which | |
* matches any type | |
* @return the matching object or <code>null</code> if not found. | |
*/ | |
static public Object findElementByName(EObject modelObject, String name, Class type) | |
{ | |
Object result = null; | |
if (modelObject != null && name != null) | |
{ | |
for (Iterator<EObject> i = modelObject.eAllContents(); result == null && i.hasNext();) | |
{ | |
EObject model = i.next(); | |
// Check type. | |
if (type == null || type.isInstance(model)) | |
{ | |
// Check name. | |
INamedElement namedElement = BPELUtil.adapt(model, INamedElement.class); | |
if (namedElement != null && name.equals(namedElement.getName(model))) | |
{ | |
result = model; | |
} | |
} | |
} | |
} | |
return result; | |
} | |
/** | |
* Gets the variable type from the model object. The direction can be INCOMING or OUTGOING. | |
*/ | |
public static EObject getVariableType(EObject container, int direction) { | |
if (container instanceof Invoke) { | |
Operation operation = ModelHelper.getOperation(container); | |
if (operation == null) return null; | |
if (direction == INCOMING) { | |
Output output = operation.getOutput(); | |
return (output != null) ? (EObject)output.getMessage() : null; | |
} else if (direction == OUTGOING) { | |
Input input = operation.getInput(); | |
return (input != null) ? (EObject)input.getMessage() : null; | |
} else { | |
return null; | |
} | |
} | |
if (container instanceof PartnerActivity | |
|| container instanceof OnMessage | |
|| container instanceof OnEvent) { | |
Operation operation = ModelHelper.getOperation(container); | |
if (operation == null) return null; | |
if (direction == INCOMING) { | |
Input input = operation.getInput(); | |
return (input != null) ? (EObject)input.getMessage() : null; | |
} else if (direction == OUTGOING) { | |
Output output = operation.getOutput(); | |
return (output != null) ? (EObject)output.getMessage() : null; | |
} else { | |
return null; | |
} | |
} | |
return null; | |
} | |
/** | |
* Given a Part or XSDElementDeclaration we figure out what would be a | |
* good type for a bundled/unbundled variable. | |
*/ | |
public static Object getVariableTypeFrom(Object target) { | |
if (target instanceof Part) { | |
// A part can be typed as an element or a type | |
Part part = (Part)target; | |
if (part.getElementDeclaration() != null) { | |
return part.getElementDeclaration(); | |
} else if (part.getTypeDefinition() != null) { | |
return part.getTypeDefinition(); | |
} | |
} else if (target instanceof XSDElementDeclaration) { | |
XSDElementDeclaration element = (XSDElementDeclaration) BPELUtil.resolveXSDObject(target); | |
XSDTypeDefinition type = element.getTypeDefinition(); | |
if (isAnonymousType(type)) { | |
return element; | |
} | |
return element.getTypeDefinition(); | |
} | |
return null; | |
} | |
public static boolean isAnonymousType(XSDTypeDefinition type) { | |
return type.getName() == null || "".equals(type.getName()); //$NON-NLS-1$ | |
} | |
/** | |
* Given a model object returns whether the process is supposed to be spec-compliant. | |
*/ | |
public static boolean isSpecCompliant(EObject model) { | |
return ((ProcessExtension)getExtension(BPELUtils.getProcess(model))).isSpecCompliant(); | |
} | |
public static boolean isReferencePartnerLink(PartnerLink partner) { | |
return partner.getPartnerRole() != null; | |
} | |
public static boolean isInterfacePartnerLink(PartnerLink partner) { | |
return partner.getMyRole() != null; | |
} | |
public static CompoundCommand getCreatePartnerLinkTypeCommand(Process process, PartnerLink partner, PartnerLinkType plt, Definition artifactsDefinition, int whichRole) { | |
CompoundCommand compound = new CompoundCommand(); | |
compound.add(new SetUniqueNameCommand(process, partner)); | |
compound.add(new CreatePartnerLinkTypeCommand(artifactsDefinition, plt, partner)); | |
compound.add(new SetPartnerLinkTypeCommand(partner, plt)); | |
compound.add(createSetRoleCommand(partner, plt, whichRole)); | |
return compound; | |
} | |
public static Command createSetRoleCommand(PartnerLink partnerLink, PartnerLinkType plt, int whichRole) { | |
CompoundCommand cmd = new CompoundCommand(); | |
Role role = PartnerlinktypeFactory.eINSTANCE.createRole(); | |
role.setName((whichRole == ModelHelper.MY_ROLE) ? IBPELUIConstants.ROLE_NAME_MYROLE : IBPELUIConstants.ROLE_NAME_PARTNERROLE); | |
cmd.add(new AddRoleCommand(plt, role)); | |
cmd.add(new SetRoleCommand(partnerLink, role, whichRole)); | |
return cmd; | |
} | |
public static Set<Property> getAvailableProperties(Process process) { | |
Set<Property> properties = new HashSet<Property>(); | |
// search in current process | |
// TODO: This doesn't work for Scoped correlation sets or those on OnEvents | |
List<CorrelationSet> sets = process.getCorrelationSets().getChildren(); | |
for (Iterator<CorrelationSet> iter = sets.iterator(); iter.hasNext();) { | |
CorrelationSet set = iter.next(); | |
for (Iterator<Property> iterator = set.getProperties().iterator(); iterator.hasNext();) { | |
properties.add(iterator.next()); | |
} | |
} | |
// search in artifacts wsdl | |
BPELEditor bpelEditor = ModelHelper.getBPELEditor(process); | |
for (Iterator<EObject> iter = bpelEditor.getArtifactsDefinition().eAllContents(); iter.hasNext();) { | |
EObject element = iter.next(); | |
if (element instanceof Property) { | |
properties.add((Property) element); | |
} | |
} | |
return properties; | |
} | |
/** | |
* Return the imported document, based on the import passed. | |
* | |
* @param imp | |
* @return the imported document model or null, if it cannot be constructed. | |
*/ | |
static public EObject getImportedDocument ( Import imp ) { | |
ImportResolver[] resolvers = ImportResolverRegistry.INSTANCE.getResolvers(imp.getImportType()); | |
for (int i = 0; i < resolvers.length ; i++) | |
{ | |
EObject result = resolvers[i].resolve(imp, null, null, null ); | |
if (result != null) { | |
return result; | |
} | |
} | |
return null; | |
} | |
/** | |
* Return the list of schemas that are imported in this BPEL resource. | |
* This includes XSD imports and schemas present in WSDLs as well. | |
* | |
* @param context object within the BPEL object model hierarchy | |
* @param bIncludeXSD whether the XSD standard schemas ought to be included | |
* regardless of import. | |
* | |
* @return a list of XSDScheme objects | |
*/ | |
static public List getSchemas ( Object context, boolean bIncludeXSD ) | |
{ | |
ArrayList al = new ArrayList(8); | |
// Try the BPEL imports if any exist. | |
Process process = BPELUtils.getProcess(context); | |
if (process == null) { | |
return al; | |
} | |
Iterator<Import> it = process.getImports().iterator(); | |
while ( it.hasNext() ) | |
{ | |
Import imp = it.next(); | |
if (imp.getLocation() == null ) { | |
continue; | |
} | |
ImportResolver[] resolvers = ImportResolverRegistry.INSTANCE.getResolvers(imp.getImportType()); | |
for (int i = 0; i < resolvers.length; i++) | |
{ | |
al.addAll( resolvers[i].resolve (imp, ImportResolver.RESOLVE_SCHEMA ) ); | |
} | |
// next import | |
} | |
if (bIncludeXSD) { | |
al.add ( XSDSchemaImpl.getSchemaForSchema( XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001 ) ); | |
} | |
return al; | |
} | |
/** | |
* Get the definitions that are included in this BPEL (via the WSDL imports) | |
* | |
* @return | |
*/ | |
static public List<Definition> getDefinitions ( Object context ) { | |
ArrayList<Definition> al = new ArrayList<Definition>(8); | |
// Try the BPEL imports if any exist. | |
Process process = BPELUtils.getProcess( context ); | |
if (process == null) { | |
return al; | |
} | |
Iterator<Import> it = process.getImports().iterator(); | |
while ( it.hasNext() ) | |
{ | |
Import imp = it.next(); | |
if (imp.getLocation() == null ) { | |
continue; | |
} | |
ImportResolver[] resolvers = ImportResolverRegistry.INSTANCE.getResolvers(imp.getImportType()); | |
for (int i = 0; i < resolvers.length; i++) | |
{ | |
al.addAll( (Collection<? extends Definition>) resolvers[i].resolve (imp, ImportResolver.RESOLVE_DEFINITION ) ); | |
} | |
// next import | |
} | |
// If the artifacts are not imported yet, then add them to the list here as well. | |
Definition artifacts = ModelHelper.getBPELEditor(process).getArtifactsDefinition(); | |
if (al.contains(artifacts) == false) { | |
al.add(artifacts); | |
} | |
return al; | |
} | |
/** | |
* Answer if the process already contains an import specified by this import object. | |
* | |
* @param modelObject a context object from the model | |
* @param imp the import in question | |
* @return true if yes, false if no | |
*/ | |
public static boolean containsImport (Object modelObject, Import imp) { | |
Process process = BPELUtils.getProcess(modelObject); | |
if (process == null) { | |
return false; | |
} | |
EList<Import> imports = process.getImports(); | |
// this checks for identity | |
if (imports.contains( imp )) { | |
return true; | |
} | |
// Don't add the import if it already exists ... | |
Iterator<Import> i = imports.iterator(); | |
boolean bExists = false; | |
while (i.hasNext() && !bExists) { | |
Import n = i.next(); | |
bExists = isEqual ( n.getImportType(), imp.getImportType() ) && | |
isEqual ( n.getLocation(), imp.getLocation() ) && | |
isEqual ( n.getNamespace(), imp.getNamespace() ) ; | |
} | |
return bExists; | |
} | |
/** | |
* Return true of both strings are the same or null. | |
* | |
* @param s1 | |
* @param s2 | |
* @return | |
*/ | |
static public boolean isEqual ( String s1, String s2 ) { | |
return s1 != null ? s1.equals(s2) : s2 == null; | |
} | |
public static ToParts getToParts(EObject model) { | |
if (model instanceof Invoke) { | |
return ((Invoke) model).getToParts(); | |
} | |
if (model instanceof Reply) { | |
return ((Reply) model).getToParts(); | |
} | |
throw new IllegalArgumentException("This model object has no toParts to get"); //$NON-NLS-1$ | |
} | |
public static void setToParts(EObject context, ToParts toParts) { | |
if (context instanceof Reply) { | |
((Reply) context).setToParts(toParts); | |
return; | |
} | |
if (context instanceof Invoke) { | |
((Invoke) context).setToParts(toParts); | |
return; | |
} | |
throw new IllegalArgumentException("toParts cannot be set to this model object"); //$NON-NLS-1$ | |
} | |
public static FromParts getFromParts(EObject model) { | |
if (model instanceof Invoke) { | |
return ((Invoke) model).getFromParts(); | |
} | |
if (model instanceof Receive) { | |
return ((Receive) model).getFromParts(); | |
} | |
if (model instanceof OnMessage) { | |
return ((OnMessage) model).getFromParts(); | |
} | |
if (model instanceof OnEvent) { | |
return ((OnEvent) model).getFromParts(); | |
} | |
throw new IllegalArgumentException("This model object has no fromParts to get"); //$NON-NLS-1$ | |
} | |
public static void setFromParts(EObject context, FromParts fromParts) { | |
if (context instanceof Receive) { | |
((Receive) context).setFromParts(fromParts); | |
return; | |
} | |
if (context instanceof Invoke) { | |
((Invoke) context).setFromParts(fromParts); | |
return; | |
} | |
if (context instanceof OnMessage) { | |
((OnMessage) context).setFromParts(fromParts); | |
return; | |
} | |
if (context instanceof OnEvent) { | |
((OnEvent) context).setFromParts(fromParts); | |
return; | |
} | |
throw new IllegalArgumentException("fromParts cannot be set to this model object"); //$NON-NLS-1$ | |
} | |
} |