/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. 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.wso2.carbon.mediator.callout; import org.apache.axiom.om.OMAttribute; import org.apache.axiom.om.OMElement; import org.apache.synapse.config.xml.SynapseXPathFactory; import org.apache.synapse.config.xml.SynapseXPathSerializer; import org.apache.synapse.config.xml.XMLConfigConstants; import org.apache.synapse.util.xpath.SynapseXPath; import org.jaxen.JaxenException; import org.wso2.carbon.mediator.service.MediatorException; import org.wso2.carbon.mediator.service.ui.AbstractMediator; import javax.xml.namespace.QName; public class CalloutMediator extends AbstractMediator { private static final QName ATT_URL = new QName("serviceURL"); private static final QName ATT_ENDPOINT = new QName("endpointKey"); private static final QName ATT_ACTION = new QName("action"); private static final QName ATT_AXIS2XML = new QName("axis2xml"); private static final QName ATT_REPOSITORY = new QName("repository"); private static final QName ATT_USESERVERCONFIG = new QName("useServerConfig"); private static final QName ATT_INIT_AXIS2_CLIENT_OPTIONS = new QName("initAxis2ClientOptions"); private static final QName Q_CONFIG = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "configuration"); private static final QName Q_SOURCE = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "source"); private static final QName Q_TARGET = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "target"); private static final QName ATT_SOURCE_TYPE = new QName(XMLConfigConstants.NULL_NAMESPACE, "type"); private static final QName Q_SEC = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "enableSec"); private static final QName ATT_POLICY = new QName(XMLConfigConstants.NULL_NAMESPACE, "policy"); private static final QName ATT_OUTBOUND_SEC_POLICY = new QName(XMLConfigConstants.NULL_NAMESPACE, "outboundPolicy"); private static final QName ATT_INBOUND_SEC_POLICY = new QName(XMLConfigConstants.NULL_NAMESPACE, "inboundPolicy"); private String serviceURL = null; private String action = null; private String requestKey = null; private SynapseXPath requestXPath = null; private SynapseXPath targetXPath = null; private String targetKey = null; private String clientRepository = null; private String axis2xml = null; private String useServerConfig = null; private String initAxis2ClientOptions = null; private String endpointKey = null; public final static String DEFAULT_CLIENT_REPO = "./samples/axis2Client/client_repo"; public final static String DEFAULT_AXIS2_XML = "./samples/axis2Client/client_repo/conf/axis2.xml"; private boolean useEnvelopeAsSource = false; private boolean securityOn = false; //Should messages be sent using WS-Security? private String wsSecPolicyKey = null; private String inboundWsSecPolicyKey = null; private String outboundWsSecPolicyKey = null; public String getServiceURL() { return serviceURL; } public void setServiceURL(String serviceURL) { this.serviceURL = serviceURL; } public String getInitAxis2ClientOptions() { return initAxis2ClientOptions; } public void setInitAxis2ClientOptions(String initAxis2ClientOptions) { this.initAxis2ClientOptions = initAxis2ClientOptions; } public String getAction() { return action; } public void setAction(String action) { this.action = action; } public String getRequestKey() { return requestKey; } public void setRequestKey(String requestKey) { this.requestKey = requestKey; } public void setRequestXPath(SynapseXPath requestXPath) throws JaxenException { this.requestXPath = requestXPath; } public void setTargetXPath(SynapseXPath targetXPath) throws JaxenException { this.targetXPath = targetXPath; } public String getTargetKey() { return targetKey; } public void setTargetKey(String targetKey) { this.targetKey = targetKey; } public SynapseXPath getRequestXPath() { return requestXPath; } public SynapseXPath getTargetXPath() { return targetXPath; } public String getClientRepository() { return clientRepository; } public void setClientRepository(String clientRepository) { this.clientRepository = clientRepository; } public String getAxis2xml() { return axis2xml; } public void setAxis2xml(String axis2xml) { this.axis2xml = axis2xml; } public String getTagLocalName() { return "callout"; } public String getUseServerConfig() { return useServerConfig; } public void setEndpointKey(String key) { this.endpointKey = key; } public String getEndpointKey() { return endpointKey; } public void setUseServerConfig(String useServerConfig) { } public boolean isUseEnvelopeAsSource() { return useEnvelopeAsSource; } public void setUseEnvelopeAsSource(boolean useEnvelopeAsSource) { this.useEnvelopeAsSource = useEnvelopeAsSource; } public boolean isSecurityOn() { return securityOn; } public void setSecurityOn(boolean securityOn) { this.securityOn = securityOn; } public String getWsSecPolicyKey() { return wsSecPolicyKey; } public void setWsSecPolicyKey(String wsSecPolicyKey) { this.wsSecPolicyKey = wsSecPolicyKey; } public String getOutboundWsSecPolicyKey() { return outboundWsSecPolicyKey; } public void setOutboundWsSecPolicyKey(String outboundWsSecPolicyKey) { this.outboundWsSecPolicyKey = outboundWsSecPolicyKey; } public String getInboundWsSecPolicyKey() { return inboundWsSecPolicyKey; } public void setInboundWsSecPolicyKey(String inboundWsSecPolicyKey) { this.inboundWsSecPolicyKey = inboundWsSecPolicyKey; } public OMElement serialize(OMElement parent) { OMElement callout = fac.createOMElement("callout", synNS); saveTracingState(callout, this); if (serviceURL != null) { callout.addAttribute(fac.createOMAttribute("serviceURL", nullNS, serviceURL)); } else if (endpointKey != null) { callout.addAttribute(fac.createOMAttribute("endpointKey", nullNS, endpointKey)); } if (action != null) { callout.addAttribute(fac.createOMAttribute("action", nullNS, action)); } if (clientRepository != null || axis2xml != null) { OMElement config = fac.createOMElement("configuration", synNS); if (clientRepository != null) { config.addAttribute(fac.createOMAttribute( "repository", nullNS, clientRepository)); } if (axis2xml != null) { config.addAttribute(fac.createOMAttribute( "axis2xml", nullNS, axis2xml)); } callout.addChild(config); } if (useServerConfig !=null) { callout.addAttribute(fac.createOMAttribute("useServerConfig", nullNS, useServerConfig)); } if(initAxis2ClientOptions != null) { callout.addAttribute(fac.createOMAttribute("initAxis2ClientOptions",nullNS,initAxis2ClientOptions)); } OMElement source = fac.createOMElement("source", synNS, callout); if(isUseEnvelopeAsSource()) { source.addAttribute(fac.createOMAttribute( "type", nullNS, "envelope")); } else if (requestXPath != null) { SynapseXPathSerializer.serializeXPath(requestXPath, source, "xpath"); } else if (requestKey != null) { source.addAttribute(fac.createOMAttribute( "key", nullNS, requestKey)); } OMElement target = fac.createOMElement("target", synNS, callout); if (targetXPath != null) { SynapseXPathSerializer.serializeXPath(targetXPath, target, "xpath"); } else if (targetKey != null) { target.addAttribute(fac.createOMAttribute( "key", nullNS, targetKey)); } if (isSecurityOn()) { OMElement security = fac.createOMElement("enableSec", synNS); if (getWsSecPolicyKey() != null) { security.addAttribute(fac.createOMAttribute( "policy", nullNS, getWsSecPolicyKey())); callout.addChild(security); } else if (getOutboundWsSecPolicyKey() != null || getInboundWsSecPolicyKey() != null) { if (getOutboundWsSecPolicyKey() != null) { security.addAttribute(fac.createOMAttribute( "outboundPolicy", nullNS, getOutboundWsSecPolicyKey())); } if (getInboundWsSecPolicyKey() != null) { security.addAttribute(fac.createOMAttribute( "inboundPolicy", nullNS, getInboundWsSecPolicyKey())); } callout.addChild(security); } } if (parent != null) { parent.addChild(callout); } return callout; } public void build(OMElement elem) { OMAttribute attServiceURL = elem.getAttribute(ATT_URL); OMAttribute attEndpoint = elem.getAttribute(ATT_ENDPOINT); OMAttribute attAction = elem.getAttribute(ATT_ACTION); OMAttribute attUseServerConfig = elem.getAttribute(ATT_USESERVERCONFIG); OMAttribute attInitAxis2ClientOptions = elem.getAttribute(ATT_INIT_AXIS2_CLIENT_OPTIONS); OMElement configElt = elem.getFirstChildWithName(Q_CONFIG); OMElement sourceElt = elem.getFirstChildWithName(Q_SOURCE); OMElement targetElt = elem.getFirstChildWithName(Q_TARGET); OMElement wsSec = elem.getFirstChildWithName(Q_SEC); if (attServiceURL != null) { serviceURL = attServiceURL.getAttributeValue(); } else if (attEndpoint != null) { endpointKey = attEndpoint.getAttributeValue(); } if (attAction != null) { action = attAction.getAttributeValue(); } if (attUseServerConfig != null) { useServerConfig = attUseServerConfig.getAttributeValue(); } if (attInitAxis2ClientOptions != null) { initAxis2ClientOptions = attInitAxis2ClientOptions.getAttributeValue(); } if (configElt != null) { OMAttribute axis2xmlAttr = configElt.getAttribute(ATT_AXIS2XML); OMAttribute repoAttr = configElt.getAttribute(ATT_REPOSITORY); if (axis2xmlAttr != null && axis2xmlAttr.getAttributeValue() != null) { axis2xml = axis2xmlAttr.getAttributeValue(); } if (repoAttr != null && repoAttr.getAttributeValue() != null) { clientRepository = repoAttr.getAttributeValue(); } } if (sourceElt != null) { OMAttribute sourceType = sourceElt.getAttribute(ATT_SOURCE_TYPE); if (sourceType != null && sourceType.getAttributeValue().equals("envelope")) { setUseEnvelopeAsSource(true); } else if (sourceElt.getAttribute(ATT_XPATH) != null) { setUseEnvelopeAsSource(false); try { requestXPath = SynapseXPathFactory.getSynapseXPath(sourceElt, ATT_XPATH); } catch (JaxenException e) { throw new MediatorException("Invalid source XPath : " + sourceElt.getAttributeValue(ATT_XPATH)); } } else if (sourceElt.getAttribute(ATT_KEY) != null) { setUseEnvelopeAsSource(false); requestKey = sourceElt.getAttributeValue(ATT_KEY); } else { throw new MediatorException("A 'xpath' or 'key' attribute " + "is required for the Callout 'source'"); } } else { throw new MediatorException("The message 'source' must be specified for a Callout mediator"); } if (targetElt != null) { if (targetElt.getAttribute(ATT_XPATH) != null) { try { targetXPath = SynapseXPathFactory.getSynapseXPath(targetElt, ATT_XPATH); } catch (JaxenException e) { throw new MediatorException("Invalid target XPath : " + targetElt.getAttributeValue(ATT_XPATH)); } } else if (targetElt.getAttribute(ATT_KEY) != null) { targetKey = targetElt.getAttributeValue(ATT_KEY); } else { throw new MediatorException("A 'xpath' or 'key' attribute " + "is required for the Callout 'target'"); } } else { throw new MediatorException("The message 'target' must be specified for a Callout mediator"); } if (wsSec != null) { setSecurityOn(true); OMAttribute policyKey = wsSec.getAttribute(ATT_POLICY); OMAttribute outboundPolicyKey = wsSec.getAttribute(ATT_OUTBOUND_SEC_POLICY); OMAttribute inboundPolicyKey = wsSec.getAttribute(ATT_INBOUND_SEC_POLICY); if (policyKey != null) { setWsSecPolicyKey(policyKey.getAttributeValue()); } else if (outboundPolicyKey != null || inboundPolicyKey != null){ if (outboundPolicyKey != null) { setOutboundWsSecPolicyKey(outboundPolicyKey.getAttributeValue()); } if (inboundPolicyKey != null) { setInboundWsSecPolicyKey(inboundPolicyKey.getAttributeValue()); } } else { setSecurityOn(false); throw new MediatorException("A policy key is required to enable security"); } } else { setSecurityOn(false); } } }