/*
* 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.synapse.mediators;
import org.apache.synapse.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.aspects.flow.statistics.collectors.CloseEventCollector;
import org.apache.synapse.aspects.flow.statistics.collectors.OpenEventCollector;
import org.apache.synapse.aspects.flow.statistics.collectors.RuntimeStatisticCollector;
import org.apache.synapse.debug.SynapseDebugManager;
/**
* This class will be used as the executer for the injectAsync method for the
* sequence mediation
*/
public class MediatorWorker implements Runnable {
private static final Log log = LogFactory.getLog(MediatorWorker.class);
private static final Log trace = LogFactory.getLog(SynapseConstants.TRACE_LOGGER);
/** Mediator to be executed */
private Mediator seq = null;
/** MessageContext to be mediated using the mediator */
private MessageContext synCtx = null;
/**
* Constructor of the MediatorWorker which sets the sequence and the message context
*
* @param seq - Sequence Mediator to be set
* @param synCtx - Synapse MessageContext to be set
*/
public MediatorWorker(Mediator seq, MessageContext synCtx) {
this.seq = seq;
this.synCtx = synCtx;
}
/**
* Constructor od the MediatorWorker which sets the provided message context and the
* main sequence as the sequence for mediation
*
* @param synCtx - Synapse MessageContext to be set
*/
public MediatorWorker(MessageContext synCtx) {
this.synCtx = synCtx;
seq = synCtx.getMainSequence();
}
/**
* Execution method of the thread. This will just call the mediation of the specified
* Synapse MessageContext using the specified Sequence Mediator
*/
public void run() {
try {
if (synCtx.getEnvironment().isDebuggerEnabled()) {
SynapseDebugManager debugManager = synCtx.getEnvironment().getSynapseDebugManager();
debugManager.acquireMediationFlowLock();
debugManager.advertiseMediationFlowStartPoint(synCtx);
}
seq.mediate(synCtx);
//((Axis2MessageContext)synCtx).getAxis2MessageContext().getEnvelope().discard();
} catch (SynapseException syne) {
if (!synCtx.getFaultStack().isEmpty()) {
warn(false, "Executing fault handler due to exception encountered", synCtx);
((FaultHandler) synCtx.getFaultStack().pop()).handleFault(synCtx, syne);
} else {
warn(false, "Exception encountered but no fault handler found - " +
"message dropped", synCtx);
}
} catch (Exception e) {
String msg = "Unexpected error executing task/async inject";
log.error(msg, e);
if (synCtx.getServiceLog() != null) {
synCtx.getServiceLog().error(msg, e);
}
if (!synCtx.getFaultStack().isEmpty()) {
warn(false, "Executing fault handler due to exception encountered", synCtx);
((FaultHandler) synCtx.getFaultStack().pop()).handleFault(synCtx, e);
} else {
warn(false, "Exception encountered but no fault handler found - " +
"message dropped", synCtx);
}
} catch (Throwable e) {
String msg = "Unexpected error executing task/async inject, message dropped";
log.error(msg, e);
if (synCtx.getServiceLog() != null) {
synCtx.getServiceLog().error(msg, e);
}
} finally {
if (synCtx.getEnvironment().isDebuggerEnabled()) {
SynapseDebugManager debugManager = synCtx.getEnvironment().getSynapseDebugManager();
debugManager.advertiseMediationFlowTerminatePoint(synCtx);
debugManager.releaseMediationFlowLock();
}
if (RuntimeStatisticCollector.isStatisticsEnabled()) {
CloseEventCollector.closeFlowForcefully(synCtx, false);
}
}
synCtx = null;
seq = null;
}
private void warn(boolean traceOn, String msg, MessageContext msgContext) {
if (traceOn) {
trace.warn(msg);
}
if (log.isDebugEnabled()) {
log.warn(msg);
}
if (msgContext.getServiceLog() != null) {
msgContext.getServiceLog().warn(msg);
}
}
}