Element outboundMsg;
try {
outboundMsg = setupOutbound(_oinvoke, _oinvoke.initCorrelationsInput);
} catch (FaultException e) {
__log.error(e);
FaultData fault = createFault(e.getQName(), _oinvoke);
_self.parent.completed(fault, CompensationHandler.emptySet());
return;
} catch (ExternalVariableModuleException e) {
__log.error(e);
_self.parent.failure(e.toString(), null);
return;
}
++_invoked;
// if there is no output variable, then this is a one-way invoke
boolean isTwoWay = _oinvoke.outputVar != null;
try {
if (!isTwoWay) {
FaultData faultData = null;
getBpelRuntime().invoke(null, _scopeFrame.resolve(_oinvoke.partnerLink), _oinvoke.operation, outboundMsg, null);
_self.parent.completed(faultData, CompensationHandler.emptySet());
} else /* two-way */{
final VariableInstance outputVar = _scopeFrame.resolve(_oinvoke.outputVar);
final InvokeResponseChannel invokeResponseChannel = newChannel(InvokeResponseChannel.class);
final String mexId = getBpelRuntime().invoke(invokeResponseChannel.export(),
_scopeFrame.resolve(_oinvoke.partnerLink), _oinvoke.operation, outboundMsg, invokeResponseChannel);
object(false, new InvokeResponseChannelListener(invokeResponseChannel) {
private static final long serialVerstmptmpionUID = 4496880438819196765L;
public void onResponse() {
// we don't have to write variable data -> this already
// happened in the nativeAPI impl
FaultData fault = null;
Element response;
try {
response = getBpelRuntime().getPartnerResponse(mexId);
} catch (Exception e) {
__log.error("Exception while processing invoke response", e);
throw new RuntimeException(e);
}
try {
initializeVariable(outputVar, response);
} catch (ExternalVariableModuleException e) {
__log.error("Exception while initializing external variable", e);
_self.parent.failure(e.toString(), null);
return;
}
// Generating event
VariableModificationEvent se = new VariableModificationEvent(outputVar.declaration.name);
se.setNewValue(response);
if (_oinvoke.debugInfo != null)
se.setLineNo(_oinvoke.debugInfo.startLine);
sendEvent(se);
try {
for (OScope.CorrelationSet anInitCorrelationsOutput : _oinvoke.initCorrelationsOutput) {
initializeCorrelation(_scopeFrame.resolve(anInitCorrelationsOutput), outputVar);
}
if (_oinvoke.partnerLink.hasPartnerRole()) {
// Trying to initialize partner epr based on a message-provided epr/session.
if (!getBpelRuntime().isPartnerRoleEndpointInitialized(_scopeFrame
.resolve(_oinvoke.partnerLink)) || !_oinvoke.partnerLink.initializePartnerRole) {
Node fromEpr = getBpelRuntime().getSourceEPR(mexId);
if (fromEpr != null) {
getBpelRuntime().writeEndpointReference(
_scopeFrame.resolve(_oinvoke.partnerLink), (Element) fromEpr);
}
}
String partnersSessionId = getBpelRuntime().getSourceSessionId(mexId);
if (partnersSessionId != null)
getBpelRuntime().initializePartnersSessionId(_scopeFrame.resolve(_oinvoke.partnerLink),
partnersSessionId);
}
} catch (FaultException e) {
fault = createFault(e.getQName(), _oinvoke);
}
// TODO update output variable with data from non-initiate correlation sets
_self.parent.completed(fault, CompensationHandler.emptySet());
getBpelRuntime().releasePartnerMex(mexId);
}
public void onFault() {
QName faultName = getBpelRuntime().getPartnerFault(mexId);
Element msg = getBpelRuntime().getPartnerResponse(mexId);
QName msgType = getBpelRuntime().getPartnerResponseType(mexId);
FaultData fault = createFault(faultName, msg,
_oinvoke.getOwner().messageTypes.get(msgType), _self.o);
_self.parent.completed(fault, CompensationHandler.emptySet());
getBpelRuntime().releasePartnerMex(mexId);
}
public void onFailure() {
// This indicates a communication failure. We don't throw a fault,
// because there is no fault, instead we'll re-incarnate the invoke
// and either retry or indicate failure condition.
// admin to resume the process.
String reason = getBpelRuntime().getPartnerFaultExplanation(mexId);
__log.error("Failure during invoke: " + reason);
try {
Element el = DOMUtils.stringToDOM("<invokeFailure><![CDATA["+reason+"]]></invokeFailure>");
_self.parent.failure(reason, el);
} catch (Exception e) {
_self.parent.failure(reason, null);
}
getBpelRuntime().releasePartnerMex(mexId);
}
}.or(new TerminationChannelListener(_self.self) {
private static final long serialVersionUID = 4219496341785922396L;
public void terminate() {
_self.parent.completed(null, CompensationHandler.emptySet());
object(new InvokeResponseChannelListener(invokeResponseChannel) {
private static final long serialVersionUID = 688746737897792929L;
public void onFailure() {
__log.debug("Failure on invoke ignored, the invoke has already been terminated: " + _oinvoke.toString());
}
public void onFault() {
__log.debug("Fault on invoke ignored, the invoke has already been terminated: " + _oinvoke.toString());
}
public void onResponse() {
__log.debug("Response on invoke ignored, the invoke has already been terminated: " + _oinvoke.toString());
}
});
}
}));
}
} catch (FaultException fault) {
__log.error(fault);
FaultData faultData = createFault(fault.getQName(), _oinvoke, fault.getMessage());
_self.parent.completed(faultData, CompensationHandler.emptySet());
}
}