protected Endpoint createEndpoint()

in modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/ServiceDynamicLoadbalanceEndpointFactory.java [86:213]


    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
            OMXMLParserWrapper builder = null;
            try {
                builder = OMXMLBuilderFactory.createOMBuilder(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;
    }