/*
* 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.config.xml;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.synapse.Mediator;
import org.apache.synapse.config.xml.endpoints.EndpointFactory;
import org.apache.synapse.endpoints.Endpoint;
import org.apache.synapse.mediators.builtin.CalloutMediator;
import org.jaxen.JaxenException;
import javax.xml.namespace.QName;
import java.io.File;
import java.util.Properties;
/**
* Factory for {@link CalloutMediator} instances.
*
* <pre>
* <callout serviceURL="string" | endpointKey="string" [action="string"]>
* <configuration [axis2xml="string"] [repository="string"]/>?
* <endpoint/>?
* <source xpath="expression" | key="string" | type="envelope">?
* <target xpath="expression" | key="string"/>?
* <enableSec policy="string" | outboundPolicy="String" | inboundPolicy="String" />?
* </callout>
* </pre>
*/
public class CalloutMediatorFactory extends AbstractMediatorFactory {
private static final QName TAG_NAME
= new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "callout");
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_USESERVERCONFIG = new QName("useServerConfig");
private static final QName ATT_REPOSITORY = new QName("repository");
private static final QName ATT_INIT_AXI2_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 static final QName Q_ENDPOINT = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "endpoint");
public Mediator createSpecificMediator(OMElement elem, Properties properties) {
CalloutMediator callout = new CalloutMediator();
processAuditStatus(callout, 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 initAxis2ClientOptions = elem.getAttribute(ATT_INIT_AXI2_CLIENT_OPTIONS);
OMElement configElt = elem.getFirstChildWithName(Q_CONFIG);
OMElement epElement = elem.getFirstChildWithName(Q_ENDPOINT);
OMElement sourceElt = elem.getFirstChildWithName(Q_SOURCE);
OMElement targetElt = elem.getFirstChildWithName(Q_TARGET);
OMElement wsSec = elem.getFirstChildWithName(Q_SEC);
if (attServiceURL != null) {
callout.setServiceURL(attServiceURL.getAttributeValue());
} else if (attEndpoint != null) {
callout.setEndpointKey(attEndpoint.getAttributeValue());
}
if (epElement != null) {
Endpoint endpoint = EndpointFactory.getEndpointFromElement(epElement, true, properties);
if (endpoint != null) {
callout.setEndpoint(endpoint);
}
}
if (attAction != null) {
callout.setAction(attAction.getAttributeValue());
}
if (attUseServerConfig != null) {
callout.setUseServerConfig(attUseServerConfig.getAttributeValue());
}
if (initAxis2ClientOptions != null) {
if("true".equals(initAxis2ClientOptions.getAttributeValue().toLowerCase())){
callout.setInitClientOptions(true);
} else if ("false".equals(initAxis2ClientOptions.getAttributeValue().toLowerCase())){
callout.setInitClientOptions(false);
} else {
handleException("The 'initAxis2ClientOptions' attribute only accepts a boolean value.");
}
}
if (configElt != null) {
OMAttribute axis2xmlAttr = configElt.getAttribute(ATT_AXIS2XML);
OMAttribute repoAttr = configElt.getAttribute(ATT_REPOSITORY);
if (axis2xmlAttr != null && axis2xmlAttr.getAttributeValue() != null) {
File axis2xml = new File(axis2xmlAttr.getAttributeValue());
if (axis2xml.exists() && axis2xml.isFile()) {
callout.setAxis2xml(axis2xmlAttr.getAttributeValue());
} else {
handleException("Invalid axis2.xml path: " + axis2xmlAttr.getAttributeValue());
}
}
if (repoAttr != null && repoAttr.getAttributeValue() != null) {
File repo = new File(repoAttr.getAttributeValue());
if (repo.exists() && repo.isDirectory()) {
callout.setClientRepository(repoAttr.getAttributeValue());
} else {
handleException("Invalid repository path: " + repoAttr.getAttributeValue());
}
}
}
if (sourceElt != null) {
OMAttribute sourceType = sourceElt.getAttribute(ATT_SOURCE_TYPE);
if (sourceType != null && sourceType.getAttributeValue().equals("envelope")) {
callout.setUseEnvelopeAsSource(true);
} else if (sourceElt.getAttribute(ATT_XPATH) != null) {
try {
callout.setRequestXPath(
SynapseXPathFactory.getSynapseXPath(sourceElt, ATT_XPATH));
} catch (JaxenException e) {
handleException("Invalid source XPath : "
+ sourceElt.getAttributeValue(ATT_XPATH));
}
} else if (sourceElt.getAttribute(ATT_KEY) != null) {
callout.setRequestKey(sourceElt.getAttributeValue(ATT_KEY));
} else {
handleException("A 'xpath' or 'key' attribute " +
"is required for the Callout 'source'");
}
} else {
callout.setUseEnvelopeAsSource(true);
}
if (targetElt != null) {
if (targetElt.getAttribute(ATT_XPATH) != null) {
try {
callout.setTargetXPath(
SynapseXPathFactory.getSynapseXPath(targetElt, ATT_XPATH));
} catch (JaxenException e) {
handleException("Invalid target XPath : "
+ targetElt.getAttributeValue(ATT_XPATH));
}
} else if (targetElt.getAttribute(ATT_KEY) != null) {
callout.setTargetKey(targetElt.getAttributeValue(ATT_KEY));
} else {
handleException("A 'xpath' or 'key' attribute " +
"is required for the Callout 'target'");
}
}
if (wsSec != null) {
callout.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) {
callout.setWsSecPolicyKey(policyKey.getAttributeValue());
} else if (outboundPolicyKey != null || inboundPolicyKey != null){
if (outboundPolicyKey != null) {
callout.setOutboundWsSecPolicyKey(outboundPolicyKey.getAttributeValue());
}
if (inboundPolicyKey != null) {
callout.setInboundWsSecPolicyKey(inboundPolicyKey.getAttributeValue());
}
} else {
callout.setSecurityOn(false);
handleException("A policy key is required to enable security");
}
}
return callout;
}
public QName getTagQName() {
return TAG_NAME;
}
}