diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java
index 90a3afebff0..55f95bb9e6f 100644
--- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java
+++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java
@@ -18,59 +18,54 @@ package org.springframework.web.servlet.config;
import java.util.List;
-import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
-import org.springframework.beans.factory.parsing.BeanComponentDefinition;
-import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
-import org.springframework.beans.factory.support.RootBeanDefinition;
-import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
+import org.springframework.context.config.AbstractSpecificationBeanDefinitionParser;
+import org.springframework.context.config.FeatureSpecification;
import org.springframework.util.xml.DomUtils;
import org.springframework.web.servlet.handler.MappedInterceptor;
import org.w3c.dom.Element;
/**
- * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} that parses a {@code interceptors} element to register
- * a set of {@link MappedInterceptor} definitions.
+ * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} that parses
+ * a {@code interceptors} element to register set of {@link MappedInterceptor}
+ * definitions.
*
* @author Keith Donald
+ * @author Rossen Stoyanchev
+ *
* @since 3.0
*/
-class InterceptorsBeanDefinitionParser implements BeanDefinitionParser {
+class InterceptorsBeanDefinitionParser extends AbstractSpecificationBeanDefinitionParser {
+
+ /**
+ * Parses the {@code } tag.
+ */
+ public FeatureSpecification doParse(Element element, ParserContext parserContext) {
+ MvcInterceptors mvcInterceptors = new MvcInterceptors();
- public BeanDefinition parse(Element element, ParserContext parserContext) {
- CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element));
- parserContext.pushContainingComponent(compDefinition);
-
List interceptors = DomUtils.getChildElementsByTagName(element, new String[] { "bean", "interceptor" });
for (Element interceptor : interceptors) {
- RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class);
- mappedInterceptorDef.setSource(parserContext.extractSource(interceptor));
- mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
- String[] pathPatterns;
- BeanDefinitionHolder interceptorDef;
if ("interceptor".equals(interceptor.getLocalName())) {
List paths = DomUtils.getChildElementsByTagName(interceptor, "mapping");
- pathPatterns = new String[paths.size()];
+ String[] pathPatterns = new String[paths.size()];
for (int i = 0; i < paths.size(); i++) {
pathPatterns[i] = paths.get(i).getAttribute("path");
}
- Element interceptorBean = DomUtils.getChildElementByTagName(interceptor, "bean");
- interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptorBean);
- interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptorBean, interceptorDef);
+ Element beanElement = DomUtils.getChildElementByTagName(interceptor, "bean");
+ mvcInterceptors.interceptor(pathPatterns, parseBeanElement(parserContext, beanElement));
} else {
- pathPatterns = null;
- interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptor);
- interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, interceptorDef);
+ mvcInterceptors.interceptor(null, parseBeanElement(parserContext, interceptor));
}
- mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, pathPatterns);
- mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, interceptorDef);
- String mappedInterceptorName = parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef);
- parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName));
}
-
- parserContext.popAndRegisterContainingComponent();
- return null;
+
+ return mvcInterceptors;
}
-
+
+ private BeanDefinitionHolder parseBeanElement(ParserContext parserContext, Element interceptor) {
+ BeanDefinitionHolder beanDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptor);
+ beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, beanDef);
+ return beanDef;
+ }
+
}
diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcInterceptors.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcInterceptors.java
new file mode 100644
index 00000000000..8169fdcfd08
--- /dev/null
+++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcInterceptors.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2002-2011 the original author or authors.
+ *
+ * Licensed 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.springframework.web.servlet.config;
+
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.config.BeanDefinitionHolder;
+import org.springframework.beans.factory.parsing.ProblemCollector;
+import org.springframework.context.config.AbstractFeatureSpecification;
+import org.springframework.context.config.FeatureSpecificationExecutor;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.WebRequestInterceptor;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.handler.MappedInterceptor;
+
+/**
+ * Specifies the Spring MVC "interceptors" container feature. The feature
+ * registers one or more {@link MappedInterceptor} bean definitions. A
+ * MappedInterceptor encapsulates an interceptor and one or more (optional)
+ * path patterns to which the interceptor is mapped. The interceptor can be
+ * of type {@link HandlerInterceptor} or {@link WebRequestInterceptor}.
+ * An interceptor can also be provided without path patterns in which case
+ * it applies globally to all handler invocations.
+ *
+ * @author Rossen Stoyanchev
+ * @since 3.1
+ */
+public class MvcInterceptors extends AbstractFeatureSpecification {
+
+ private static final Class extends FeatureSpecificationExecutor> EXECUTOR_TYPE = MvcInterceptorsExecutor.class;
+
+ private Map