OScope oscope = _structureStack.topScope();
oscope.faultHandler = new OFaultHandler(_oprocess);
if (fh == null) {
// The default fault handler compensates all child activities
// AND then rethrows the fault!
final OCatch defaultCatch = new OCatch(_oprocess, oscope);
defaultCatch.name = "__defaultFaultHandler:" + oscope.name;
defaultCatch.faultName = null; // catch any fault
defaultCatch.faultVariable = null;
OSequence sequence = new OSequence(_oprocess, defaultCatch);
sequence.name = "__defaultFaultHandler_sequence:" + oscope.name;
sequence.debugInfo = createDebugInfo(fh, "Auto-generated sequence activity.");
ORethrow rethrow = new ORethrow(_oprocess, sequence);
rethrow.name = "__defaultFaultHandler_rethrow:" + oscope.name;
rethrow.debugInfo = createDebugInfo(fh, "Auto-generated re-throw activity.");
sequence.sequence.add(createDefaultCompensateActivity(fh, "Default compensation handler for " + oscope));
sequence.sequence.add(rethrow);
defaultCatch.activity = sequence;
oscope.faultHandler.catchBlocks.add(defaultCatch);
if (__log.isDebugEnabled())
__log.debug("Compiled default catch block " + defaultCatch + " for " + oscope);
} else {
_recoveryContextStack.push(oscope);
try {
int i = 0;
for (final Catch catchSrc : fh.getCatches()) {
final OCatch ctch = new OCatch(_oprocess, oscope);
ctch.debugInfo = createDebugInfo(catchSrc, catchSrc.toString());
ctch.name = "__catch#" + i + ":" + _structureStack.topScope().name;
ctch.faultName = catchSrc.getFaultName();
compile(ctch, catchSrc, new Runnable() {
public void run() {
if (catchSrc.getFaultVariable() != null) {
OScope.Variable faultVar;
switch (_processDef.getBpelVersion()) {
case BPEL11:
faultVar = resolveVariable(catchSrc.getFaultVariable());
if (!(faultVar.type instanceof OMessageVarType))
throw new CompilationException(__cmsgs.errMessageVariableRequired(
catchSrc.getFaultVariable()).setSource(catchSrc));
break;
case BPEL20_DRAFT:
case BPEL20:
if (catchSrc.getFaultVariableMessageType() == null
&& catchSrc.getFaultVariableElementType() == null)
throw new CompilationException(__cmsgs.errVariableDeclMissingType(
catchSrc.getFaultVariable()).setSource(catchSrc));
if (catchSrc.getFaultVariableMessageType() != null
&& catchSrc.getFaultVariableElementType() != null)
throw new CompilationException(__cmsgs.errVariableDeclMissingType(
catchSrc.getFaultVariable()).setSource(catchSrc));
OVarType faultVarType;
if (catchSrc.getFaultVariableMessageType() != null)
faultVarType = resolveMessageType(catchSrc.getFaultVariableMessageType());
else if (catchSrc.getFaultVariableElementType() != null)
faultVarType = resolveElementType(catchSrc.getFaultVariableElementType());
else
throw new CompilationException(__cmsgs
.errUnrecognizedVariableDeclaration(catchSrc.getFaultVariable()));
faultVar = new OScope.Variable(_oprocess, faultVarType);
faultVar.name = catchSrc.getFaultVariable();
faultVar.declaringScope = _structureStack.topScope();
ctch.addLocalVariable(faultVar);
break;
default:
throw new AssertionError("Unexpected BPEL VERSION constatnt: "
+ _processDef.getBpelVersion());
}