package org.talend.esb.policy.transformation;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.cxf.interceptor.transform.TransformInInterceptor;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JInInterceptor;
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.talend.esb.policy.transformation.util.xslt.InputXSLTUtil;
public class TransformationPolicyInInterceptor extends AbstractTransformationPolicyInterceptor {
private ConcurrentHashMap<String, InputXSLTUtil> utilsCache
= new ConcurrentHashMap<String, InputXSLTUtil>();
public TransformationPolicyInInterceptor() {
super(Phase.PRE_PROTOCOL);
addAfter(PolicyBasedWSS4JInInterceptor.class.getName());
addAfter(WSS4JInInterceptor.class.getName());
}
public TransformationPolicyInInterceptor(TransformationAssertion assertion) {
super(Phase.PRE_PROTOCOL, assertion);
addAfter(PolicyBasedWSS4JInInterceptor.class.getName());
addAfter(WSS4JInInterceptor.class.getName());
}
protected void proceedXSLT(Message message, TransformationAssertion tas) {
String xsltPath = (String)message.getContextualProperty(XSLT_PATH);
if (xsltPath == null) {
xsltPath = tas.getPath();
}
if (xsltPath != null) {
if (!shouldTransform(message, tas.getMessageType(), tas.getAppliesTo())) {
return;
}
InputXSLTUtil xsltIn;
if (utilsCache.containsKey(xsltPath)) {
xsltIn = utilsCache.get(xsltPath);
} else {
xsltIn = new InputXSLTUtil(xsltPath);
utilsCache.put(xsltPath, xsltIn);
}
xsltIn.handleMessage(message);
}
}
protected void proceedSimple(Message message, TransformationAssertion tas) {
if (!shouldTransform(message, tas.getMessageType(), tas.getAppliesTo())) {
return;
}
Object map = message.getContextualProperty(TRANSFORM_MAP);
if (!(map instanceof Map)) {
return;
}
@SuppressWarnings("unchecked")
Map<String, String> inTransformMap = (Map<String, String>) map;
TransformInInterceptor simpleIn = new TransformInInterceptor();
simpleIn.setInTransformElements(inTransformMap);
simpleIn.handleMessage(message);
}
}