package org.talend.esb.policy.transformation; import java.util.Collection; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Message; import org.apache.cxf.message.MessageUtils; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.ws.policy.AssertionInfo; import org.apache.cxf.ws.policy.AssertionInfoMap; import org.talend.esb.policy.transformation.TransformationAssertion.AppliesToType; import org.talend.esb.policy.transformation.TransformationAssertion.MessageType; public abstract class AbstractTransformationPolicyInterceptor extends AbstractPhaseInterceptor<Message> { protected static final String XSLT_PATH = "org.talend.esb.transformation.xslt-path"; protected static final String TRANSFORM_MAP = "org.talend.esb.transformation.transform-map"; private TransformationAssertion featureAssertion; public AbstractTransformationPolicyInterceptor(String phase) { super(phase); } public AbstractTransformationPolicyInterceptor(String phase, TransformationAssertion assertion) { super(phase); if (assertion == null) { throw new IllegalArgumentException("Provided assertion is null"); } featureAssertion = assertion; } @Override public void handleMessage(Message message) { AssertionInfo ai = null; try { ai = TransformationPolicyBuilder.getAssertion(message); } catch (Exception e) { throw new Fault(e); } TransformationAssertion tas; if ((ai == null || !(ai.getAssertion() instanceof TransformationAssertion))) { if (featureAssertion != null) { tas = featureAssertion; } else { confirmPolicyProcessing(message); return; } } else { tas = (TransformationAssertion) ai.getAssertion(); } TransformationType transformationType = tas.getTransformationType(); if (transformationType == TransformationType.xslt) { proceedXSLT(message, tas); } else if (transformationType == TransformationType.simple) { proceedSimple(message, tas); } confirmPolicyProcessing(message); } protected abstract void proceedXSLT(Message message, TransformationAssertion tas); protected abstract void proceedSimple(Message message, TransformationAssertion tas); protected boolean shouldTransform(Message message, MessageType msgType, AppliesToType appliesToType) { if (MessageUtils.isRequestor(message)) { if (MessageUtils.isOutbound(message)) { // REQ_OUT return ((appliesToType == AppliesToType.consumer || appliesToType == AppliesToType.always) && (msgType == MessageType.request || msgType == MessageType.all)); } else { // RESP_IN return ((appliesToType == AppliesToType.consumer || appliesToType == AppliesToType.always) && (msgType == MessageType.response || msgType == MessageType.all)); } } else { if (MessageUtils.isOutbound(message)) { // RESP_OUT return ((appliesToType == AppliesToType.provider || appliesToType == AppliesToType.always) && (msgType == MessageType.response || msgType == MessageType.all)); } else { // REQ_IN return ((appliesToType == AppliesToType.provider || appliesToType == AppliesToType.always) && (msgType == MessageType.request || msgType == MessageType.all)); } } } protected void confirmPolicyProcessing(Message message) { AssertionInfoMap aim = message.get(AssertionInfoMap.class); if (aim != null) { Collection<AssertionInfo> ais = aim .get(TransformationPolicyBuilder.TRANSFORMATION); if (ais != null) { for (AssertionInfo ai : ais) { if (ai.getAssertion() instanceof TransformationAssertion) { ai.setAsserted(true); } } } } } }