Package org.apache.axis2.extensions.spring.util

Source Code of org.apache.axis2.extensions.spring.util.ApplicationContextUtil

/*
* 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.axis2.extensions.spring.util;

import org.apache.axis2.AxisFault;
import org.apache.axis2.deployment.DeploymentConstants;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisServiceGroup;
import org.apache.axis2.description.Parameter;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.InputStreamResource;

import java.io.File;
import java.io.InputStream;

/**
* Util class of the spring module. It contains a method which is used to get
* the spring application context for given spring web services.
*
* @since 1.7.0
*/
public class ApplicationContextUtil {
    public static final String SPRING_APPLICATION_CONTEXT = "SpringApplicationContext";
    public static final String SPRING_APPLICATION_CONTEXT_LOCATION = "SpringContextLocation";

    /**
     * Method to get the spring application context for a spring service. This
     * method will first check the META-INF(or meta-inf) directory for the
     * '<service-name>-application-context.xml file. If the file is not found
     * then it will check whether file path is set as a parameter in
     * service.xml. If the context file is set as a parameter for a service
     * group, then the context will be add to the group or else it will be add
     * to the service.
     *
     * @param axisService
     * @return GenericApplicationContext
     * @throws AxisFault
     */

    public static GenericApplicationContext getSpringApplicationContext(AxisService axisService)
            throws AxisFault {

        GenericApplicationContext appContext;
        Parameter appContextParameter = axisService.getParameter(SPRING_APPLICATION_CONTEXT);
        Parameter contextLocationParam = axisService
                .getParameter(SPRING_APPLICATION_CONTEXT_LOCATION);

        // return the application context
        if (appContextParameter != null) {
            appContext = (GenericApplicationContext) appContextParameter.getValue();
            // if the context is not found initialize a new one
        } else {
            appContext = new GenericApplicationContext();
            ClassLoader serviceCL = axisService.getClassLoader();
            appContext.setClassLoader(serviceCL);
            ClassLoader currentCL = Thread.currentThread().getContextClassLoader();

            try {
                Thread.currentThread().setContextClassLoader(serviceCL);
                XmlBeanDefinitionReader xbdr = new XmlBeanDefinitionReader(appContext);

                // load the bean context file from the parameter
                if (contextLocationParam != null) {
                    xbdr.loadBeanDefinitions(new ClassPathResource((String) contextLocationParam
                            .getValue()));
                    appContext.refresh();
                    AxisServiceGroup axisServiceGroup = axisService.getAxisServiceGroup();
                    Parameter springGroupCtxLocation = axisServiceGroup
                            .getParameter(SPRING_APPLICATION_CONTEXT_LOCATION);
                    // add the context to the service group or add it to the
                    // service
                    if (springGroupCtxLocation != null) {
                        axisServiceGroup.addParameter(new Parameter(SPRING_APPLICATION_CONTEXT,
                                appContext));
                    } else {
                        axisService.addParameter(new Parameter(SPRING_APPLICATION_CONTEXT,
                                appContext));
                    }
                    return appContext;
                }

                InputStream ctxFileInputStream = serviceCL
                        .getResourceAsStream(DeploymentConstants.META_INF + File.separator
                                + axisService.getName() + "-application-context.xml");
                // try for meta-inf
                if (ctxFileInputStream == null) {
                    ctxFileInputStream = serviceCL.getResourceAsStream(DeploymentConstants.META_INF
                            .toLowerCase()
                            + File.separator
                            + axisService.getName()
                            + "-application-context.xml");
                }
                // load the context file from meta-inf
                if (ctxFileInputStream != null) {
                    xbdr.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
                    xbdr.loadBeanDefinitions(new InputStreamResource(ctxFileInputStream));
                    appContext.refresh();
                    axisService.addParameter(new Parameter(SPRING_APPLICATION_CONTEXT, appContext));
                    return appContext;
                } else {
                    throw new AxisFault("Spring context file cannot be located for AxisService");
                }
            } catch (Exception e) {
                throw AxisFault.makeFault(e);
            } finally {
                // restore the class loader
                Thread.currentThread().setContextClassLoader(currentCL);
            }
        }
        return appContext;
    }
}
TOP

Related Classes of org.apache.axis2.extensions.spring.util.ApplicationContextUtil

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.