if (key == null) {
// The onError sequence for handling errors which may occur during the
// mediation through this sequence
Mediator errorHandlerMediator = null;
// Setting Required property to collect the sequence statistics
if (statsOn) {
StatisticsStack sequenceStack = (StatisticsStack)
synCtx.getProperty(SynapseConstants.SEQUENCE_STATS);
if (sequenceStack == null) {
sequenceStack = new SequenceStatisticsStack();
synCtx.setProperty(SynapseConstants.SEQUENCE_STATS, sequenceStack);
}
String seqName = (name == null ? SynapseConstants.ANONYMOUS_SEQUENCE : name);
boolean isFault = synCtx.getEnvelope().getBody().hasFault();
sequenceStack.put(seqName, System.currentTimeMillis(),
!synCtx.isResponse(), statsOn, isFault);
}
try {
// push the errorHandler sequence into the current message as the fault handler
if (errorHandler != null) {
errorHandlerMediator = synCtx.getSequence(errorHandler);
if (errorHandlerMediator != null) {
if (traceOrDebugOn) {
traceOrDebug(traceOn, "Setting the onError handler : " +
errorHandler + " for the sequence : " + name);
}
synCtx.pushFaultHandler(
new MediatorFaultHandler(errorHandlerMediator));
} else {
auditWarn("onError handler : " + errorHandler + " for sequence : " +
name + " cannot be found", synCtx);
}
}
boolean result = super.mediate(synCtx);
// if we pushed an error handler, pop it from the fault stack
// before we exit normally without an exception
if (errorHandlerMediator != null) {
Stack faultStack = synCtx.getFaultStack();
if (faultStack != null && !faultStack.isEmpty()) {
Object o = faultStack.peek();
if (o instanceof MediatorFaultHandler &&
errorHandlerMediator.equals(
((MediatorFaultHandler) o).getFaultMediator())) {
faultStack.pop();
}
}
}
if (traceOrDebugOn) {
if (traceOn && trace.isTraceEnabled()) {
trace.trace("Message : " + synCtx.getEnvelope());
}
traceOrDebug(traceOn,
"End : Sequence <" + (name == null ? "anonymous" : name) + ">");
}
return result;
} finally {
//If this sequence is finished it's task normally
if (statsOn) {
StatisticsUtils.processSequenceStatistics(synCtx);
}
//If this sequence is a IN or OUT sequence of a proxy service
StatisticsUtils.processProxyServiceStatistics(synCtx);
}
} else {
Mediator m = synCtx.getSequence(key);
if (m == null) {
handleException("Sequence named " + key + " cannot be found", synCtx);
} else {
if (traceOrDebugOn) {
traceOrDebug(traceOn, "Executing sequence named " + key);
}
boolean result = m.mediate(synCtx);
if (traceOrDebugOn) {
traceOrDebug(traceOn, "End : Sequence <" + key + ">");
}
return result;