You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by re...@apache.org on 2007/06/21 15:25:29 UTC
svn commit: r549470 - in
/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader:
LockableApplicationContext.java SpringReloader.java
Author: reinhard
Date: Thu Jun 21 06:25:28 2007
New Revision: 549470
URL: http://svn.apache.org/viewvc?view=rev&rev=549470
Log:
- implementation of a synchronized application context (LockableApplicationContext)
which wraps a ConfigurableWebApplicationContext and which can be reloaded
- the SpringReloader calls the reload() method of the LockableApplicationContext
now instead of implementing the reloading sequence itself
Added:
cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java (with props)
Modified:
cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/SpringReloader.java
Added: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java?view=auto&rev=549470
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java (added)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java Thu Jun 21 06:25:28 2007
@@ -0,0 +1,269 @@
+/*
+ * 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.cocoon.tools.rcl.springreloader;
+
+import java.io.IOException;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+
+import org.springframework.beans.BeanInstantiationException;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.MessageSourceResolvable;
+import org.springframework.context.NoSuchMessageException;
+import org.springframework.core.io.Resource;
+import org.springframework.web.context.ConfigurableWebApplicationContext;
+import org.springframework.web.context.support.XmlWebApplicationContext;
+
+/**
+ * This implementation of a {@link ConfigurableWebApplicationContext} is completly synchronized. It wraps
+ * all calls and delegates them to an internally managed ConfigurableWebApplicationContext instance.
+ *
+ * Additionally it provides a {@link #reload()} method which exchanges the interal application context with a
+ * newly created one.
+ *
+ * @version $Id$
+ */
+public class LockableApplicationContext implements ConfigurableWebApplicationContext {
+
+ private ConfigurableWebApplicationContext appContext;
+
+ public LockableApplicationContext() throws BeansException {
+ try {
+ appContext = (ConfigurableWebApplicationContext)
+ BeanUtils.instantiateClass(XmlWebApplicationContext.class);
+ } catch (BeanInstantiationException e) {
+ throw new RuntimeException("Can't create Spring application context.", e);
+ }
+ }
+
+ public synchronized void reload() {
+ ConfigurableWebApplicationContext newAppContext = null;
+ try {
+ newAppContext = (ConfigurableWebApplicationContext)
+ BeanUtils.instantiateClass(XmlWebApplicationContext.class);
+ } catch (BeanInstantiationException e) {
+ throw new RuntimeException("Can't create Spring application context.", e);
+ }
+ newAppContext.setParent(appContext.getParent());
+ newAppContext.setServletContext(appContext.getServletContext());
+ appContext.close();
+ appContext = newAppContext;
+ appContext.refresh();
+ }
+
+ public synchronized boolean containsBean(String arg0) {
+ return appContext.containsBean(arg0);
+ }
+
+ public synchronized boolean containsBeanDefinition(String arg0) {
+ return appContext.containsBeanDefinition(arg0);
+ }
+
+ public synchronized boolean containsLocalBean(String arg0) {
+ return appContext.containsLocalBean(arg0);
+ }
+
+ public synchronized String[] getAliases(String arg0) {
+ return appContext.getAliases(arg0);
+ }
+
+ public synchronized AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException {
+ return appContext.getAutowireCapableBeanFactory();
+ }
+
+ public synchronized Object getBean(String arg0, Class arg1) throws BeansException {
+ return appContext.getBean(arg0, arg1);
+ }
+
+ public synchronized Object getBean(String arg0) throws BeansException {
+ return appContext.getBean(arg0);
+ }
+
+ public synchronized int getBeanDefinitionCount() {
+ return appContext.getBeanDefinitionCount();
+ }
+
+ public synchronized String[] getBeanDefinitionNames() {
+ return appContext.getBeanDefinitionNames();
+ }
+
+ public synchronized String[] getBeanNamesForType(Class arg0, boolean arg1, boolean arg2) {
+ return appContext.getBeanNamesForType(arg0, arg1, arg2);
+ }
+
+ public synchronized String[] getBeanNamesForType(Class arg0) {
+ return appContext.getBeanNamesForType(arg0);
+ }
+
+ public synchronized Map getBeansOfType(Class arg0, boolean arg1, boolean arg2) throws BeansException {
+ return appContext.getBeansOfType(arg0, arg1, arg2);
+ }
+
+ public synchronized Map getBeansOfType(Class arg0) throws BeansException {
+ return appContext.getBeansOfType(arg0);
+ }
+
+ public synchronized ClassLoader getClassLoader() {
+ return appContext.getClassLoader();
+ }
+
+ public synchronized String getDisplayName() {
+ return appContext.getDisplayName();
+ }
+
+ public synchronized String getMessage(MessageSourceResolvable arg0, Locale arg1) throws NoSuchMessageException {
+ return appContext.getMessage(arg0, arg1);
+ }
+
+ public synchronized String getMessage(String arg0, Object[] arg1, Locale arg2) throws NoSuchMessageException {
+ return appContext.getMessage(arg0, arg1, arg2);
+ }
+
+ public synchronized String getMessage(String arg0, Object[] arg1, String arg2, Locale arg3) {
+ return appContext.getMessage(arg0, arg1, arg2, arg3);
+ }
+
+ public synchronized ApplicationContext getParent() {
+ return appContext.getParent();
+ }
+
+ public synchronized BeanFactory getParentBeanFactory() {
+ return appContext.getParentBeanFactory();
+ }
+
+ public synchronized Resource getResource(String arg0) {
+ return appContext.getResource(arg0);
+ }
+
+ public synchronized Resource[] getResources(String arg0) throws IOException {
+ return appContext.getResources(arg0);
+ }
+
+ public synchronized long getStartupDate() {
+ return appContext.getStartupDate();
+ }
+
+ public synchronized Class getType(String arg0) throws NoSuchBeanDefinitionException {
+ return appContext.getType(arg0);
+ }
+
+ public synchronized boolean isPrototype(String arg0) throws NoSuchBeanDefinitionException {
+ return appContext.isPrototype(arg0);
+ }
+
+ public synchronized boolean isSingleton(String arg0) throws NoSuchBeanDefinitionException {
+ return appContext.isSingleton(arg0);
+ }
+
+ public synchronized boolean isTypeMatch(String arg0, Class arg1) throws NoSuchBeanDefinitionException {
+ return appContext.isTypeMatch(arg0, arg1);
+ }
+
+ public synchronized void publishEvent(ApplicationEvent arg0) {
+ appContext.publishEvent(arg0);
+ }
+
+ public synchronized ServletContext getServletContext() {
+ return appContext.getServletContext();
+ }
+
+ public synchronized String[] getConfigLocations() {
+ return appContext.getConfigLocations();
+ }
+
+ public synchronized String getNamespace() {
+ return appContext.getNamespace();
+ }
+
+ public synchronized ServletConfig getServletConfig() {
+ return appContext.getServletConfig();
+ }
+
+ public synchronized void setConfigLocations(String[] arg0) {
+ appContext.setConfigLocations(arg0);
+
+ }
+
+ public synchronized void setNamespace(String arg0) {
+ appContext.setNamespace(arg0);
+ }
+
+ public synchronized void setServletConfig(ServletConfig arg0) {
+ appContext.setServletConfig(arg0);
+ }
+
+ public synchronized void setServletContext(ServletContext arg0) {
+ appContext.setServletContext(arg0);
+
+ }
+
+ public synchronized void addApplicationListener(ApplicationListener arg0) {
+ appContext.addApplicationListener(arg0);
+ }
+
+ public synchronized void addBeanFactoryPostProcessor(BeanFactoryPostProcessor arg0) {
+ appContext.addBeanFactoryPostProcessor(arg0);
+ }
+
+ public synchronized void close() {
+ appContext.close();
+ }
+
+ public synchronized ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException {
+ return appContext.getBeanFactory();
+ }
+
+ public synchronized boolean isActive() {
+ return appContext.isActive();
+ }
+
+ public synchronized void refresh() throws BeansException, IllegalStateException {
+ appContext.refresh();
+ }
+
+ public synchronized void registerShutdownHook() {
+ appContext.registerShutdownHook();
+ }
+
+ public synchronized void setParent(ApplicationContext arg0) {
+ appContext.setParent(arg0);
+ }
+
+ public synchronized boolean isRunning() {
+ return appContext.isRunning();
+ }
+
+ public synchronized void start() {
+ appContext.start();
+ }
+
+ public synchronized void stop() {
+ appContext.stop();
+ }
+}
\ No newline at end of file
Propchange: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/LockableApplicationContext.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/SpringReloader.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/SpringReloader.java?view=diff&rev=549470&r1=549469&r2=549470
==============================================================================
--- cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/SpringReloader.java (original)
+++ cocoon/trunk/tools/cocoon-rcl/cocoon-rcl-spring-reloader/src/main/java/org/apache/cocoon/tools/rcl/springreloader/SpringReloader.java Thu Jun 21 06:25:28 2007
@@ -5,9 +5,9 @@
* 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.
@@ -18,47 +18,23 @@
import javax.servlet.ServletContext;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.web.context.ContextLoader;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.context.support.ServletContextFactoryBean;
import org.springframework.web.context.support.WebApplicationContextUtils;
-import org.springframework.web.context.support.XmlWebApplicationContext;
/**
* <p>
* This class is used by the ReloadingSpringFilter to reload a Spring
* web application context. In order not to run into {@link NoClassDefFoundError}s,
- * is is important that this class is loaded through the reloading classloader.
+ * is is important that this class is loaded by the reloading classloader.
* </p>
- *
+ *
* @version $Id$
*/
public class SpringReloader {
-
- private final Log log = LogFactory.getLog(SpringReloader.class);
public synchronized void reload(ServletContext servletContext) {
- ContextLoader springContextLoader = new ContextLoader();
-
- // close old Spring application context
- XmlWebApplicationContext oldAc = (XmlWebApplicationContext)
+ LockableApplicationContext ac = (LockableApplicationContext)
WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
- if(log.isDebugEnabled()) {
- this.log.debug("Removing old application context: " + oldAc);
- }
- oldAc.close();
- servletContext.removeAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
-
- // create the new Spring application context
- ServletContextFactoryBean b = new ServletContextFactoryBean();
- b.setServletContext(servletContext);
- XmlWebApplicationContext xac = (XmlWebApplicationContext) springContextLoader.
- initWebApplicationContext(servletContext);
- if(log.isDebugEnabled()) {
- log.debug("Reloading Spring application context: " + xac);
- }
+ ac.reload();
}
-
+
}