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.description.ModuleConfiguration;
import org.apache.axis2.description.ParameterInclude;
import org.apache.axis2.description.TransportInDescription;
import org.apache.axis2.description.TransportOutDescription;
import org.apache.axis2.engine.AbstractDispatcher;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.engine.AxisConfigurationImpl;
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.PhaseMetadata;
import org.apache.axis2.storage.AxisStorage;
import org.apache.axis2.transport.TransportListener;
import org.apache.axis2.transport.TransportSender;

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;

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

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

            //processing Paramters
            //Processing service level paramters
            Iterator itr = config_element.getChildrenWithName(
                    new QName(PARAMETERST));
            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));
                ((AxisConfigurationImpl)axisConfiguration).addMessageReceiver(
                        mepAtt.getValue(),msgrecivere);
            }

            //processing Dispatching Order
            OMElement dispatch_order = config_element.getFirstChildWithName(
                    new QName(DIPSTCH_ORDER));
            if(dispatch_order !=null){
                processDispatchingOrder(dispatch_order);
                log.info("found the custom disptaching order and continue with that order");
            } else {
               ((AxisConfigurationImpl)axisConfiguration).setDefaultDispatchers();
                log.info("no custom diaptching order found continue with default dispatcing order");
            }


            //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);

            //processing Axis Storages
            OMElement storages = config_element.getFirstChildWithName(new QName(AXIS_STORAGE)) ;
            processAxisStorage(storages);

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


        } catch (XMLStreamException e) {
            throw new DeploymentException(e);
        }
    }


    private void processDispatchingOrder(OMElement dispatch_order) throws DeploymentException {
        Iterator dispatchers = dispatch_order.getChildrenWithName(new QName(DIPSTCHER));
        boolean foundDiaptcher= false;
        Phase dispatchPhae = new Phase(PhaseMetadata.PHASE_DISPATCH);
        int count =0;
        while (dispatchers.hasNext()) {
            foundDiaptcher = true;
            OMElement dispchter = (OMElement) dispatchers.next();
            String clssName = dispchter.getAttribute(new QName(CLASSNAME)).getValue();
            AbstractDispatcher disptachClas;
            Class classInstance;
            try {
                classInstance = Class.forName(
                        clssName,true,Thread.currentThread().getContextClassLoader());
                disptachClas =(AbstractDispatcher)classInstance.newInstance();
                disptachClas.initDispatcher();
                disptachClas.getHandlerDesc().setParent(axisConfiguration);
                dispatchPhae.addHandler(disptachClas, count);
                count ++;
            } catch (ClassNotFoundException e) {
                throw new DeploymentException(e);
            } catch (IllegalAccessException e) {
                throw new DeploymentException(e);
            } catch (InstantiationException e) {
                throw new DeploymentException(e);
            }
        }

        if(!foundDiaptcher){
            throw new DeploymentException("No dispatcher found , can  not continue ....");
        else {
            ((AxisConfigurationImpl)axisConfiguration).setDispatchPhase(dispatchPhae);
        }

    }

    private void processAxisStorage(OMElement storageElement) throws DeploymentException {
        AxisStorage axisStorage;
        if(storageElement !=null){
            OMAttribute className =  storageElement.getAttribute(new QName(CLASSNAME));
            if(className== null){
                throw new DeploymentException("Invalid Storage Class defintion , class name missing");
            else {
                String classNameStr =className.getValue();
                Class stoarge ;
                if (classNameStr != null &&!"".equals(classNameStr)) {
                    try {
                        stoarge = Class.forName(classNameStr,true,
                                Thread.currentThread().getContextClassLoader());
                        axisStorage = (AxisStorage) stoarge.newInstance();
                        axisConfiguration.setAxisStorage(axisStorage);

                        // adding storage paramters
                        Iterator paramters = storageElement.getChildrenWithName(
                                new QName(PARAMETERST));
                        processParameters(paramters,axisStorage,axisConfiguration);


                    } catch (ClassNotFoundException e) {
                        throw new DeploymentException
                                ("ClassNotFoundException in Axis Storage processing " + e);
                    } catch (InstantiationException e) {
                        throw new DeploymentException
                                ("InstantiationException in Axis Storage processing " + e);
                    } catch (IllegalAccessException e) {
                        throw new DeploymentException
                                ("IllegalAccessException in Axis Storage processing " + e);
                    }
                } else {
                    throw new DeploymentException("Invalid Storage Class defintion , class name missing");
                }

            }

        }   else {
            try {
                //Default Storeg :  org.apache.axis2.storage.impl.AxisMemoryStorage
                Class stoarge = Class.forName("org.apache.axis2.storage.impl.AxisMemoryStorage",true,
                        Thread.currentThread().getContextClassLoader());
                axisStorage = (AxisStorage) stoarge.newInstance();
                axisConfiguration.setAxisStorage(axisStorage);
            }catch (ClassNotFoundException e) {
                throw new DeploymentException
                        ("ClassNotFoundException in Axis Storage processing " + e);
            } catch (InstantiationException e) {
                throw new DeploymentException
                        ("InstantiationException in Axis Storage processing " + e);
            } catch (IllegalAccessException e) {
                throw new DeploymentException
                        ("IllegalAccessException in Axis Storage processing " + e);
            }
        }

    }

    /**
     * To process all the phase orders which are defined in axis2.xml
     * @param phaserders
     */
    private void processPhaseOrders(Iterator phaserders){
        PhasesInfo info = engine.getPhasesinfo();
        while (phaserders.hasNext()) {
            OMElement phaseOrders = (OMElement) phaserders.next();
            String flowType = phaseOrders.getAttribute(new QName(TYPE)).getValue();
            if(INFLOWST.equals(flowType)){
                info.setINPhases(getPhaseList(phaseOrders));
            }   else if (IN_FAILTFLOW.equals(flowType)){
                info.setIN_FaultPhases(getPhaseList(phaseOrders));
            }   else if (OUTFLOWST.equals(flowType)){
                info.setOUTPhases(getPhaseList(phaseOrders));
            }   else if (OUT_FAILTFLOW.equals(flowType)){
                info.setOUT_FaultPhases(getPhaseList(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)).getValue());
        }
        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.getValue();
                transportout = new TransportOutDescription(new QName(name));

                //tranport impl class
                OMAttribute trsClas = transport.getAttribute(
                        new QName(CLASSNAME));
                if(trsClas == null){
                    throw new DeploymentException("TransportSEnder Implementation class is required " +
                            "for the transport" + name);
                }
                String clasName = trsClas.getValue();
                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(PARAMETERST));
                    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.getValue();
                transportIN = new TransportInDescription(new QName(name));

                //tranport impl class
                OMAttribute trsClas = transport.getAttribute(new QName(CLASSNAME));
                if(trsClas !=null) {
                    try {
                        String clasName = trsClas.getValue();
                        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(PARAMETERST));
                    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);
                }

            }
        }
    }

    /**
     * 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.getValue();
            } else {
                throw new DeploymentException("Observer Implementation Class is requird");
            }
            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(PARAMETERST));
                processParameters(itr,observer,axisConfiguration);

                // initilization
                observer.init();
                ((AxisConfigurationImpl)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.getValue();
            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("Invalid module configuration");
            } else {
                String module = moduleName_att.getValue();
                ModuleConfiguration moduleConfiguration =
                        new ModuleConfiguration(new QName(module),parent);
                Iterator paramters=  moduleConfig.getChildrenWithName(new QName(PARAMETERST));
                processParameters(paramters,moduleConfiguration,parent);
                ((AxisConfigurationImpl)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.