blob: 8aad3ece0d4fed2fa1076b93a39d4d0b462e0797 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.ode.bpel.runtime;
import java.util.Collection;
import java.util.Date;
import java.net.URI;
import javax.wsdl.Operation;
import javax.xml.namespace.QName;
import org.apache.ode.bpel.common.CorrelationKey;
import org.apache.ode.bpel.common.FaultException;
import org.apache.ode.bpel.evt.ProcessInstanceEvent;
import org.apache.ode.bpel.extension.ExtensionOperation;
import org.apache.ode.bpel.obj.OPartnerLink;
import org.apache.ode.bpel.obj.OProcess;
import org.apache.ode.bpel.obj.OScope;
import org.apache.ode.bpel.obj.OScope.Variable;
import org.apache.ode.bpel.runtime.channels.ActivityRecovery;
import org.apache.ode.bpel.runtime.channels.FaultData;
import org.apache.ode.bpel.runtime.channels.InvokeResponse;
import org.apache.ode.bpel.runtime.channels.PickResponse;
import org.apache.ode.bpel.runtime.channels.TimerResponse;
import org.apache.ode.bpel.evar.ExternalVariableModuleException;
import org.apache.ode.bpel.iapi.ProcessConf.PartnerRoleConfig;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* <p>A facade for accessing all the BPEL functionality that is not implemented
* directly in the JACOB framework, but rather "natively" . Things that are so
* implemented include variables (i.e. the JACOB state-space does not include
* dimensions for variables, these are instead implemented as database rows of
* some sort), the communication activities pick/receive/invoke (i.e. there
* are no JACOB channels representing partnerLink links), and correlation (i.e.
* the JACOB objects do not match message to process instances, this happens
* in this <em>native</em> layer).</p>
*/
public interface BpelRuntimeContext {
Long getPid();
/**
* Checks for variable initialization, i.e. has had a 'write'
*
* @param variable variable
*
* @return <code>true</code> if initialized
*/
boolean isVariableInitialized(VariableInstance variable);
/**
* Create a scope instance object.
* @param parentScopeId _id of parent scope (null if root scope)
* @param scopeType the type of scope, i.e. the name of the scope
*
* @return scope instance identifier
*/
Long createScopeInstance(Long parentScopeId, OScope scopeType);
/**
* Initializes endpoint references for partner links inside a scope.
* @param parentScopeId
* @param partnerLinks
*/
void initializePartnerLinks(Long parentScopeId, Collection<OPartnerLink> partnerLinks);
/**
*
* @param var variable to read
* @return
*/
Node readVariable(Long scopeInstanceId, String varname, boolean forWriting)
throws FaultException;
/**
* Fetches the my-role endpoint reference data.
* @param pLink
* @param isMyEPR
* @return
* @throws FaultException
*/
Element fetchMyRoleEndpointReferenceData(PartnerLinkInstance pLink);
Element fetchPartnerRoleEndpointReferenceData(PartnerLinkInstance pLink) throws FaultException;
/**
* Determine if the partner role of an endpoint has been initialized (either explicitly throug assginment or via the
* deployment descriptor)
* @param pLink partner link
* @return
*/
boolean isPartnerRoleEndpointInitialized(PartnerLinkInstance pLink);
/**
* Retrieve failure handling info for invoke
* @param pLink
* @return
*/
PartnerRoleConfig getConfigForPartnerLink(OPartnerLink pLink);
/**
* Fetches our session id associated with the partner link instance. This will always return a
* non-null value.
* @param pLink partner link
*/
String fetchMySessionId(PartnerLinkInstance pLink);
/**
* Fetches the partner's session id associated with the partner link instance.
* @param pLink partner link
*/
String fetchPartnersSessionId(PartnerLinkInstance pLink);
/**
* Initialize the partner's session id for this partner link instance.
* @param pLink partner link
* @param session session identifier
*/
void initializePartnersSessionId(PartnerLinkInstance pLink, String session);
/**
* Evaluate a property alias query expression against a variable, returning the normalized
* {@link String} representation of the property value.
* @param var variable to read
* @param property property to read
* @return value of property for variable, in String form
* @throws FaultException in case of selection or other fault
*/
String readProperty(VariableInstance var, OProcess.OProperty property)
throws FaultException;
/**
* Writes a partner EPR.
*
* @param variable
* @param data
* @throws FaultException
*/
void writeEndpointReference(PartnerLinkInstance variable, Element data) throws FaultException;
Node convertEndpointReference(Element epr, Node targetNode);
Node writeVariable(VariableInstance var, Node changes);
boolean isCorrelationInitialized(CorrelationSetInstance cset);
CorrelationKey readCorrelation(CorrelationSetInstance cset);
void writeCorrelation(CorrelationSetInstance cset, CorrelationKey correlation);
void forceFlush();
/**
* Should be invoked by process template, signalling process completion
* with no faults.
*
*/
void completedOk();
/**
* Should be invoked by process template, signalling process completion
* with fault.
*/
void completedFault(FaultData faultData);
/**
* Non-deterministic selection on incoming message-exchanges.
*/
void select(PickResponse response, Date timeout, boolean createInstnace,
Selector[] selectors) throws FaultException;
/**
* Cancel a timer, or pick.
* @param timerResponseChannel
*/
void cancel(TimerResponse timerResponseChannel);
void cancelOutstandingRequests(String channelId);
/**
* Send a reply to an open message-exchange.
* @param msg response message
* @param fault fault name, if this is a fault reply, otherwise <code>null</code>
*/
void reply(PartnerLinkInstance plink, String opName, String mexId, Element msg,
QName fault)
throws FaultException;
/**
* Called back when the process executes an invokation.
*
* @param activityId The activity id in the process definition (id of OInvoke)
* @param partnerLinkInstance The partner link variable instance
* @param operation The wsdl operation.
* @param outboundMsg The message sent outside as a DOM
* @param invokeResponseChannel Object called back when the response is received.
* @return The instance id of the message exchange.
* @throws FaultException When the response is a fault or when the invoke could not be executed
* in which case it is one of the bpel standard fault.
*/
String invoke(int activityId, PartnerLinkInstance partnerLinkInstance,
Operation operation, Element outboundMsg,
InvokeResponse invokeResponseChannel) throws FaultException;
/**
* Registers a timer for future notification.
* @param timerChannel channel for timer notification
* @param timeToFire future time to fire timer notification
*/
void registerTimer(TimerResponse timerChannel, Date timeToFire);
/**
* Terminates the process / sets state flag to terminate
* and ceases all processing on the VPU.
*/
void terminate();
/**
* Sends the bpel event.
* @param event
*/
void sendEvent(ProcessInstanceEvent event);
ExpressionLanguageRuntimeRegistry getExpLangRuntime();
/**
* Generate a unique (and monotonic) ID in the context of this instance.
* @return
*/
long genId();
Element getPartnerResponse(String mexId);
Element getMyRequest(String mexId);
QName getPartnerFault(String mexId);
String getPartnerFaultExplanation(String mexId);
QName getPartnerResponseType(String mexId);
Element getSourceEPR(String mexId);
void registerActivityForRecovery(ActivityRecovery channel, long activityId, String reason,
Date dateTime, Element details, String[] actions, int retries);
void unregisterActivityForRecovery(ActivityRecovery channel);
void recoverActivity(String channel, long activityId, String action, FaultData fault);
String getSourceSessionId(String mexId);
void releasePartnerMex(String mexId, boolean instanceSucceeded);
/**
* Read an external variable.
*/
Node readExtVar(Variable variable, Node reference) throws ExternalVariableModuleException;
/**
* Write an external variable.
*/
ValueReferencePair writeExtVar(Variable variable, Node reference, Node value) throws ExternalVariableModuleException ;
public class ValueReferencePair {
public Node value;
public Node reference;
}
/**
* Retrieves the base URI that this BPEL Process instance is running relative to.
*
* @return URI - the URI representing the absolute physical file path location that this process is defined within.
*/
URI getBaseResourceURI();
/**
* Retrieves the property value that has been defined for this BPEL Process type.
*
* @return propertyValue - the value corresponding to the process property name.
*/
Node getProcessProperty(QName propertyName);
QName getProcessQName();
void processOutstandingRequest(PartnerLinkInstance partnerLink, String opName, String bpelMexId, String odeMexId) throws FaultException;
Date getCurrentEventDateTime();
ClassLoader getProcessClassLoader();
void checkInvokeExternalPermission();
/**
* Create a new extension operation based on the given qualified name.
*
* @param name The qualified name for which a corresponding extension operation should be created.
*
* @return The created extension operation or NULL if no extension bundle registered a corresponding extension operation for the given qualified name.
*/
ExtensionOperation createExtensionActivityImplementation(QName name);
}