/* * 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; } }