You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by sa...@apache.org on 2012/01/13 12:24:51 UTC

svn commit: r1231009 - in /axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring: receivers/SpringAppContextAwareObjectSupplier.java util/ util/ApplicationContextUtil.java

Author: sagara
Date: Fri Jan 13 11:24:50 2012
New Revision: 1231009

URL: http://svn.apache.org/viewvc?rev=1231009&view=rev
Log:
Applied patch for AXIS2-5231 with few changes. 

Added:
    axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/util/
    axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/util/ApplicationContextUtil.java   (with props)
Modified:
    axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/receivers/SpringAppContextAwareObjectSupplier.java

Modified: axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/receivers/SpringAppContextAwareObjectSupplier.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/receivers/SpringAppContextAwareObjectSupplier.java?rev=1231009&r1=1231008&r2=1231009&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/receivers/SpringAppContextAwareObjectSupplier.java (original)
+++ axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/receivers/SpringAppContextAwareObjectSupplier.java Fri Jan 13 11:24:50 2012
@@ -23,41 +23,45 @@ import org.apache.axis2.AxisFault;
 import org.apache.axis2.ServiceObjectSupplier;
 import org.apache.axis2.description.AxisService;
 import org.apache.axis2.description.Parameter;
+import org.apache.axis2.extensions.spring.util.ApplicationContextUtil;
 import org.apache.axis2.i18n.Messages;
-import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.GenericApplicationContext;
 
 public class SpringAppContextAwareObjectSupplier implements ServiceObjectSupplier {
 
     public static final String SERVICE_SPRING_BEANNAME = "SpringBeanName";
 
     /**
-     * Method getServiceObject that is Spring aware via Spring interface ApplicationContextAware.
+     * Method getServiceObject used to get the spring beans from the spring application context
+     * for the given spring service
      *
-     * @param axisService
-     * @return Returns Object.
+     * @param axisService - spring service
+     * @return Object
      * @throws AxisFault
      */
-
     public Object getServiceObject(AxisService axisService) throws AxisFault {
         try {
+            // Get the Spring Context based on service, the context is set as parameter to the
+            // spring service in SpringServiceDeployer when service deployed.
+            GenericApplicationContext aCtx = ApplicationContextUtil.
+                    getSpringApplicationContext(axisService);
+
             // Name of spring aware bean to be injected, taken from services.xml
             // via 'SERVICE_SPRING_BEANNAME ' . The Bean and its properties are pre-configured
             // as normally done in a spring type of way and subsequently loaded by Spring.
             // Axis2 just assumes that the bean is configured and is in the classloader.
             Parameter implBeanParam = axisService.getParameter(SERVICE_SPRING_BEANNAME);
-            String beanName = ((String)implBeanParam.getValue()).trim();
-            if (beanName != null) {
-                // ApplicationContextHolder implements Spring interface ApplicationContextAware
-                ApplicationContext aCtx = ApplicationContextHolder.getContext();
+            if (implBeanParam != null) {
+                String beanName = ((String) implBeanParam.getValue()).trim();
                 if (aCtx == null) {
-                    throw new Exception("Axis2 Can't find Spring's ApplicationContext");
+                    throw new AxisFault("Axis2 Can't find Spring's ApplicationContext");
                 } else if (aCtx.getBean(beanName) == null) {
-                    throw new Exception("Axis2 Can't find Spring Bean: " + beanName);
+                    throw new AxisFault("Axis2 Can't find Spring Bean: " + beanName);
                 }
                 return aCtx.getBean(beanName);
             } else {
                 throw new AxisFault(
-                        Messages.getMessage("paramIsNotSpecified", "SERVICE_SPRING_BEANNAME"));
+                        Messages.getMessage("paramIsNotSpecified", SERVICE_SPRING_BEANNAME));
             }
         } catch (Exception e) {
             throw AxisFault.makeFault(e);

Added: axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/util/ApplicationContextUtil.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/util/ApplicationContextUtil.java?rev=1231009&view=auto
==============================================================================
--- axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/util/ApplicationContextUtil.java (added)
+++ axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/util/ApplicationContextUtil.java Fri Jan 13 11:24:50 2012
@@ -0,0 +1,129 @@
+/*
+ * 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
+ */
+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;
+    }
+}

Propchange: axis/axis2/java/core/trunk/modules/spring/src/org/apache/axis2/extensions/spring/util/ApplicationContextUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native