blob: 0927a21a57fff35048984d67e1ca52d1981f01f7 [file] [log] [blame]
/*
* 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;
}
}