Package org.apache.axis2.deployment

Source Code of org.apache.axis2.deployment.AxisConfigBuilder

/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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.axis2.deployment;

import org.apache.axis2.AxisFault;
import org.apache.axis2.deployment.util.PhasesInfo;
import org.apache.axis2.deployment.util.Utils;
import org.apache.axis2.description.*;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.engine.AxisObserver;
import org.apache.axis2.engine.MessageReceiver;
import org.apache.axis2.engine.Phase;
import org.apache.axis2.i18n.Messages;
import org.apache.axis2.om.OMAttribute;
import org.apache.axis2.om.OMElement;
import org.apache.axis2.phaseresolver.PhaseException;
import org.apache.axis2.transport.TransportListener;
import org.apache.axis2.transport.TransportSender;
import org.apache.axis2.util.HostConfiguration;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

public class AxisConfigBuilder extends DescriptionBuilder {

    private AxisConfiguration axisConfiguration;
    private DeploymentEngine engine;

    public AxisConfigBuilder(InputStream serviceInputSteram, DeploymentEngine engine,
                             AxisConfiguration axisConfiguration) {
        super(serviceInputSteram, axisConfiguration);
        this.axisConfiguration = axisConfiguration;
        this.engine = engine;
    }

    public void populateConfig() throws DeploymentException {
        try {
            OMElement config_element = buildOM();

            //processing Paramters
            //Processing service level paramters
            Iterator itr = config_element.getChildrenWithName(
                    new QName(PARAMETER));
            processParameters(itr, axisConfiguration, axisConfiguration);

            //process MessageReciver

            Iterator msgRecives = config_element.getChildrenWithName(new QName(MESSAGERECEIVER));
            while (msgRecives.hasNext()) {
                OMElement msgRev = (OMElement) msgRecives.next();
                MessageReceiver msgrecivere = loadMessageReceiver(
                        Thread.currentThread().getContextClassLoader(), msgRev);
                OMAttribute mepAtt = msgRev.getAttribute(new QName(MEP));
                axisConfiguration.addMessageReceiver(
                        mepAtt.getAttributeValue(), msgrecivere);
            }

            //Process Module refs
            Iterator moduleitr = config_element.getChildrenWithName(
                    new QName(DeploymentConstants.MODULEST));
            processModuleRefs(moduleitr);

            // Proccessing Transport Sennders
            Iterator trs_senders = config_element.getChildrenWithName(new QName(TRANSPORTSENDER));
            processTransportSenders(trs_senders);

            // Proccessing Transport Recivers
            Iterator trs_Reivers = config_element.getChildrenWithName(new QName(TRANSPORTRECEIVER));
            processTransportReceivers(trs_Reivers);

            // Process Observers
            Iterator obs_ittr = config_element.getChildrenWithName(new QName(LISTENERST));
            processObservers(obs_ittr);

            //processing Phase orders
            Iterator phaserders = config_element.getChildrenWithName(new QName(PHASE_ORDER));
            processPhaseOrders(phaserders);

            Iterator moduleConfigs = config_element.getChildrenWithName(new QName(MODULECONFIG));
            processModuleConfig(moduleConfigs, axisConfiguration, axisConfiguration);

            // setting host configuration
            OMElement hostElement = config_element.getFirstChildWithName(new QName(HOST_CONFIG));
            if (hostElement != null) {
                processHostCongiguration(hostElement, axisConfiguration);
            }
        } catch (XMLStreamException e) {
            throw new DeploymentException(e);
        }
    }

    /**
     * To process all the phase orders which are defined in axis2.xml
     *
     * @param phaserders
     */
    private void processPhaseOrders(Iterator phaserders) throws DeploymentException {
        PhasesInfo info = engine.getPhasesinfo();
        while (phaserders.hasNext()) {
            OMElement phaseOrders = (OMElement) phaserders.next();
            String flowType = phaseOrders.getAttribute(new QName(TYPE)).getAttributeValue();
            if (INFLOWST.equals(flowType)) {
                info.setINPhases(processPhaseList(phaseOrders));
            } else if (IN_FAILTFLOW.equals(flowType)) {
                info.setIN_FaultPhases(processPhaseList(phaseOrders));
            } else if (OUTFLOWST.equals(flowType)) {
                info.setOUTPhases(processPhaseList(phaseOrders));
            } else if (OUT_FAILTFLOW.equals(flowType)) {
                info.setOUT_FaultPhases(processPhaseList(phaseOrders));
            }

        }
    }


    private ArrayList getPhaseList(OMElement phaseOrders) {
        ArrayList phaselist = new ArrayList();
        Iterator phases = phaseOrders.getChildrenWithName(new QName(PHASE));
        while (phases.hasNext()) {
            OMElement phase = (OMElement) phases.next();
            phaselist.add(phase.getAttribute(new QName(ATTNAME)).getAttributeValue());
        }
        return phaselist;
    }

    private ArrayList processPhaseList(OMElement phaseOrders) throws DeploymentException {
        ArrayList phaselist = new ArrayList();
        Iterator phases = phaseOrders.getChildrenWithName(new QName(PHASE));
        while (phases.hasNext()) {
            OMElement phaseelement = (OMElement) phases.next();
            String phaseName = phaseelement.getAttribute(new QName(ATTNAME)).getAttributeValue();
            Phase phase = new Phase(phaseName);
            Iterator handlers = phaseelement.getChildrenWithName(new QName(HANDERST));
            while (handlers.hasNext()) {
                OMElement omElement = (OMElement) handlers.next();
                HandlerDescription handler = processHandler(omElement, axisConfiguration);
                handler.getRules().setPhaseName(phaseName);
                Utils.loadHandler(axisConfiguration.getSystemClassLoader(), handler);
                try {
                    phase.addHandler(handler);
                } catch (PhaseException e) {
                    throw new DeploymentException(e);
                }
            }
            phaselist.add(phase);
        }
        return phaselist;
    }


    private void processTransportSenders(Iterator trs_senders) throws DeploymentException {
        while (trs_senders.hasNext()) {
            TransportOutDescription transportout;
            OMElement transport = (OMElement) trs_senders.next();

            // getting trsnport Name
            OMAttribute trsName = transport.getAttribute(
                    new QName(ATTNAME));
            if (trsName != null) {
                String name = trsName.getAttributeValue();
                transportout = new TransportOutDescription(new QName(name));

                //tranport impl class
                OMAttribute trsClas = transport.getAttribute(
                        new QName(CLASSNAME));
                if (trsClas == null) {
                    throw new DeploymentException(Messages.getMessage(
                            DeploymentErrorMsgs.TRANSPORT_SENDER_ERROR, name));
                }
                String clasName = trsClas.getAttributeValue();
                Class sender;
                try {
                    sender = Class.forName(clasName, true,
                            Thread.currentThread()
                                    .getContextClassLoader());
                    TransportSender transportSender = (TransportSender) sender.newInstance();
                    transportout.setSender(transportSender);

                    //process Parameters
                    //processing Paramters
                    //Processing service level paramters
                    Iterator itr = transport.getChildrenWithName(
                            new QName(PARAMETER));
                    processParameters(itr, transportout, axisConfiguration);

                    //process INFLOW
                    OMElement inFlow = transport.getFirstChildWithName(
                            new QName(INFLOWST));
                    if (inFlow != null) {
                        throw new DeploymentException(
                                Messages.getMessage(
                                        DeploymentErrorMsgs.INFLOW_NOT_ALLOWED_IN_TRS_OUT, name));
                    }

                    OMElement outFlow = transport.getFirstChildWithName(
                            new QName(OUTFLOWST));
                    if (outFlow != null) {
                        transportout.setOutFlow(processFlow(outFlow, axisConfiguration));
                    }

                    OMElement inFaultFlow = transport.getFirstChildWithName(
                            new QName(IN_FAILTFLOW));
                    if (inFaultFlow != null) {
                        throw new DeploymentException(
                                Messages.getMessage(
                                        DeploymentErrorMsgs.INFLOW_NOT_ALLOWED_IN_TRS_OUT, name));
                    }

                    OMElement outFaultFlow = transport.getFirstChildWithName(
                            new QName(OUT_FAILTFLOW));
                    if (outFaultFlow != null) {
                        transportout.setFaultFlow(processFlow(outFaultFlow, axisConfiguration));
                    }

                    //adding to axis config
                    axisConfiguration.addTransportOut(transportout);

                } catch (ClassNotFoundException e) {
                    throw new DeploymentException(e);
                } catch (IllegalAccessException e) {
                    throw new DeploymentException(e);
                } catch (InstantiationException e) {
                    throw new DeploymentException(e);
                } catch (AxisFault axisFault) {
                    throw new DeploymentException(axisFault);
                }

            }
        }
    }


    private void processTransportReceivers(Iterator trs_senders) throws DeploymentException {
        while (trs_senders.hasNext()) {
            TransportInDescription transportIN;
            OMElement transport = (OMElement) trs_senders.next();

            // getting trsnport Name
            OMAttribute trsName = transport.getAttribute(
                    new QName(ATTNAME));
            if (trsName != null) {
                String name = trsName.getAttributeValue();
                transportIN = new TransportInDescription(new QName(name));

                //tranport impl class
                OMAttribute trsClas = transport.getAttribute(new QName(CLASSNAME));
                if (trsClas != null) {
                    try {
                        String clasName = trsClas.getAttributeValue();
                        Class receiverClass = Class.forName(clasName, true,
                                Thread.currentThread()
                                        .getContextClassLoader());
                        TransportListener receiver = (TransportListener) receiverClass.newInstance();
                        transportIN.setReceiver(receiver);
                    } catch (ClassNotFoundException e) {
                        throw new DeploymentException(e);
                    } catch (IllegalAccessException e) {
                        throw new DeploymentException(e);
                    } catch (InstantiationException e) {
                        throw new DeploymentException(e);
                    }
                }
                try {

                    //process Parameters
                    //processing Paramters
                    //Processing service level paramters
                    Iterator itr = transport.getChildrenWithName(
                            new QName(PARAMETER));
                    processParameters(itr, transportIN, axisConfiguration);

                    //process INFLOW
                    OMElement inFlow = transport.getFirstChildWithName(
                            new QName(INFLOWST));
                    if (inFlow != null) {
                        throw new DeploymentException(
                                Messages.getMessage(
                                        DeploymentErrorMsgs.INFLOW_NOT_ALLOWED_IN_TRS_OUT, name));
                    }

                    OMElement outFlow = transport.getFirstChildWithName(
                            new QName(OUTFLOWST));
                    if (outFlow != null) {
                        transportIN.setInFlow(processFlow(outFlow, axisConfiguration));
                    }

                    OMElement inFaultFlow = transport.getFirstChildWithName(
                            new QName(IN_FAILTFLOW));
                    if (inFaultFlow != null) {
                        transportIN.setFaultFlow(processFlow(inFaultFlow, axisConfiguration));
                    }

                    OMElement outFaultFlow = transport.getFirstChildWithName(
                            new QName(OUT_FAILTFLOW));
                    if (outFaultFlow != null) {
                        throw new DeploymentException(Messages.getMessage(
                                DeploymentErrorMsgs.OUTFLOW_NOT_ALLOWED_IN_TRS_IN, name));
                    }

                    //adding to axis config
                    axisConfiguration.addTransportIn(transportIN);

                } catch (AxisFault axisFault) {
                    throw new DeploymentException(axisFault);
                }

            }
        }
    }


    private void processHostCongiguration(OMElement element, AxisConfiguration config) {
        OMElement ipele = element.getFirstChildWithName(new QName("ip"));
        String ip = null;
        int port = -1;
        if (ipele != null) {
            ip = ipele.getText().trim();
        }
        OMElement portele = element.getFirstChildWithName(new QName("port"));
        if (portele != null) {
            port = Integer.parseInt(portele.getText().trim());
        }
        HostConfiguration hostconfig = new HostConfiguration(ip, port);
        config.setHostConfiguration(hostconfig);
    }

    /**
     * To process AxisObservers
     *
     * @param oservers
     */
    private void processObservers(Iterator oservers) throws DeploymentException {
        while (oservers.hasNext()) {
            OMElement observerelement = (OMElement) oservers.next();
            AxisObserver observer;
            OMAttribute trsClas = observerelement.getAttribute(
                    new QName(CLASSNAME));
            String clasName;
            if (trsClas != null) {
                clasName = trsClas.getAttributeValue();
            } else {
                throw new DeploymentException(Messages.getMessage(
                        DeploymentErrorMsgs.OBSERVER_ERROR));
            }
            try {
                Class observerclass = Class.forName(clasName, true, Thread.currentThread().
                        getContextClassLoader());
                observer = (AxisObserver) observerclass.newInstance();
                //processing Paramters
                //Processing service level paramters
                Iterator itr = observerelement.getChildrenWithName(
                        new QName(PARAMETER));
                processParameters(itr, observer, axisConfiguration);

                // initilization
                observer.init();
                axisConfiguration.addObservers(observer);

            } catch (ClassNotFoundException e) {
                throw new DeploymentException(e);
            } catch (IllegalAccessException e) {
                throw new DeploymentException(e);
            } catch (InstantiationException e) {
                throw new DeploymentException(e);
            }
        }

    }

    /**
     * To get the list og modules that is requird to be engage globally
     *
     * @param moduleRefs <code>java.util.Iterator</code>
     */
    protected void processModuleRefs(Iterator moduleRefs) {
        while (moduleRefs.hasNext()) {
            OMElement moduleref = (OMElement) moduleRefs.next();
            OMAttribute moduleRefAttribute = moduleref.getAttribute(
                    new QName(REF));
            String refName = moduleRefAttribute.getAttributeValue();
            engine.addModule(new QName(refName));
        }
    }

    protected void processModuleConfig(Iterator moduleConfigs,
                                       ParameterInclude parent, AxisConfiguration config)
            throws DeploymentException {
        while (moduleConfigs.hasNext()) {
            OMElement moduleConfig = (OMElement) moduleConfigs.next();
            OMAttribute moduleName_att = moduleConfig.getAttribute(
                    new QName(ATTNAME));
            if (moduleName_att == null) {
                throw new DeploymentException(Messages.getMessage(DeploymentErrorMsgs.INVALID_MODULE_CONFIG));
            } else {
                String module = moduleName_att.getAttributeValue();
                ModuleConfiguration moduleConfiguration =
                        new ModuleConfiguration(new QName(module), parent);
                Iterator paramters = moduleConfig.getChildrenWithName(new QName(PARAMETER));
                processParameters(paramters, moduleConfiguration, parent);
                config.addModuleConfig(moduleConfiguration);
            }
        }
    }

}
TOP

Related Classes of org.apache.axis2.deployment.AxisConfigBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.