Search in sources :

Example 6 with SoapSessionDispatcher

use of org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher in project wso2-synapse by wso2.

the class ServiceDynamicLoadbalanceEndpointFactory method createEndpoint.

protected Endpoint createEndpoint(OMElement epConfig, boolean anonymousEndpoint, Properties properties) {
    OMElement loadbalanceElement = epConfig.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "serviceDynamicLoadbalance"));
    if (loadbalanceElement == null) {
        return null;
    }
    String configuration = loadbalanceElement.getAttributeValue(new QName(XMLConfigConstants.NULL_NAMESPACE, "configuration"));
    OMElement servicesEle;
    if (configuration != null) {
        if (configuration.startsWith("$system:")) {
            configuration = System.getProperty(configuration.substring("$system:".length()));
        }
        // Load the file
        StAXOMBuilder builder = null;
        try {
            builder = new StAXOMBuilder(new URL(configuration).openStream());
        } catch (Exception e) {
            handleException("Could not load ServiceDynamicLoadbalanceEndpoint configuration file " + configuration);
        }
        servicesEle = builder.getDocumentElement().getFirstChildWithName(SERVICES_QNAME);
    } else {
        OMElement lbConfigEle = loadbalanceElement.getFirstChildWithName(LB_CONFIG_QNAME);
        if (lbConfigEle == null) {
            throw new RuntimeException("loadBalancerConfig element not found as a child of " + "serviceDynamicLoadbalance element");
        }
        servicesEle = lbConfigEle.getFirstChildWithName(SERVICES_QNAME);
    }
    if (servicesEle == null) {
        throw new RuntimeException("services element not found in serviceDynamicLoadbalance configuration");
    }
    Map<String, String> hostDomainMap = new HashMap<String, String>();
    for (Iterator<OMElement> iter = servicesEle.getChildrenWithLocalName("service"); iter.hasNext(); ) {
        OMElement serviceEle = iter.next();
        OMElement hostsEle = serviceEle.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "hosts"));
        if (hostsEle == null) {
            throw new RuntimeException("hosts element not found as a child of service element");
        }
        List<String> hosts = new ArrayList<String>();
        for (Iterator<OMElement> hostIter = hostsEle.getChildrenWithLocalName("host"); hostIter.hasNext(); ) {
            OMElement hostEle = hostIter.next();
            String host = hostEle.getText();
            if (host.trim().length() == 0) {
                throw new RuntimeException("host cannot be null");
            }
            hosts.add(host);
        }
        OMElement domainEle = serviceEle.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "domain"));
        if (domainEle == null) {
            throw new RuntimeException("domain element not found in as a child of services");
        }
        String domain = domainEle.getText();
        if (domain.trim().length() == 0) {
            throw new RuntimeException("domain cannot be null");
        }
        for (String host : hosts) {
            if (hostDomainMap.containsKey(host)) {
                throw new RuntimeException("host " + host + " has been already defined for " + "clustering domain " + hostDomainMap.get(host));
            }
            hostDomainMap.put(host, domain);
        }
    }
    if (hostDomainMap.isEmpty()) {
        throw new RuntimeException("No service elements defined under services");
    }
    LoadbalanceAlgorithm algorithm = LoadbalanceAlgorithmFactory.createLoadbalanceAlgorithm(loadbalanceElement, null);
    ServiceDynamicLoadbalanceEndpoint loadbalanceEndpoint = new ServiceDynamicLoadbalanceEndpoint(hostDomainMap, algorithm);
    // set endpoint name
    OMAttribute name = epConfig.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE, "name"));
    if (name != null) {
        loadbalanceEndpoint.setName(name.getAttributeValue());
    }
    // get the session for this endpoint
    OMElement sessionElement = epConfig.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "session"));
    if (sessionElement != null) {
        OMElement sessionTimeout = sessionElement.getFirstChildWithName(new QName(SynapseConstants.SYNAPSE_NAMESPACE, "sessionTimeout"));
        if (sessionTimeout != null) {
            try {
                loadbalanceEndpoint.setSessionTimeout(Long.parseLong(sessionTimeout.getText().trim()));
            } catch (NumberFormatException nfe) {
                handleException("Invalid session timeout value : " + sessionTimeout.getText());
            }
        }
        String type = sessionElement.getAttributeValue(new QName("type"));
        if (type.equalsIgnoreCase("soap")) {
            Dispatcher soapDispatcher = new SoapSessionDispatcher();
            loadbalanceEndpoint.setDispatcher(soapDispatcher);
        } else if (type.equalsIgnoreCase("http")) {
            Dispatcher httpDispatcher = new HttpSessionDispatcher();
            loadbalanceEndpoint.setDispatcher(httpDispatcher);
        }
        loadbalanceEndpoint.setSessionAffinity(true);
    }
    loadbalanceEndpoint.setFailover(false);
    return loadbalanceEndpoint;
}
Also used : QName(javax.xml.namespace.QName) OMElement(org.apache.axiom.om.OMElement) SoapSessionDispatcher(org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher) Dispatcher(org.apache.synapse.endpoints.dispatch.Dispatcher) HttpSessionDispatcher(org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher) URL(java.net.URL) ServiceDynamicLoadbalanceEndpoint(org.apache.synapse.endpoints.ServiceDynamicLoadbalanceEndpoint) LoadbalanceAlgorithm(org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm) StAXOMBuilder(org.apache.axiom.om.impl.builder.StAXOMBuilder) OMAttribute(org.apache.axiom.om.OMAttribute) HttpSessionDispatcher(org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher) SoapSessionDispatcher(org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher)

Aggregations

OMElement (org.apache.axiom.om.OMElement)6 Dispatcher (org.apache.synapse.endpoints.dispatch.Dispatcher)6 HttpSessionDispatcher (org.apache.synapse.endpoints.dispatch.HttpSessionDispatcher)6 SoapSessionDispatcher (org.apache.synapse.endpoints.dispatch.SoapSessionDispatcher)6 SimpleClientSessionDispatcher (org.apache.synapse.endpoints.dispatch.SimpleClientSessionDispatcher)4 QName (javax.xml.namespace.QName)3 OMAttribute (org.apache.axiom.om.OMAttribute)3 LoadbalanceAlgorithm (org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm)3 Properties (java.util.Properties)2 LoadBalanceMembershipHandler (org.apache.synapse.core.LoadBalanceMembershipHandler)2 DynamicLoadbalanceEndpoint (org.apache.synapse.endpoints.DynamicLoadbalanceEndpoint)2 Endpoint (org.apache.synapse.endpoints.Endpoint)2 SALoadbalanceEndpoint (org.apache.synapse.endpoints.SALoadbalanceEndpoint)2 ServiceDynamicLoadbalanceEndpoint (org.apache.synapse.endpoints.ServiceDynamicLoadbalanceEndpoint)2 URL (java.net.URL)1 Iterator (java.util.Iterator)1 Map (java.util.Map)1 StAXOMBuilder (org.apache.axiom.om.impl.builder.StAXOMBuilder)1 SynapseException (org.apache.synapse.SynapseException)1