View Javadoc

1   package org.springframework.security.config;
2   
3   import org.springframework.beans.factory.config.BeanDefinition;
4   import org.springframework.beans.factory.config.BeanDefinitionHolder;
5   import org.springframework.beans.factory.config.RuntimeBeanReference;
6   import org.springframework.beans.factory.support.ManagedList;
7   import org.springframework.beans.factory.support.ManagedMap;
8   import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
9   import org.springframework.beans.factory.xml.ParserContext;
10  import org.springframework.security.util.RegexUrlPathMatcher;
11  import org.springframework.util.StringUtils;
12  import org.springframework.util.xml.DomUtils;
13  import org.w3c.dom.Element;
14  import org.w3c.dom.Node;
15  
16  import java.util.*;
17  
18  /**
19   * Sets the filter chain Map for a FilterChainProxy bean declaration.
20   *
21   * @author Luke Taylor
22   * @version $Id: FilterChainMapBeanDefinitionDecorator.java 2595 2008-02-05 11:29:52Z luke_t $
23   */
24  class FilterChainMapBeanDefinitionDecorator implements BeanDefinitionDecorator {
25      public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder holder, ParserContext parserContext) {
26          BeanDefinition filterChainProxy = holder.getBeanDefinition();
27  
28          Map filterChainMap = new LinkedHashMap();
29          Element elt = (Element)node;
30  
31          String pathType = elt.getAttribute(HttpSecurityBeanDefinitionParser.ATT_PATH_TYPE);
32  
33          if (HttpSecurityBeanDefinitionParser.OPT_PATH_TYPE_REGEX.equals(pathType)) {
34              filterChainProxy.getPropertyValues().addPropertyValue("matcher", new RegexUrlPathMatcher());
35          }
36  
37          Iterator filterChainElts = DomUtils.getChildElementsByTagName(elt, Elements.FILTER_CHAIN).iterator();
38  
39          while (filterChainElts.hasNext()) {
40              Element chain = (Element) filterChainElts.next();
41              String path = chain.getAttribute(HttpSecurityBeanDefinitionParser.ATT_PATH_PATTERN);
42  
43              if(!StringUtils.hasText(path)) {
44                  parserContext.getReaderContext().error("The attribute '" + HttpSecurityBeanDefinitionParser.ATT_PATH_PATTERN +
45                      "' must not be empty", elt);
46              }
47  
48              String filters = chain.getAttribute(HttpSecurityBeanDefinitionParser.ATT_FILTERS);
49  
50              if(!StringUtils.hasText(filters)) {
51                  parserContext.getReaderContext().error("The attribute '" + HttpSecurityBeanDefinitionParser.ATT_FILTERS +
52                      "'must not be empty", elt);    
53              }
54  
55              if (filters.equals(HttpSecurityBeanDefinitionParser.OPT_FILTERS_NONE)) {
56                  filterChainMap.put(path, Collections.EMPTY_LIST);
57              } else {
58                  String[] filterBeanNames = StringUtils.tokenizeToStringArray(filters, ",");
59                  ManagedList filterChain = new ManagedList(filterBeanNames.length);
60  
61                  for (int i=0; i < filterBeanNames.length; i++) {
62                      filterChain.add(new RuntimeBeanReference(filterBeanNames[i]));
63                  }
64  
65                  filterChainMap.put(path, filterChain);
66              }
67          }
68  
69          ManagedMap map = new ManagedMap(filterChainMap.size());
70          map.putAll(filterChainMap);
71  
72          filterChainProxy.getPropertyValues().addPropertyValue("filterChainMap", map);
73  
74          return holder;
75      }
76  }