From 24c0513eea4f3b9a4de5f004bfea8527bd583c0e Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Tue, 5 Nov 2013 08:20:27 -0700 Subject: [PATCH] Add servlet filter class that is compatible with the Spring Modularization --- .../context/ResourceApplicationContext.java | 8 +++ .../factory/CloudStackSpringContext.java | 1 + .../model/impl/DefaultModuleDefinition.java | 3 +- .../web/CloudStackContextLoaderListener.java | 1 + .../spring/module/web/ModuleBasedFilter.java | 61 +++++++++++++++++++ 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/ModuleBasedFilter.java diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/context/ResourceApplicationContext.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/context/ResourceApplicationContext.java index 60d0262ab36..3a8cb6fca96 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/context/ResourceApplicationContext.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/context/ResourceApplicationContext.java @@ -18,6 +18,8 @@ */ package org.apache.cloudstack.spring.module.context; +import java.util.Arrays; + import org.springframework.context.support.AbstractXmlApplicationContext; import org.springframework.core.io.Resource; @@ -52,4 +54,10 @@ public class ResourceApplicationContext extends AbstractXmlApplicationContext { this.applicationName = applicationName; } + @Override + public String toString() { + return "ResourceApplicationContext [applicationName=" + applicationName + ", configResources=" + + Arrays.toString(configResources) + "]"; + } + } diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java index e624a5b04d4..09dbd6c9799 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java @@ -37,6 +37,7 @@ public class CloudStackSpringContext { private static final Logger log = LoggerFactory.getLogger(CloudStackSpringContext.class); + public static final String CLOUDSTACK_CONTEXT_SERVLET_KEY = CloudStackSpringContext.class.getSimpleName(); public static final String CLOUDSTACK_CONTEXT = "META-INF/cloudstack"; public static final String CLOUDSTACK_BASE = "bootstrap"; diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinition.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinition.java index 6c5180874b8..979d08e0eae 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinition.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinition.java @@ -114,7 +114,8 @@ public class DefaultModuleDefinition implements ModuleDefinition { if ( ! moduleUrl.equals(selfUrl) ) { throw new IOException("Resource [" + location() + "] and [" + self.getURL() + "] do not appear to be the same resource, " + - "please ensure the name property is correct"); + "please ensure the name property is correct or that the " + + "module is not defined twice"); } } diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java index e704437774b..96e686c66df 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java @@ -49,6 +49,7 @@ public class CloudStackContextLoaderListener extends ContextLoaderListener { public void contextInitialized(ServletContextEvent event) { try { cloudStackContext = new CloudStackSpringContext(); + event.getServletContext().setAttribute(CloudStackSpringContext.CLOUDSTACK_CONTEXT_SERVLET_KEY, cloudStackContext); } catch (IOException e) { log.error("Failed to start CloudStack", e); throw new RuntimeException("Failed to initialize CloudStack Spring modules", e); diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/ModuleBasedFilter.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/ModuleBasedFilter.java new file mode 100644 index 00000000000..9dd1b82e902 --- /dev/null +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/ModuleBasedFilter.java @@ -0,0 +1,61 @@ +/* + * 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.cloudstack.spring.module.web; + +import javax.servlet.Filter; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; + +import org.apache.cloudstack.spring.module.factory.CloudStackSpringContext; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.ApplicationContext; + +public abstract class ModuleBasedFilter implements Filter { + + boolean enabled = false; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + String module = filterConfig.getInitParameter("module"); + CloudStackSpringContext context = + (CloudStackSpringContext) filterConfig.getServletContext().getAttribute(CloudStackSpringContext.CLOUDSTACK_CONTEXT_SERVLET_KEY); + + if ( context == null ) + return; + + ApplicationContext applicationContext = context.getApplicationContextForWeb(module); + if ( applicationContext != null ) { + AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); + if ( factory != null ) { + factory.autowireBean(this); + enabled = true; + } + } + } + + @Override + public void destroy() { + enabled = false; + } + + public boolean isEnabled() { + return enabled; + } + +}