Ver código fonte

SEC-654: Made ConfigAttributeDefinition immutable, added several constructors to simplify its use. Removed MethodDefinitionMapping and FilterInvocationDefinitionMapping.

Luke Taylor 17 anos atrás
pai
commit
d695f5002c
64 arquivos alterados com 496 adições e 962 exclusões
  1. 14 41
      core-tiger/src/test/java/org/springframework/security/annotation/MethodDefinitionSourceEditorTigerTests.java
  2. 73 50
      core/src/main/java/org/springframework/security/ConfigAttributeDefinition.java
  3. 5 9
      core/src/main/java/org/springframework/security/ConfigAttributeEditor.java
  4. 1 1
      core/src/main/java/org/springframework/security/afterinvocation/AclEntryAfterInvocationCollectionFilteringProvider.java
  5. 1 1
      core/src/main/java/org/springframework/security/afterinvocation/AclEntryAfterInvocationProvider.java
  6. 1 1
      core/src/main/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationCollectionFilteringProvider.java
  7. 1 1
      core/src/main/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationProvider.java
  8. 1 1
      core/src/main/java/org/springframework/security/captcha/CaptchaChannelProcessorTemplate.java
  9. 1 1
      core/src/main/java/org/springframework/security/intercept/AbstractSecurityInterceptor.java
  10. 15 18
      core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionAttributes.java
  11. 24 35
      core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionMap.java
  12. 19 24
      core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionSourceEditor.java
  13. 0 82
      core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionSourceMapping.java
  14. 11 25
      core/src/main/java/org/springframework/security/intercept/web/DefaultFilterInvocationDefinitionSource.java
  15. 1 1
      core/src/main/java/org/springframework/security/intercept/web/FIDSToFilterChainMapConverter.java
  16. 25 29
      core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditor.java
  17. 0 81
      core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceMapping.java
  18. 1 1
      core/src/main/java/org/springframework/security/runas/RunAsManagerImpl.java
  19. 1 1
      core/src/main/java/org/springframework/security/securechannel/ChannelDecisionManagerImpl.java
  20. 1 1
      core/src/main/java/org/springframework/security/securechannel/ChannelProcessingFilter.java
  21. 1 1
      core/src/main/java/org/springframework/security/securechannel/InsecureChannelProcessor.java
  22. 1 1
      core/src/main/java/org/springframework/security/securechannel/SecureChannelProcessor.java
  23. 8 0
      core/src/main/java/org/springframework/security/userdetails/CachingUserDetailsService.java
  24. 14 0
      core/src/main/java/org/springframework/security/userdetails/UserDetailsCache.java
  25. 8 0
      core/src/main/java/org/springframework/security/userdetails/decorator/CacheEnabledUserDetailsService.java
  26. 1 1
      core/src/main/java/org/springframework/security/vote/AclEntryVoter.java
  27. 1 1
      core/src/main/java/org/springframework/security/vote/AuthenticatedVoter.java
  28. 1 1
      core/src/main/java/org/springframework/security/vote/BasicAclEntryVoter.java
  29. 4 16
      core/src/main/java/org/springframework/security/vote/LabelBasedAclVoter.java
  30. 1 1
      core/src/main/java/org/springframework/security/vote/RoleVoter.java
  31. 10 7
      core/src/main/java/org/springframework/security/vote/UnanimousBased.java
  32. 15 36
      core/src/test/java/org/springframework/security/ConfigAttributeEditorTests.java
  33. 1 1
      core/src/test/java/org/springframework/security/MockAccessDecisionManager.java
  34. 1 1
      core/src/test/java/org/springframework/security/MockAfterInvocationManager.java
  35. 1 1
      core/src/test/java/org/springframework/security/MockRunAsManager.java
  36. 5 15
      core/src/test/java/org/springframework/security/afterinvocation/AfterInvocationProviderManagerTests.java
  37. 11 29
      core/src/test/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationCollectionFilteringProviderTests.java
  38. 31 56
      core/src/test/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationProviderTests.java
  39. 2 5
      core/src/test/java/org/springframework/security/captcha/CaptchaChannelProcessorTemplateTests.java
  40. 8 8
      core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java
  41. 2 6
      core/src/test/java/org/springframework/security/event/authorization/AuthenticationCredentialsNotFoundEventTests.java
  42. 3 3
      core/src/test/java/org/springframework/security/event/authorization/AuthorizationFailureEventTests.java
  43. 2 6
      core/src/test/java/org/springframework/security/event/authorization/AuthorizedEventTests.java
  44. 1 7
      core/src/test/java/org/springframework/security/intercept/InterceptorStatusTokenTests.java
  45. 5 6
      core/src/test/java/org/springframework/security/intercept/method/MethodDefinitionAttributesTests.java
  46. 10 19
      core/src/test/java/org/springframework/security/intercept/method/MethodDefinitionSourceEditorTests.java
  47. 4 16
      core/src/test/java/org/springframework/security/intercept/method/MockMethodDefinitionSource.java
  48. 11 24
      core/src/test/java/org/springframework/security/intercept/web/DefaultFilterInvocationDefinitionSourceTests.java
  49. 6 19
      core/src/test/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditorTests.java
  50. 6 16
      core/src/test/java/org/springframework/security/intercept/web/FilterSecurityInterceptorTests.java
  51. 4 11
      core/src/test/java/org/springframework/security/intercept/web/MockFilterInvocationDefinitionSource.java
  52. 4 11
      core/src/test/java/org/springframework/security/runas/RunAsManagerImplTests.java
  53. 4 8
      core/src/test/java/org/springframework/security/securechannel/ChannelDecisionManagerImplTests.java
  54. 7 17
      core/src/test/java/org/springframework/security/securechannel/ChannelProcessingFilterTests.java
  55. 2 6
      core/src/test/java/org/springframework/security/securechannel/InsecureChannelProcessorTests.java
  56. 3 16
      core/src/test/java/org/springframework/security/securechannel/SecureChannelProcessorTests.java
  57. 3 6
      core/src/test/java/org/springframework/security/util/FilterChainProxyTests.java
  58. 6 14
      core/src/test/java/org/springframework/security/vote/AffirmativeBasedTests.java
  59. 3 6
      core/src/test/java/org/springframework/security/vote/AuthenticatedVoterTests.java
  60. 60 68
      core/src/test/java/org/springframework/security/vote/BasicAclEntryVoterTests.java
  61. 14 48
      core/src/test/java/org/springframework/security/vote/ConsensusBasedTests.java
  62. 1 1
      core/src/test/java/org/springframework/security/vote/DenyAgainVoter.java
  63. 1 1
      core/src/test/java/org/springframework/security/vote/DenyVoter.java
  64. 13 42
      core/src/test/java/org/springframework/security/vote/UnanimousBasedTests.java

+ 14 - 41
core-tiger/src/test/java/org/springframework/security/annotation/MethodDefinitionSourceEditorTigerTests.java

@@ -40,75 +40,48 @@ import org.aopalliance.intercept.MethodInvocation;
  * @version $Id$
  */
 public class MethodDefinitionSourceEditorTigerTests extends TestCase {
-    //~ Constructors ===================================================================================================
-
-    public MethodDefinitionSourceEditorTigerTests() {
-        super();
-    }
-
-    public MethodDefinitionSourceEditorTigerTests(String arg0) {
-        super(arg0);
-    }
-
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(MethodDefinitionSourceEditorTigerTests.class);
-    }
-
-    public final void setUp() throws Exception {
-        super.setUp();
-    }
-
-    public void testConcreteClassInvocationsAlsoReturnDefinitionsAgainstInterface()
-        throws Exception {
+    public void testConcreteClassInvocationsAlsoReturnDefinitionsAgainstInterface() throws Exception {
         MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
         editor.setAsText(
-            "org.springframework.security.annotation.test.Service.makeLower*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.Service.makeUpper*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.ServiceImpl.makeUpper*=ROLE_FROM_IMPLEMENTATION");
+                "org.springframework.security.annotation.test.Service.makeLower*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.Service.makeUpper*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.ServiceImpl.makeUpper*=ROLE_FROM_IMPLEMENTATION");
 
         MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
         assertEquals(3, map.getMethodMapSize());
 
         ConfigAttributeDefinition returnedMakeLower = map.getAttributes(new MockMethodInvocation(Service.class,
-                    "makeLowerCase", new Class[] {Entity.class}));
-        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition();
-        expectedMakeLower.addConfigAttribute(new SecurityConfig("ROLE_FROM_INTERFACE"));
+                "makeLowerCase", new Class[]{Entity.class}));
+        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition("ROLE_FROM_INTERFACE");
         assertEquals(expectedMakeLower, returnedMakeLower);
 
         ConfigAttributeDefinition returnedMakeUpper = map.getAttributes(new MockMethodInvocation(ServiceImpl.class,
-                    "makeUpperCase", new Class[] {Entity.class}));
-        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition();
-        expectedMakeUpper.addConfigAttribute(new SecurityConfig("ROLE_FROM_IMPLEMENTATION"));
-        expectedMakeUpper.addConfigAttribute(new SecurityConfig("ROLE_FROM_INTERFACE"));
+                "makeUpperCase", new Class[]{Entity.class}));
+        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition(new String[]{"ROLE_FROM_IMPLEMENTATION", "ROLE_FROM_INTERFACE"});
         assertEquals(expectedMakeUpper, returnedMakeUpper);
     }
 
-    public void testGenericsSuperclassDeclarationsAreIncludedWhenSubclassesOverride()
-        throws Exception {
+    public void testGenericsSuperclassDeclarationsAreIncludedWhenSubclassesOverride() throws Exception {
         MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor();
         editor.setAsText(
-            "org.springframework.security.annotation.test.Service.makeLower*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.Service.makeUpper*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.ServiceImpl.makeUpper*=ROLE_FROM_IMPLEMENTATION");
+                "org.springframework.security.annotation.test.Service.makeLower*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.Service.makeUpper*=ROLE_FROM_INTERFACE\r\norg.springframework.security.annotation.test.ServiceImpl.makeUpper*=ROLE_FROM_IMPLEMENTATION");
 
         MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue();
         assertEquals(3, map.getMethodMapSize());
 
         ConfigAttributeDefinition returnedMakeLower = map.getAttributes(new MockMethodInvocation(PersonService.class,
-                    "makeLowerCase", new Class[] {Entity.class}));
-        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition();
-        expectedMakeLower.addConfigAttribute(new SecurityConfig("ROLE_FROM_INTERFACE"));
+                "makeLowerCase", new Class[]{Entity.class}));
+        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition("ROLE_FROM_INTERFACE");
         assertEquals(expectedMakeLower, returnedMakeLower);
 
         ConfigAttributeDefinition returnedMakeLower2 = map.getAttributes(new MockMethodInvocation(
-                    OrganisationService.class, "makeLowerCase", new Class[] {Entity.class}));
-        ConfigAttributeDefinition expectedMakeLower2 = new ConfigAttributeDefinition();
-        expectedMakeLower2.addConfigAttribute(new SecurityConfig("ROLE_FROM_INTERFACE"));
+                OrganisationService.class, "makeLowerCase", new Class[]{Entity.class}));
+        ConfigAttributeDefinition expectedMakeLower2 = new ConfigAttributeDefinition("ROLE_FROM_INTERFACE");
         assertEquals(expectedMakeLower2, returnedMakeLower2);
 
         ConfigAttributeDefinition returnedMakeUpper = map.getAttributes(new MockMethodInvocation(
-                    PersonServiceImpl.class, "makeUpperCase", new Class[] {Entity.class}));
-        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition();
-        expectedMakeUpper.addConfigAttribute(new SecurityConfig("ROLE_FROM_IMPLEMENTATION"));
-        expectedMakeUpper.addConfigAttribute(new SecurityConfig("ROLE_FROM_INTERFACE"));
+                PersonServiceImpl.class, "makeUpperCase", new Class[]{Entity.class}));
+        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition(new String[]{"ROLE_FROM_IMPLEMENTATION", "ROLE_FROM_INTERFACE"});
         assertEquals(expectedMakeUpper, returnedMakeUpper);
     }
 

+ 73 - 50
core/src/main/java/org/springframework/security/ConfigAttributeDefinition.java

@@ -15,44 +15,93 @@
 
 package org.springframework.security;
 
+import org.springframework.util.Assert;
+
 import java.io.Serializable;
 
 import java.util.Iterator;
 import java.util.List;
-import java.util.Vector;
+import java.util.Collections;
+import java.util.ArrayList;
+import java.util.Collection;
 
 
 /**
- * Holds a group of {@link ConfigAttribute}s that are associated with a given secure object target.<p>All the
- * <code>ConfigAttributeDefinition</code>s associated with a given {@link
+ * Holds a group of {@link ConfigAttribute}s that are associated with a given secure object target - effectively a
+ * Collection<ConfigAttribute>.
+ * <p>
+ * Once created, the object is immutable.
+ * <p>
+ * All the <code>ConfigAttributeDefinition</code>s associated with a given {@link
  * org.springframework.security.intercept.AbstractSecurityInterceptor} are stored in an {@link
- * org.springframework.security.intercept.ObjectDefinitionSource}.</p>
+ * org.springframework.security.intercept.ObjectDefinitionSource}.
  *
  * @author Ben Alex
  * @version $Id$
  */
 public class ConfigAttributeDefinition implements Serializable {
+    public static final ConfigAttributeDefinition NO_ATTRIBUTES = new ConfigAttributeDefinition();
+
     //~ Instance fields ================================================================================================
 
-    private List configAttributes = new Vector();
+    private List configAttributes;
 
     //~ Constructors ===================================================================================================
 
-    public ConfigAttributeDefinition() {
-        super();
+    private ConfigAttributeDefinition() {
+        configAttributes = Collections.EMPTY_LIST;
     }
 
-    //~ Methods ========================================================================================================
+    /**
+     * Creates a ConfigAttributeDefinition containing a single attribute
+     * @param attribute the String name of the attribute (converted internally to a <tt>SecurityConfig</tt> instance).
+     */
+    public ConfigAttributeDefinition(String attribute) {
+        configAttributes = new ArrayList(1);
+        configAttributes.add(new SecurityConfig(attribute));
+        configAttributes = Collections.unmodifiableList(configAttributes);
+    }
 
     /**
-     * Adds a <code>ConfigAttribute</code> that is related to the secure object method.
+     * Creates a ConfigAttributeDefinition containing a single attribute.
+     */
+    public ConfigAttributeDefinition(ConfigAttribute attribute) {
+        configAttributes = new ArrayList(1);
+        configAttributes.add(attribute);
+        configAttributes = Collections.unmodifiableList(configAttributes);        
+    }
+
+    /**
+     * Builds a collection of ConfigAttributes from an array of String tokens, each of which will be wrapped in a
+     * <tt>SecurityConfig</tt> instance.
      *
-     * @param newConfigAttribute the new configuration attribute to add
+     * @param attributeTokens the tokens which will be turned into attributes.
      */
-    public void addConfigAttribute(ConfigAttribute newConfigAttribute) {
-        this.configAttributes.add(newConfigAttribute);
+    public ConfigAttributeDefinition(String[] attributeTokens) {
+        configAttributes = new ArrayList(attributeTokens.length);
+        
+        for (int i = 0; i < attributeTokens.length; i++) {
+            configAttributes.add(new SecurityConfig(attributeTokens[i].trim()));
+        }
+
+        configAttributes = Collections.unmodifiableList(configAttributes);
     }
 
+    /**
+     * Creates an immutable ConfigAttributeDefinition from the supplied list of <tt>ConfigAttribute</tt> objects.
+     */
+    public ConfigAttributeDefinition(List configAttributes) {
+        Iterator attributes = configAttributes.iterator();
+        while (attributes.hasNext()) {
+            Assert.isInstanceOf(ConfigAttribute.class, attributes.next(),
+                    "List entries must be of type ConfigAttribute");
+        }
+
+        this.configAttributes = Collections.unmodifiableList(new ArrayList(configAttributes));
+    }
+
+    //~ Methods ========================================================================================================
+
     /**
      * Indicates whether the specified <code>ConfigAttribute</code> is contained within this
      * <code>ConfigAttributeDefinition</code>.
@@ -67,53 +116,27 @@ public class ConfigAttributeDefinition implements Serializable {
     }
 
     public boolean equals(Object obj) {
-        if (obj instanceof ConfigAttributeDefinition) {
-            ConfigAttributeDefinition test = (ConfigAttributeDefinition) obj;
-
-            List testAttrs = new Vector();
-            Iterator iter = test.getConfigAttributes();
-
-            while (iter.hasNext()) {
-                ConfigAttribute attr = (ConfigAttribute) iter.next();
-                testAttrs.add(attr);
-            }
-
-            if (this.configAttributes.size() != testAttrs.size()) {
-                return false;
-            }
-
-            for (int i = 0; i < this.configAttributes.size(); i++) {
-                if (!this.configAttributes.get(i).equals(testAttrs.get(i))) {
-                    return false;
-                }
-            }
-
-            return true;
+        if (!(obj instanceof ConfigAttributeDefinition)) {
+            return false;
         }
 
-        return false;
-    }
+        ConfigAttributeDefinition test = (ConfigAttributeDefinition) obj;
 
-    /**
-     * Returns an <code>Iterator</code> over all the <code>ConfigAttribute</code>s defined by this
-     * <code>ConfigAttributeDefinition</code>.<P>Allows <code>AccessDecisionManager</code>s and other classes
-     * to loop through every configuration attribute associated with a target secure object.</p>
-     *
-     * @return all the configuration attributes stored by the instance, or <code>null</code> if an
-     *         <code>Iterator</code> is unavailable
-     */
-    public Iterator getConfigAttributes() {
-        return this.configAttributes.iterator();
+        return configAttributes.equals(test.configAttributes);
     }
 
     /**
-     * Returns the number of <code>ConfigAttribute</code>s defined by this
+     * Returns the internal collection of <code>ConfigAttribute</code>s defined by this
      * <code>ConfigAttributeDefinition</code>.
+     * <p>
+     * Allows <code>AccessDecisionManager</code>s and other classes to loop through every configuration attribute
+     * associated with a target secure object.
      *
-     * @return the number of <code>ConfigAttribute</code>s contained
+     * @return all the configuration attributes stored by the instance, or <code>null</code> if an
+     *         <code>Iterator</code> is unavailable
      */
-    public int size() {
-        return configAttributes.size();
+    public Collection getConfigAttributes() {
+        return this.configAttributes;
     }
 
     public String toString() {

+ 5 - 9
core/src/main/java/org/springframework/security/ConfigAttributeEditor.java

@@ -18,6 +18,8 @@ package org.springframework.security;
 import org.springframework.util.StringUtils;
 
 import java.beans.PropertyEditorSupport;
+import java.util.List;
+import java.util.ArrayList;
 
 
 /**
@@ -32,17 +34,11 @@ public class ConfigAttributeEditor extends PropertyEditorSupport {
     //~ Methods ========================================================================================================
 
     public void setAsText(String s) throws IllegalArgumentException {
-        if ((s == null) || "".equals(s)) {
-            setValue(null);
+        if (StringUtils.hasText(s)) {
+            setValue(new ConfigAttributeDefinition(StringUtils.commaDelimitedListToStringArray(s)));
         } else {
-            String[] tokens = StringUtils.commaDelimitedListToStringArray(s);
-            ConfigAttributeDefinition configDefinition = new ConfigAttributeDefinition();
-
-            for (int i = 0; i < tokens.length; i++) {
-                configDefinition.addConfigAttribute(new SecurityConfig(tokens[i].trim()));
-            }
+            setValue(null);
 
-            setValue(configDefinition);
         }
     }
 }

+ 1 - 1
core/src/main/java/org/springframework/security/afterinvocation/AclEntryAfterInvocationCollectionFilteringProvider.java

@@ -71,7 +71,7 @@ public class AclEntryAfterInvocationCollectionFilteringProvider extends Abstract
 
     public Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config,
         Object returnedObject) throws AccessDeniedException {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/afterinvocation/AclEntryAfterInvocationProvider.java

@@ -70,7 +70,7 @@ public class AclEntryAfterInvocationProvider extends AbstractAclProvider impleme
 
     public Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config,
         Object returnedObject) throws AccessDeniedException {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationCollectionFilteringProvider.java

@@ -92,7 +92,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProvider implements
 
     public Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config,
         Object returnedObject) throws AccessDeniedException {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationProvider.java

@@ -90,7 +90,7 @@ public class BasicAclEntryAfterInvocationProvider implements AfterInvocationProv
 
     public Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config,
         Object returnedObject) throws AccessDeniedException {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/captcha/CaptchaChannelProcessorTemplate.java

@@ -86,7 +86,7 @@ public abstract class CaptchaChannelProcessorTemplate implements ChannelProcesso
         CaptchaSecurityContext context = null;
         context = (CaptchaSecurityContext) SecurityContextHolder.getContext();
 
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/intercept/AbstractSecurityInterceptor.java

@@ -224,7 +224,7 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean, A
 
             while (iter.hasNext()) {
                 ConfigAttributeDefinition def = (ConfigAttributeDefinition) iter.next();
-                Iterator attributes = def.getConfigAttributes();
+                Iterator attributes = def.getConfigAttributes().iterator();
 
                 while (attributes.hasNext()) {
                     ConfigAttribute attr = (ConfigAttribute) attributes.next();

+ 15 - 18
core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionAttributes.java

@@ -24,6 +24,8 @@ import java.lang.reflect.Method;
 
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
+import java.util.ArrayList;
 
 
 /**
@@ -56,21 +58,17 @@ public class MethodDefinitionAttributes extends AbstractMethodDefinitionSource {
 
     //~ Methods ========================================================================================================
 
-    private void add(ConfigAttributeDefinition definition, Collection attribs) {
+    private void add(List definition, Collection attribs) {
         for (Iterator iter = attribs.iterator(); iter.hasNext();) {
             Object o = iter.next();
 
             if (o instanceof ConfigAttribute) {
-                definition.addConfigAttribute((ConfigAttribute) o);
+                definition.add(o);
             }
         }
     }
 
-    private void addClassAttributes(ConfigAttributeDefinition definition, Class clazz) {
-        addClassAttributes(definition, new Class[] {clazz});
-    }
-
-    private void addClassAttributes(ConfigAttributeDefinition definition, Class[] clazz) {
+    private void addClassAttributes(List definition, Class[] clazz) {
         for (int i = 0; i < clazz.length; i++) {
             Collection classAttributes = attributes.getAttributes(clazz[i]);
 
@@ -80,7 +78,7 @@ public class MethodDefinitionAttributes extends AbstractMethodDefinitionSource {
         }
     }
 
-    private void addInterfaceMethodAttributes(ConfigAttributeDefinition definition, Method method) {
+    private void addInterfaceMethodAttributes(List definition, Method method) {
         Class[] interfaces = method.getDeclaringClass().getInterfaces();
 
         for (int i = 0; i < interfaces.length; i++) {
@@ -96,7 +94,7 @@ public class MethodDefinitionAttributes extends AbstractMethodDefinitionSource {
         }
     }
 
-    private void addMethodAttributes(ConfigAttributeDefinition definition, Method method) {
+    private void addMethodAttributes(List definition, Method method) {
         // add the method level attributes
         Collection methodAttributes = attributes.getAttributes(method);
 
@@ -110,27 +108,26 @@ public class MethodDefinitionAttributes extends AbstractMethodDefinitionSource {
     }
 
     protected ConfigAttributeDefinition lookupAttributes(Method method) {
-        ConfigAttributeDefinition definition = new ConfigAttributeDefinition();
-
         Class interceptedClass = method.getDeclaringClass();
+        List attributes = new ArrayList();
 
         // add the class level attributes for the implementing class
-        addClassAttributes(definition, interceptedClass);
+        addClassAttributes(attributes, new Class[] {interceptedClass});
 
         // add the class level attributes for the implemented interfaces
-        addClassAttributes(definition, interceptedClass.getInterfaces());
+        addClassAttributes(attributes, interceptedClass.getInterfaces());
 
         // add the method level attributes for the implemented method
-        addMethodAttributes(definition, method);
+        addMethodAttributes(attributes, method);
 
         // add the method level attributes for the implemented intreface methods
-        addInterfaceMethodAttributes(definition, method);
+        addInterfaceMethodAttributes(attributes, method);
 
-        if (definition.size() == 0) {
+        if (attributes.size() == 0) {
             return null;
-        } else {
-            return definition;
         }
+
+        return new ConfigAttributeDefinition(attributes);
     }
 
     public void setAttributes(Attributes attributes) {

+ 24 - 35
core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionMap.java

@@ -15,7 +15,6 @@
 
 package org.springframework.security.intercept.method;
 
-import org.springframework.security.ConfigAttribute;
 import org.springframework.security.ConfigAttributeDefinition;
 import org.springframework.security.SecurityConfig;
 
@@ -64,6 +63,22 @@ public class MethodDefinitionMap extends AbstractMethodDefinitionSource {
 
     //~ Methods ========================================================================================================
 
+    public MethodDefinitionMap() {
+    }
+
+    /**
+     * Creates the MethodDefinitionMap from a
+     * @param methodMap map of method names to <tt>ConfigAttributeDefinition</tt>s.
+     */
+    public MethodDefinitionMap(Map methodMap) {
+        Iterator iterator = methodMap.entrySet().iterator();
+
+        while (iterator.hasNext()) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            addSecureMethod((String)entry.getKey(), (ConfigAttributeDefinition)entry.getValue());
+        }        
+    }
+
     /**
      * Add configuration attributes for a secure method. Method names can end or start with <code>&#42</code>
      * for matching multiple methods.
@@ -192,11 +207,10 @@ public class MethodDefinitionMap extends AbstractMethodDefinitionSource {
     }
 
     protected ConfigAttributeDefinition lookupAttributes(Method method) {
-        ConfigAttributeDefinition definition = new ConfigAttributeDefinition();
+        List attributesToReturn = new ArrayList();
 
         // Add attributes explictly defined for this method invocation
-        ConfigAttributeDefinition directlyAssigned = (ConfigAttributeDefinition) this.methodMap.get(method);
-        merge(definition, directlyAssigned);
+        merge(attributesToReturn, (ConfigAttributeDefinition) this.methodMap.get(method));
 
         // Add attributes explicitly defined for this method invocation's interfaces
         Class[] interfaces = method.getDeclaringClass().getInterfaces();
@@ -209,50 +223,25 @@ public class MethodDefinitionMap extends AbstractMethodDefinitionSource {
                 Method interfaceMethod = clazz.getDeclaredMethod(method.getName(), (Class[]) method.getParameterTypes());
                 ConfigAttributeDefinition interfaceAssigned =
                         (ConfigAttributeDefinition) this.methodMap.get(interfaceMethod);
-                merge(definition, interfaceAssigned);
+                merge(attributesToReturn, interfaceAssigned);
             } catch (Exception e) {
                 // skip this interface
             }
         }
 
         // Return null if empty, as per abstract superclass contract
-        if (definition.size() == 0) {
+        if (attributesToReturn.size() == 0) {
             return null;
-        } else {
-            return definition;
         }
+
+        return new ConfigAttributeDefinition(attributesToReturn);
     }
 
-    private void merge(ConfigAttributeDefinition definition, ConfigAttributeDefinition toMerge) {
+    private void merge(List attributes, ConfigAttributeDefinition toMerge) {
         if (toMerge == null) {
             return;
         }
 
-        Iterator attribs = toMerge.getConfigAttributes();
-
-        while (attribs.hasNext()) {
-            definition.addConfigAttribute((ConfigAttribute) attribs.next());
-        }
-    }
-
-    /**
-     * Easier configuration of the instance, using {@link MethodDefinitionSourceMapping}.
-     *
-     * @param mappings {@link List} of {@link MethodDefinitionSourceMapping} objects.
-     */
-    public void setMappings(List mappings) {
-        Iterator it = mappings.iterator();
-        while (it.hasNext()) {
-            MethodDefinitionSourceMapping mapping = (MethodDefinitionSourceMapping) it.next();
-            ConfigAttributeDefinition configDefinition = new ConfigAttributeDefinition();
-
-            Iterator configAttributesIt = mapping.getConfigAttributes().iterator();
-            while (configAttributesIt.hasNext()) {
-                String s = (String) configAttributesIt.next();
-                configDefinition.addConfigAttribute(new SecurityConfig(s));
-            }
-
-            addSecureMethod(mapping.getMethodName(), configDefinition);
-        }
+        attributes.addAll(toMerge.getConfigAttributes());
     }
 }

+ 19 - 24
core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionSourceEditor.java

@@ -15,6 +15,8 @@
 
 package org.springframework.security.intercept.method;
 
+import org.springframework.security.ConfigAttributeDefinition;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -27,6 +29,8 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
+import java.util.Map;
+import java.util.LinkedHashMap;
 
 
 /**
@@ -44,38 +48,29 @@ public class MethodDefinitionSourceEditor extends PropertyEditorSupport {
     //~ Methods ========================================================================================================
 
     public void setAsText(String s) throws IllegalArgumentException {
-        MethodDefinitionMap source = new MethodDefinitionMap();
-
         if ((s == null) || "".equals(s)) {
-            // Leave value in property editor null
-        } else {
-            // Use properties editor to tokenize the string
-            PropertiesEditor propertiesEditor = new PropertiesEditor();
-            propertiesEditor.setAsText(s);
-
-            Properties props = (Properties) propertiesEditor.getValue();
+            setValue(new MethodDefinitionMap());
+            return;
+        }
 
-            // Now we have properties, process each one individually
-            List mappings = new ArrayList();
+        // Use properties editor to tokenize the string
+        PropertiesEditor propertiesEditor = new PropertiesEditor();
+        propertiesEditor.setAsText(s);
 
-            for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
-                String name = (String) iter.next();
-                String value = props.getProperty(name);
+        Properties props = (Properties) propertiesEditor.getValue();
 
-                MethodDefinitionSourceMapping mapping = new MethodDefinitionSourceMapping();
-                mapping.setMethodName(name);
+        // Now we have properties, process each one individually
+        Map mappings = new LinkedHashMap();
 
-                String[] tokens = StringUtils.commaDelimitedListToStringArray(value);
+        for (Iterator iter = props.keySet().iterator(); iter.hasNext();) {
+            String name = (String) iter.next();
+            String value = props.getProperty(name);
 
-                for (int i = 0; i < tokens.length; i++) {
-                    mapping.addConfigAttribute(tokens[i].trim());
-                }
+            String[] tokens = StringUtils.commaDelimitedListToStringArray(value);
 
-                mappings.add(mapping);
-            }
-            source.setMappings(mappings);
+            mappings.put(name, new ConfigAttributeDefinition(tokens));
         }
 
-        setValue(source);
+        setValue(new MethodDefinitionMap(mappings));
     }
 }

+ 0 - 82
core/src/main/java/org/springframework/security/intercept/method/MethodDefinitionSourceMapping.java

@@ -1,82 +0,0 @@
-/* Copyright 2006 Acegi Technology Pty Limited
- *
- * 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.security.intercept.method;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.springframework.security.ConfigAttribute;
-
-/**
- * Configuration entry for {@link MethodDefinitionSource}, that holds
- * the method to be protected and the {@link ConfigAttribute}s as {@link String}
- * that apply to that url.
- *
- * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
- * @version $Id$
- * @since 1.1
- */
-public class MethodDefinitionSourceMapping {
-
-    private String methodName;
-
-    private List configAttributes = new ArrayList();
-
-    /**
-     * Name of the method to be secured, including package and class name.
-     * eg. <code>org.mydomain.MyClass.myMethod</code>
-     *
-     * @param methodName
-     */
-    public void setMethodName(String methodName) {
-        this.methodName = methodName;
-    }
-
-    /**
-     * Name of the method to be secured.
-     *
-     * @return the name of the method
-     */
-    public String getMethodName() {
-        return methodName;
-    }
-
-    /**
-     *
-     * @param roles {@link List}&lt;{@link String}>
-     */
-    public void setConfigAttributes(List roles) {
-        this.configAttributes = roles;
-    }
-
-    /**
-     *
-     * @return {@link List}&lt;{@link String}>
-     */
-    public List getConfigAttributes() {
-        return configAttributes;
-    }
-
-    /**
-     * Add a {@link ConfigAttribute} as {@link String}
-     *
-     * @param configAttribute
-     */
-    public void addConfigAttribute(String configAttribute) {
-        configAttributes.add(configAttribute);
-    }
-
-}

+ 11 - 25
core/src/main/java/org/springframework/security/intercept/web/DefaultFilterInvocationDefinitionSource.java

@@ -79,6 +79,17 @@ public class DefaultFilterInvocationDefinitionSource implements FilterInvocation
         this.urlMatcher = urlMatcher;
     }
 
+    public DefaultFilterInvocationDefinitionSource(UrlMatcher urlMatcher, LinkedHashMap requestMap) {
+        this.urlMatcher = urlMatcher;
+
+        Iterator iterator = requestMap.entrySet().iterator();
+
+        while (iterator.hasNext()) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            addSecureUrl((String)entry.getKey(), (ConfigAttributeDefinition)entry.getValue());
+        }
+    }
+
     //~ Methods ========================================================================================================
 
     public void addSecureUrl(String pattern, ConfigAttributeDefinition attr) {
@@ -212,31 +223,6 @@ public class DefaultFilterInvocationDefinitionSource implements FilterInvocation
         return null;
     }
 
-    /**
-     * Allows or easier configuration using {@link FilterInvocationDefinitionSourceMapping}.
-     *
-     * @param mappings
-     *            {@link java.util.List} of
-     *            {@link FilterInvocationDefinitionSourceMapping} objects.
-     */
-    void setMappings(List mappings) {
-        Iterator it = mappings.iterator();
-
-        while (it.hasNext()) {
-            FilterInvocationDefinitionSourceMapping mapping = (FilterInvocationDefinitionSourceMapping) it.next();
-            ConfigAttributeDefinition configDefinition = new ConfigAttributeDefinition();
-
-            Iterator configAttributesIt = mapping.getConfigAttributes().iterator();
-            while (configAttributesIt.hasNext()) {
-                String s = (String) configAttributesIt.next();
-                configDefinition.addConfigAttribute(new SecurityConfig(s));
-            }
-
-            addSecureUrl(mapping.getUrl(), configDefinition);
-        }
-    }
-
-
     public boolean supports(Class clazz) {
         return FilterInvocation.class.isAssignableFrom(clazz);
     }

+ 1 - 1
core/src/main/java/org/springframework/security/intercept/web/FIDSToFilterChainMapConverter.java

@@ -41,7 +41,7 @@ public class FIDSToFilterChainMapConverter {
             ConfigAttributeDefinition configAttributeDefinition = (ConfigAttributeDefinition) requestMap.get(entry);
 
             List filters = new ArrayList();
-            Iterator attributes = configAttributeDefinition.getConfigAttributes();
+            Iterator attributes = configAttributeDefinition.getConfigAttributes().iterator();
 
             while (attributes.hasNext()) {
                 ConfigAttribute attr = (ConfigAttribute) attributes.next();

+ 25 - 29
core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditor.java

@@ -19,13 +19,13 @@ import java.beans.PropertyEditorSupport;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.LinkedHashMap;
 
 import org.springframework.security.util.StringSplitUtils;
 import org.springframework.security.util.RegexUrlPathMatcher;
 import org.springframework.security.util.UrlMatcher;
 import org.springframework.security.util.AntUrlPathMatcher;
+import org.springframework.security.ConfigAttributeDefinition;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -85,29 +85,11 @@ public class FilterInvocationDefinitionSourceEditor extends PropertyEditorSuppor
             }
         }
 
-        UrlMatcher matcher;
-
-        if (useAnt) {
-            matcher = new AntUrlPathMatcher();
-            ((AntUrlPathMatcher)matcher).setRequiresLowerCaseUrl(converUrlToLowerCase);
-
-        } else {
-            matcher = new RegexUrlPathMatcher();
-            ((RegexUrlPathMatcher)matcher).setRequiresLowerCaseUrl(converUrlToLowerCase);
-        }
-
-        DefaultFilterInvocationDefinitionSource fids = new DefaultFilterInvocationDefinitionSource(matcher);
-
-        if (useAnt) {
-            fids.setStripQueryStringFromUrls(true);
-        }
-
-
         BufferedReader br = new BufferedReader(new StringReader(s));
         int counter = 0;
         String line;
 
-        List mappings = new ArrayList();
+        LinkedHashMap urlMap = new LinkedHashMap();
 
         while (true) {
             counter++;
@@ -183,19 +165,33 @@ public class FilterInvocationDefinitionSourceEditor extends PropertyEditorSuppor
                 }
             }
 
-            FilterInvocationDefinitionSourceMapping mapping = new FilterInvocationDefinitionSourceMapping();
-            mapping.setUrl(name);
-
             String[] tokens = StringUtils.commaDelimitedListToStringArray(value);
 
-            for (int i = 0; i < tokens.length; i++) {
-                mapping.addConfigAttribute(tokens[i].trim());
-            }
+            urlMap.put(name, new ConfigAttributeDefinition(tokens));
+        }
+
+        DefaultFilterInvocationDefinitionSource fids =
+                new DefaultFilterInvocationDefinitionSource(createMatcher(useAnt, converUrlToLowerCase), urlMap);
 
-            mappings.add(mapping);
+        if (useAnt) {
+            fids.setStripQueryStringFromUrls(true);
         }
-        fids.setMappings(mappings);
 
         setValue(fids);
     }
+
+    private UrlMatcher createMatcher(boolean useAnt, boolean converUrlToLowerCase) {
+        UrlMatcher matcher;
+
+        if (useAnt) {
+            matcher = new AntUrlPathMatcher();
+            ((AntUrlPathMatcher)matcher).setRequiresLowerCaseUrl(converUrlToLowerCase);
+
+        } else {
+            matcher = new RegexUrlPathMatcher();
+            ((RegexUrlPathMatcher)matcher).setRequiresLowerCaseUrl(converUrlToLowerCase);
+        }
+
+        return matcher;
+    }
 }

+ 0 - 81
core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceMapping.java

@@ -1,81 +0,0 @@
-/* Copyright 2006 Acegi Technology Pty Limited
- *
- * 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.security.intercept.web;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.springframework.security.ConfigAttribute;
-
-/**
- * Configuration entry for {@link FilterInvocationDefinitionSource}, that holds
- * the url to be protected and the {@link ConfigAttribute}s as {@link String}
- * that apply to that url.
- *
- * @author <a href="mailto:carlos@apache.org">Carlos Sanchez</a>
- * @version $Id$
- * @since 1.1
- */
-class FilterInvocationDefinitionSourceMapping {
-
-    private String url;
-
-    private List configAttributes = new ArrayList();
-
-    /**
-     * Url to be secured.
-     *
-     * @param url
-     */
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    /**
-     * Url to be secured.
-     *
-     * @return the url
-     */
-    public String getUrl() {
-        return url;
-    }
-
-    /**
-     *
-     * @param roles {@link List}&lt;{@link String}>
-     */
-    public void setConfigAttributes(List roles) {
-        this.configAttributes = roles;
-    }
-
-    /**
-     *
-     * @return {@link List}&lt;{@link String}>
-     */
-    public List getConfigAttributes() {
-        return configAttributes;
-    }
-
-    /**
-     * Add a {@link ConfigAttribute} as {@link String}
-     *
-     * @param configAttribute
-     */
-    public void addConfigAttribute(String configAttribute) {
-        configAttributes.add(configAttribute);
-    }
-
-}

+ 1 - 1
core/src/main/java/org/springframework/security/runas/RunAsManagerImpl.java

@@ -66,7 +66,7 @@ public class RunAsManagerImpl implements RunAsManager, InitializingBean {
 
     public Authentication buildRunAs(Authentication authentication, Object object, ConfigAttributeDefinition config) {
         List newAuthorities = new Vector();
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/securechannel/ChannelDecisionManagerImpl.java

@@ -68,7 +68,7 @@ public class ChannelDecisionManagerImpl implements ChannelDecisionManager, Initi
     public void decide(FilterInvocation invocation, ConfigAttributeDefinition config)
             throws IOException, ServletException {
 
-        Iterator attrs = config.getConfigAttributes();
+        Iterator attrs = config.getConfigAttributes().iterator();
 
         while (attrs.hasNext()) {
 			ConfigAttribute attribute = (ConfigAttribute) attrs.next();

+ 1 - 1
core/src/main/java/org/springframework/security/securechannel/ChannelProcessingFilter.java

@@ -81,7 +81,7 @@ public class ChannelProcessingFilter extends SpringSecurityFilter implements Ini
 
         while (iter.hasNext()) {
             ConfigAttributeDefinition def = (ConfigAttributeDefinition) iter.next();
-            Iterator attributes = def.getConfigAttributes();
+            Iterator attributes = def.getConfigAttributes().iterator();
 
             while (attributes.hasNext()) {
                 ConfigAttribute attr = (ConfigAttribute) attributes.next();

+ 1 - 1
core/src/main/java/org/springframework/security/securechannel/InsecureChannelProcessor.java

@@ -61,7 +61,7 @@ public class InsecureChannelProcessor implements InitializingBean, ChannelProces
             throw new IllegalArgumentException("Nulls cannot be provided");
         }
 
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/securechannel/SecureChannelProcessor.java

@@ -59,7 +59,7 @@ public class SecureChannelProcessor implements InitializingBean, ChannelProcesso
         throws IOException, ServletException {
         Assert.isTrue((invocation != null) && (config != null), "Nulls cannot be provided");
 
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 8 - 0
core/src/main/java/org/springframework/security/userdetails/CachingUserDetailsService.java

@@ -0,0 +1,8 @@
+package org.springframework.security.userdetails;
+
+/**
+ * @author Luke Taylor
+ * @version $Id$
+ */
+public interface CachingUserDetailsService extends UserDetailsService, UserDetailsCache {
+}

+ 14 - 0
core/src/main/java/org/springframework/security/userdetails/UserDetailsCache.java

@@ -0,0 +1,14 @@
+package org.springframework.security.userdetails;
+
+/**
+ * @author Luke Taylor
+ * @version $Id$
+ */
+public interface UserDetailsCache {
+
+    boolean userIsCached(String username);
+
+    void removeUserFromCache(String username);
+
+    void clearCache();    
+}

+ 8 - 0
core/src/main/java/org/springframework/security/userdetails/decorator/CacheEnabledUserDetailsService.java

@@ -0,0 +1,8 @@
+package org.springframework.security.userdetails.decorator;
+
+/**
+ * @author Luke Taylor
+ * @version $Id$
+ */
+public class CacheEnabledUserDetailsService {
+}

+ 1 - 1
core/src/main/java/org/springframework/security/vote/AclEntryVoter.java

@@ -144,7 +144,7 @@ public class AclEntryVoter extends AbstractAclVoter {
     }
 
     public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/vote/AuthenticatedVoter.java

@@ -87,7 +87,7 @@ public class AuthenticatedVoter implements AccessDecisionVoter {
 
     public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
         int result = ACCESS_ABSTAIN;
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/main/java/org/springframework/security/vote/BasicAclEntryVoter.java

@@ -163,7 +163,7 @@ public class BasicAclEntryVoter extends AbstractAclVoter implements Initializing
     }
 
     public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 4 - 16
core/src/main/java/org/springframework/security/vote/LabelBasedAclVoter.java

@@ -182,7 +182,7 @@ public class LabelBasedAclVoter extends AbstractAclVoter {
             logger.debug("==========================================================");
         }
 
-        if (this.supports((ConfigAttribute) config.getConfigAttributes().next())) {
+        if (this.supports((ConfigAttribute) config.getConfigAttributes().iterator().next())) {
             result = ACCESS_DENIED;
 
             /* Parse out the user's labels by examining the security context, and checking
@@ -267,27 +267,15 @@ public class LabelBasedAclVoter extends AbstractAclVoter {
         if (logger.isDebugEnabled()) {
             switch (result) {
             case ACCESS_GRANTED:
-
-                if (logger.isDebugEnabled()) {
-                    logger.debug("===== Access is granted =====");
-                }
-
+                logger.debug("===== Access is granted =====");
                 break;
 
             case ACCESS_DENIED:
-
-                if (logger.isDebugEnabled()) {
-                    logger.debug("===== Access is denied =====");
-                }
-
+                logger.debug("===== Access is denied =====");
                 break;
 
             case ACCESS_ABSTAIN:
-
-                if (logger.isDebugEnabled()) {
-                    logger.debug("===== Abstaining =====");
-                }
-
+                logger.debug("===== Abstaining =====");
                 break;
             }
         }

+ 1 - 1
core/src/main/java/org/springframework/security/vote/RoleVoter.java

@@ -93,7 +93,7 @@ public class RoleVoter implements AccessDecisionVoter {
 
     public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
         int result = ACCESS_ABSTAIN;
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 10 - 7
core/src/main/java/org/springframework/security/vote/UnanimousBased.java

@@ -21,6 +21,7 @@ import org.springframework.security.ConfigAttribute;
 import org.springframework.security.ConfigAttributeDefinition;
 
 import java.util.Iterator;
+import java.util.Arrays;
 
 
 /**
@@ -32,8 +33,9 @@ public class UnanimousBased extends AbstractAccessDecisionManager {
 
     /**
      * This concrete implementation polls all configured  {@link AccessDecisionVoter}s for each {@link
-     * ConfigAttribute} and grants access if <b>only</b> grant votes were received.<p>Other voting
-     * implementations usually pass the entire list of {@link ConfigAttributeDefinition}s to the
+     * ConfigAttribute} and grants access if <b>only</b> grant votes were received.
+     * <p>
+     * Other voting implementations usually pass the entire list of {@link ConfigAttributeDefinition}s to the
      * <code>AccessDecisionVoter</code>. This implementation differs in that each <code>AccessDecisionVoter</code>
      * knows only about a single <code>ConfigAttribute</code> at a time.</p>
      *  <p>If every <code>AccessDecisionVoter</code> abstained from voting, the decision will be based on the
@@ -46,21 +48,22 @@ public class UnanimousBased extends AbstractAccessDecisionManager {
      * @throws AccessDeniedException if access is denied
      */
     public void decide(Authentication authentication, Object object, ConfigAttributeDefinition config)
-        throws AccessDeniedException {
+             throws AccessDeniedException {
+
         int grant = 0;
         int abstain = 0;
 
-        Iterator configIter = config.getConfigAttributes();
+        Iterator configIter = config.getConfigAttributes().iterator();
 
         while (configIter.hasNext()) {
-            ConfigAttributeDefinition thisDef = new ConfigAttributeDefinition();
-            thisDef.addConfigAttribute((ConfigAttribute) configIter.next());
+            ConfigAttributeDefinition singleAttrDef =
+                    new ConfigAttributeDefinition((ConfigAttribute) configIter.next());
 
             Iterator voters = this.getDecisionVoters().iterator();
 
             while (voters.hasNext()) {
                 AccessDecisionVoter voter = (AccessDecisionVoter) voters.next();
-                int result = voter.vote(authentication, object, thisDef);
+                int result = voter.vote(authentication, object, singleAttrDef);
 
                 switch (result) {
                 case AccessDecisionVoter.ACCESS_GRANTED:

+ 15 - 36
core/src/test/java/org/springframework/security/ConfigAttributeEditorTests.java

@@ -28,6 +28,8 @@ import java.util.Iterator;
  * @version $Id$
  */
 public class ConfigAttributeEditorTests extends TestCase {
+    private static final String[] ATTRIBUTES = new String[] {"A", "B"};
+
     //~ Constructors ===================================================================================================
 
     public ConfigAttributeEditorTests() {
@@ -40,20 +42,12 @@ public class ConfigAttributeEditorTests extends TestCase {
 
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(ConfigAttributeEditorTests.class);
-    }
-
-    public final void setUp() throws Exception {
-        super.setUp();
-    }
-
     public void testCorrectOperation() {
         ConfigAttributeEditor editor = new ConfigAttributeEditor();
         editor.setAsText("HELLO,DOCTOR,NAME,YESTERDAY,TOMORROW");
 
         ConfigAttributeDefinition result = (ConfigAttributeDefinition) editor.getValue();
-        Iterator iter = result.getConfigAttributes();
+        Iterator iter = result.getConfigAttributes().iterator();
         int position = 0;
 
         while (iter.hasNext()) {
@@ -63,7 +57,7 @@ public class ConfigAttributeEditorTests extends TestCase {
 
         assertEquals(5, position);
 
-        assertEquals(5, result.size());
+        assertEquals(5, result.getConfigAttributes().size());
 
         assertTrue(result.contains(new SecurityConfig("HELLO")));
         assertTrue(result.contains(new SecurityConfig("TOMORROW")));
@@ -79,46 +73,31 @@ public class ConfigAttributeEditorTests extends TestCase {
     }
 
     public void testEqualsHandlingWhenDifferentObjectTypes() {
-        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition();
-        def1.addConfigAttribute(new SecurityConfig("A"));
-        def1.addConfigAttribute(new SecurityConfig("B"));
+        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition(ATTRIBUTES);
 
         assertTrue(!def1.equals("A_STRING"));
     }
 
     public void testEqualsHandlingWhenExactlyEqual() {
-        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition();
-        def1.addConfigAttribute(new SecurityConfig("A"));
-        def1.addConfigAttribute(new SecurityConfig("B"));
-
-        ConfigAttributeDefinition def2 = new ConfigAttributeDefinition();
-        def2.addConfigAttribute(new SecurityConfig("A"));
-        def2.addConfigAttribute(new SecurityConfig("B"));
+        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition(ATTRIBUTES);
+        ConfigAttributeDefinition def2 = new ConfigAttributeDefinition(ATTRIBUTES);
 
         assertEquals(def1, def2);
     }
 
     public void testEqualsHandlingWhenOrderingNotEqual() {
-        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition();
-        def1.addConfigAttribute(new SecurityConfig("A"));
-        def1.addConfigAttribute(new SecurityConfig("B"));
+        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition(ATTRIBUTES);
+        ConfigAttributeDefinition def2 = new ConfigAttributeDefinition(new String[] {"B", "A"});
 
-        ConfigAttributeDefinition def2 = new ConfigAttributeDefinition();
-        def2.addConfigAttribute(new SecurityConfig("B"));
-        def2.addConfigAttribute(new SecurityConfig("A"));
-
-        assertTrue(!def1.equals(def2));
+        assertFalse(def1.equals(def2));
     }
 
     public void testEqualsHandlingWhenTestObjectHasNoAttributes() {
-        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition();
-        def1.addConfigAttribute(new SecurityConfig("A"));
-        def1.addConfigAttribute(new SecurityConfig("B"));
-
-        ConfigAttributeDefinition def2 = new ConfigAttributeDefinition();
+        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition(ATTRIBUTES);
+        ConfigAttributeDefinition def2 = new ConfigAttributeDefinition(new String[] {});
 
-        assertTrue(!def1.equals(def2));
-        assertTrue(!def2.equals(def1));
+        assertFalse(def1.equals(def2));
+        assertFalse(def2.equals(def1));
     }
 
     public void testNullReturnsNull() {
@@ -134,7 +113,7 @@ public class ConfigAttributeEditorTests extends TestCase {
         editor.setAsText("  HELLO, DOCTOR,NAME,  YESTERDAY ,TOMORROW ");
 
         ConfigAttributeDefinition result = (ConfigAttributeDefinition) editor.getValue();
-        Iterator iter = result.getConfigAttributes();
+        Iterator iter = result.getConfigAttributes().iterator();
 
         ArrayList list = new ArrayList();
 

+ 1 - 1
core/src/test/java/org/springframework/security/MockAccessDecisionManager.java

@@ -30,7 +30,7 @@ public class MockAccessDecisionManager implements AccessDecisionManager {
 
     public void decide(Authentication authentication, Object object, ConfigAttributeDefinition config)
         throws AccessDeniedException {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/test/java/org/springframework/security/MockAfterInvocationManager.java

@@ -29,7 +29,7 @@ public class MockAfterInvocationManager implements AfterInvocationManager {
 
     public Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config,
         Object returnedObject) throws AccessDeniedException {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/test/java/org/springframework/security/MockRunAsManager.java

@@ -29,7 +29,7 @@ public class MockRunAsManager implements RunAsManager {
     //~ Methods ========================================================================================================
 
     public Authentication buildRunAs(Authentication authentication, Object object, ConfigAttributeDefinition config) {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attr = (ConfigAttribute) iter.next();

+ 5 - 15
core/src/test/java/org/springframework/security/afterinvocation/AfterInvocationProviderManagerTests.java

@@ -70,21 +70,11 @@ public class AfterInvocationProviderManagerTests extends TestCase {
         assertEquals(list, manager.getProviders());
         manager.afterPropertiesSet();
 
-        ConfigAttributeDefinition attr1 = new ConfigAttributeDefinition();
-        attr1.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP1"));
-
-        ConfigAttributeDefinition attr2 = new ConfigAttributeDefinition();
-        attr2.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP2"));
-
-        ConfigAttributeDefinition attr3 = new ConfigAttributeDefinition();
-        attr3.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP3"));
-
-        ConfigAttributeDefinition attr2and3 = new ConfigAttributeDefinition();
-        attr2and3.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP2"));
-        attr2and3.addConfigAttribute(new SecurityConfig("GIVE_ME_SWAP3"));
-
-        ConfigAttributeDefinition attr4 = new ConfigAttributeDefinition();
-        attr4.addConfigAttribute(new SecurityConfig("NEVER_CAUSES_SWAP"));
+        ConfigAttributeDefinition attr1 = new ConfigAttributeDefinition(new String[] {"GIVE_ME_SWAP1"});
+        ConfigAttributeDefinition attr2 = new ConfigAttributeDefinition(new String[] {"GIVE_ME_SWAP2"});
+        ConfigAttributeDefinition attr3 = new ConfigAttributeDefinition(new String[] {"GIVE_ME_SWAP3"});
+        ConfigAttributeDefinition attr2and3 = new ConfigAttributeDefinition(new String[] {"GIVE_ME_SWAP2","GIVE_ME_SWAP3"});
+        ConfigAttributeDefinition attr4 = new ConfigAttributeDefinition(new String[] {"NEVER_CAUSES_SWAP"});
 
         assertEquals("swap1", manager.decide(null, new SimpleMethodInvocation(), attr1, "content-before-swapping"));
 

+ 11 - 29
core/src/test/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationCollectionFilteringProviderTests.java

@@ -20,8 +20,6 @@ import junit.framework.TestCase;
 import org.springframework.security.AuthorizationServiceException;
 import org.springframework.security.ConfigAttributeDefinition;
 import org.springframework.security.MockAclManager;
-import org.springframework.security.SecurityConfig;
-
 import org.springframework.security.acl.AclEntry;
 import org.springframework.security.acl.AclManager;
 import org.springframework.security.acl.basic.MockAclObjectIdentity;
@@ -54,14 +52,6 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(BasicAclEntryAfterInvocationCollectionFilteringProviderTests.class);
-    }
-
-    public final void setUp() throws Exception {
-        super.setUp();
-    }
-
     public void testCorrectOperationWhenPrincipalHasIncorrectPermissionToDomainObject()
         throws Exception {
         // Create an AclManager, granting scott only ADMINISTRATION rights
@@ -83,8 +73,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // Filter
         List filteredList = (List) provider.decide(auth, new SimpleMethodInvocation(), attr, list);
@@ -117,8 +106,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // Filter
         List filteredList = (List) provider.decide(auth, new SimpleMethodInvocation(), attr, list);
@@ -152,8 +140,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // Filter
         List filteredList = (List) provider.decide(auth, new SimpleMethodInvocation(), attr, list);
@@ -188,8 +175,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // Filter
         String[] filteredList = (String[]) provider.decide(auth, new SimpleMethodInvocation(), attr, list);
@@ -215,8 +201,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // Filter
         try {
@@ -244,8 +229,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // Filter
         List filteredList = (List) provider.decide(auth, new SimpleMethodInvocation(), attr, null);
@@ -253,8 +237,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
         assertNull(filteredList);
     }
 
-    public void testRespectsModificationsToProcessConfigAttribute()
-        throws Exception {
+    public void testRespectsModificationsToProcessConfigAttribute() throws Exception {
         // Create an AclManager
         AclManager aclManager = new MockAclManager("sydney", "rod",
                 new AclEntry[] {
@@ -279,14 +262,14 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // As no matching config attrib, ensure provider doesn't change list
         assertEquals(4, ((List) provider.decide(auth, new SimpleMethodInvocation(), attr, list)).size());
 
         // Filter, this time with the conf attrib provider setup to answer
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_ADMIN"));
+        attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_ADMIN");
+        //attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_ADMIN"));
 
         List filteredList = (List) provider.decide(auth, new SimpleMethodInvocation(), attr, list);
 
@@ -320,8 +303,7 @@ public class BasicAclEntryAfterInvocationCollectionFilteringProviderTests extend
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_COLLECTION_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_COLLECTION_READ");
 
         // Filter
         List filteredList = (List) provider.decide(auth, new SimpleMethodInvocation(), attr, list);

+ 31 - 56
core/src/test/java/org/springframework/security/afterinvocation/BasicAclEntryAfterInvocationProviderTests.java

@@ -20,8 +20,6 @@ import junit.framework.TestCase;
 import org.springframework.security.AccessDeniedException;
 import org.springframework.security.ConfigAttributeDefinition;
 import org.springframework.security.MockAclManager;
-import org.springframework.security.SecurityConfig;
-
 import org.springframework.security.acl.AclEntry;
 import org.springframework.security.acl.AclManager;
 import org.springframework.security.acl.basic.MockAclObjectIdentity;
@@ -39,32 +37,15 @@ import org.springframework.security.util.SimpleMethodInvocation;
  * @version $Id$
  */
 public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
-    //~ Constructors ===================================================================================================
-
-    public BasicAclEntryAfterInvocationProviderTests() {
-        super();
-    }
-
-    public BasicAclEntryAfterInvocationProviderTests(String arg0) {
-        super(arg0);
-    }
 
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(BasicAclEntryAfterInvocationProviderTests.class);
-    }
-
-    public final void setUp() throws Exception {
-        super.setUp();
-    }
-
     public void testCorrectOperationWhenPrincipalHasIncorrectPermissionToDomainObject()
         throws Exception {
         // Create an AclManager, granting scott only ADMINISTRATION rights
         AclManager aclManager = new MockAclManager("belmont", "scott",
-                new AclEntry[] {
-                    new SimpleAclEntry("scott", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION)
+                new AclEntry[]{
+                        new SimpleAclEntry("scott", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION)
                 });
 
         BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
@@ -73,8 +54,7 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_READ");
 
         try {
             provider.decide(auth, new SimpleMethodInvocation(), attr, "belmont");
@@ -88,11 +68,11 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
         throws Exception {
         // Create an AclManager
         AclManager aclManager = new MockAclManager("belmont", "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
@@ -101,8 +81,7 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("scott", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_READ");
 
         try {
             provider.decide(auth, new SimpleMethodInvocation(), attr, "belmont");
@@ -116,11 +95,11 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
         throws Exception {
         // Create an AclManager
         AclManager aclManager = new MockAclManager("belmont", "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
@@ -130,8 +109,7 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_READ");
 
         // Filter
         assertEquals("belmont", provider.decide(auth, new SimpleMethodInvocation(), attr, "belmont"));
@@ -141,11 +119,11 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
         throws Exception {
         // Create an AclManager
         AclManager aclManager = new MockAclManager("belmont", "rod",
-                new AclEntry[] {
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE),
-                    new MockAclEntry()
+                new AclEntry[]{
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE),
+                        new MockAclEntry()
                 });
 
         BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
@@ -154,8 +132,7 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_READ");
 
         // Filter
         assertNull(provider.decide(auth, new SimpleMethodInvocation(), attr, null));
@@ -165,9 +142,9 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
         throws Exception {
         // Create an AclManager
         AclManager aclManager = new MockAclManager("sydney", "rod",
-                new AclEntry[] {
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new MockAclEntry()
+                new AclEntry[]{
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new MockAclEntry()
                 });
 
         BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
@@ -179,14 +156,13 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_READ");
 
         // As no matching config attrib, ensure provider returns original obj
         assertEquals("sydney", provider.decide(auth, new SimpleMethodInvocation(), attr, "sydney"));
 
         // Filter, this time with the conf attrib provider setup to answer
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_ADMIN"));
+        attr = new ConfigAttributeDefinition("AFTER_ACL_ADMIN");
         assertEquals("sydney", provider.decide(auth, new SimpleMethodInvocation(), attr, "sydney"));
     }
 
@@ -194,22 +170,21 @@ public class BasicAclEntryAfterInvocationProviderTests extends TestCase {
         throws Exception {
         // Create an AclManager
         AclManager aclManager = new MockAclManager("sydney", "rod",
-                new AclEntry[] {
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new MockAclEntry()
+                new AclEntry[]{
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new MockAclEntry()
                 });
 
         BasicAclEntryAfterInvocationProvider provider = new BasicAclEntryAfterInvocationProvider();
         provider.setAclManager(aclManager);
         assertEquals(SimpleAclEntry.READ, provider.getRequirePermission()[0]);
-        provider.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION});
+        provider.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION});
         assertEquals(SimpleAclEntry.ADMINISTRATION, provider.getRequirePermission()[0]);
         provider.afterPropertiesSet();
 
         // Create the Authentication and Config Attribs we'll be presenting
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("rod", "NOT_USED");
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("AFTER_ACL_READ"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("AFTER_ACL_READ");
 
         // Filter
         assertEquals("sydney", provider.decide(auth, new SimpleMethodInvocation(), attr, "sydney"));

+ 2 - 5
core/src/test/java/org/springframework/security/captcha/CaptchaChannelProcessorTemplateTests.java

@@ -68,8 +68,7 @@ public class CaptchaChannelProcessorTemplateTests extends TestCase {
         CaptchaChannelProcessorTemplate processor = new TestHumanityCaptchaChannelProcessor();
         processor.setKeyword("X");
 
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("Y"));
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition("Y");
 
         CaptchaSecurityContext context = new CaptchaSecurityContextImpl();
         SecurityContextHolder.setContext(context);
@@ -135,9 +134,7 @@ public class CaptchaChannelProcessorTemplateTests extends TestCase {
         CaptchaChannelProcessorTemplate processor = new TestHumanityCaptchaChannelProcessor();
         processor.setKeyword("X");
 
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("X"));
-
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition("X");
         CaptchaSecurityContext context = new CaptchaSecurityContextImpl();
         SecurityContextHolder.setContext(context);
 

+ 8 - 8
core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java

@@ -133,13 +133,13 @@ public class HttpSecurityBeanDefinitionParserTests {
         FilterSecurityInterceptor fis = (FilterSecurityInterceptor) appContext.getBean(BeanIds.FILTER_SECURITY_INTERCEPTOR);
 
         FilterInvocationDefinitionSource fids = fis.getObjectDefinitionSource();
-        ConfigAttributeDefinition attrs = fids.getAttributes(createFilterinvocation("/Secure", null));
-        assertEquals(2, attrs.size());
-        assertTrue(attrs.contains(new SecurityConfig("ROLE_A")));
-        assertTrue(attrs.contains(new SecurityConfig("ROLE_B")));
-        attrs = fids.getAttributes(createFilterinvocation("/secure", null));
-        assertEquals(1, attrs.size());
-        assertTrue(attrs.contains(new SecurityConfig("ROLE_C")));
+        ConfigAttributeDefinition attrDef = fids.getAttributes(createFilterinvocation("/Secure", null));
+        assertEquals(2, attrDef.getConfigAttributes().size());
+        assertTrue(attrDef.contains(new SecurityConfig("ROLE_A")));
+        assertTrue(attrDef.contains(new SecurityConfig("ROLE_B")));
+        attrDef = fids.getAttributes(createFilterinvocation("/secure", null));
+        assertEquals(1, attrDef.getConfigAttributes().size());
+        assertTrue(attrDef.contains(new SecurityConfig("ROLE_C")));
     }
 
     @Test
@@ -154,7 +154,7 @@ public class HttpSecurityBeanDefinitionParserTests {
         FilterSecurityInterceptor fis = (FilterSecurityInterceptor) appContext.getBean(BeanIds.FILTER_SECURITY_INTERCEPTOR);
         FilterInvocationDefinitionSource fids = fis.getObjectDefinitionSource();
         ConfigAttributeDefinition attrs = fids.getAttributes(createFilterinvocation("/secure", "POST"));
-        assertEquals(2, attrs.size());
+        assertEquals(2, attrs.getConfigAttributes().size());
         assertTrue(attrs.contains(new SecurityConfig("ROLE_A")));
         assertTrue(attrs.contains(new SecurityConfig("ROLE_B")));
     }

+ 2 - 6
core/src/test/java/org/springframework/security/event/authorization/AuthenticationCredentialsNotFoundEventTests.java

@@ -42,13 +42,9 @@ public class AuthenticationCredentialsNotFoundEventTests extends TestCase {
 
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(AuthenticationCredentialsNotFoundEventTests.class);
-    }
-
     public void testRejectsNulls() {
         try {
-            new AuthenticationCredentialsNotFoundEvent(null, new ConfigAttributeDefinition(),
+            new AuthenticationCredentialsNotFoundEvent(null, new ConfigAttributeDefinition(new String[] {}),
                 new AuthenticationCredentialsNotFoundException("test"));
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
@@ -64,7 +60,7 @@ public class AuthenticationCredentialsNotFoundEventTests extends TestCase {
         }
 
         try {
-            new AuthenticationCredentialsNotFoundEvent(new SimpleMethodInvocation(), new ConfigAttributeDefinition(),
+            new AuthenticationCredentialsNotFoundEvent(new SimpleMethodInvocation(), new ConfigAttributeDefinition(new String[] {}),
                 null);
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {

+ 3 - 3
core/src/test/java/org/springframework/security/event/authorization/AuthorizationFailureEventTests.java

@@ -52,7 +52,7 @@ public class AuthorizationFailureEventTests extends TestCase {
 
     public void testRejectsNulls() {
         try {
-            new AuthorizationFailureEvent(null, new ConfigAttributeDefinition(),
+            new AuthorizationFailureEvent(null, ConfigAttributeDefinition.NO_ATTRIBUTES,
                 new UsernamePasswordAuthenticationToken("foo", "bar"), new AccessDeniedException("error"));
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
@@ -68,7 +68,7 @@ public class AuthorizationFailureEventTests extends TestCase {
         }
 
         try {
-            new AuthorizationFailureEvent(new SimpleMethodInvocation(), new ConfigAttributeDefinition(), null,
+            new AuthorizationFailureEvent(new SimpleMethodInvocation(), ConfigAttributeDefinition.NO_ATTRIBUTES, null,
                 new AccessDeniedException("error"));
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
@@ -76,7 +76,7 @@ public class AuthorizationFailureEventTests extends TestCase {
         }
 
         try {
-            new AuthorizationFailureEvent(new SimpleMethodInvocation(), new ConfigAttributeDefinition(),
+            new AuthorizationFailureEvent(new SimpleMethodInvocation(), ConfigAttributeDefinition.NO_ATTRIBUTES,
                 new UsernamePasswordAuthenticationToken("foo", "bar"), null);
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {

+ 2 - 6
core/src/test/java/org/springframework/security/event/authorization/AuthorizedEventTests.java

@@ -43,13 +43,9 @@ public class AuthorizedEventTests extends TestCase {
 
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(AuthorizedEventTests.class);
-    }
-
     public void testRejectsNulls() {
         try {
-            new AuthorizedEvent(null, new ConfigAttributeDefinition(),
+            new AuthorizedEvent(null, ConfigAttributeDefinition.NO_ATTRIBUTES,
                 new UsernamePasswordAuthenticationToken("foo", "bar"));
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
@@ -65,7 +61,7 @@ public class AuthorizedEventTests extends TestCase {
         }
 
         try {
-            new AuthorizedEvent(new SimpleMethodInvocation(), new ConfigAttributeDefinition(), null);
+            new AuthorizedEvent(new SimpleMethodInvocation(), ConfigAttributeDefinition.NO_ATTRIBUTES, null);
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
             assertTrue(true);

+ 1 - 7
core/src/test/java/org/springframework/security/intercept/InterceptorStatusTokenTests.java

@@ -46,10 +46,6 @@ public class InterceptorStatusTokenTests extends TestCase {
 
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(InterceptorStatusTokenTests.class);
-    }
-
     public void testNoArgConstructorDoesntExist() {
         Class clazz = InterceptorStatusToken.class;
 
@@ -62,9 +58,7 @@ public class InterceptorStatusTokenTests extends TestCase {
     }
 
     public void testOperation() {
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO"));
-
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO");
         MethodInvocation mi = new SimpleMethodInvocation();
 
         InterceptorStatusToken token = new InterceptorStatusToken(new UsernamePasswordAuthenticationToken("rod",

+ 5 - 6
core/src/test/java/org/springframework/security/intercept/method/MethodDefinitionAttributesTests.java

@@ -71,7 +71,8 @@ public class MethodDefinitionAttributesTests extends TestCase {
     }
 
     private ConfigAttributeDefinition getConfigAttributeDefinition(Class clazz, String methodName, Class[] args)
-        throws Exception {
+            throws Exception {
+        
         final Method method = clazz.getMethod(methodName, args);
         MethodDefinitionAttributes source = new MethodDefinitionAttributes();
         source.setAttributes(new MockAttributes());
@@ -96,8 +97,7 @@ public class MethodDefinitionAttributesTests extends TestCase {
         super.setUp();
     }
 
-    public void testAttributesForInterfaceTargetObject()
-        throws Exception {
+    public void testAttributesForInterfaceTargetObject() throws Exception {
         ConfigAttributeDefinition def1 = getConfigAttributeDefinition(ITargetObject.class, "countLength",
                 new Class[] {String.class});
         Set set1 = toSet(def1);
@@ -190,8 +190,7 @@ public class MethodDefinitionAttributesTests extends TestCase {
         assertEquals("HELLO org.springframework.security.MockRunAsAuthenticationToken true", result);
     }
 
-    public void testMethodCallWithoutRunAsReplacement()
-        throws Exception {
+    public void testMethodCallWithoutRunAsReplacement() throws Exception {
         UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("Test", "Password",
                 new GrantedAuthority[] {new GrantedAuthorityImpl("MOCK_INTERFACE_METHOD_MAKE_LOWER_CASE")});
         SecurityContextHolder.getContext().setAuthentication(token);
@@ -219,7 +218,7 @@ public class MethodDefinitionAttributesTests extends TestCase {
      */
     private Set toSet(ConfigAttributeDefinition def) {
         Set set = new HashSet();
-        Iterator i = def.getConfigAttributes();
+        Iterator i = def.getConfigAttributes().iterator();
 
         while (i.hasNext()) {
             ConfigAttribute a = (ConfigAttribute) i.next();

+ 10 - 19
core/src/test/java/org/springframework/security/intercept/method/MethodDefinitionSourceEditorTests.java

@@ -64,10 +64,8 @@ public class MethodDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returnedCountLength = map.getAttributes(joinPoint);
 
-        ConfigAttributeDefinition expectedCountLength = new ConfigAttributeDefinition();
-        expectedCountLength.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
-        expectedCountLength.addConfigAttribute(new SecurityConfig("ROLE_TWO"));
-        expectedCountLength.addConfigAttribute(new SecurityConfig("RUN_AS_ENTRY"));
+        ConfigAttributeDefinition expectedCountLength =
+                new ConfigAttributeDefinition(new String[] {"ROLE_ONE", "ROLE_TWO", "RUN_AS_ENTRY"});
         assertEquals(expectedCountLength, returnedCountLength);
     }
 
@@ -115,15 +113,13 @@ public class MethodDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returnedMakeLower = map.getAttributes(new MockMethodInvocation(TargetObject.class,
                     "makeLowerCase", new Class[] {String.class}));
-        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition();
-        expectedMakeLower.addConfigAttribute(new SecurityConfig("ROLE_FROM_INTERFACE"));
+        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition("ROLE_FROM_INTERFACE");
         assertEquals(expectedMakeLower, returnedMakeLower);
 
         ConfigAttributeDefinition returnedMakeUpper = map.getAttributes(new MockMethodInvocation(TargetObject.class,
                     "makeUpperCase", new Class[] {String.class}));
-        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition();
-        expectedMakeUpper.addConfigAttribute(new SecurityConfig("ROLE_FROM_IMPLEMENTATION"));
-        expectedMakeUpper.addConfigAttribute(new SecurityConfig("ROLE_FROM_INTERFACE"));
+        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition(
+                new String[]{"ROLE_FROM_IMPLEMENTATION","ROLE_FROM_INTERFACE"});
         assertEquals(expectedMakeUpper, returnedMakeUpper);
     }
 
@@ -171,20 +167,17 @@ public class MethodDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returnedMakeLower = map.getAttributes(new MockMethodInvocation(TargetObject.class,
                     "makeLowerCase", new Class[] {String.class}));
-        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition();
-        expectedMakeLower.addConfigAttribute(new SecurityConfig("ROLE_LOWER"));
+        ConfigAttributeDefinition expectedMakeLower = new ConfigAttributeDefinition("ROLE_LOWER");
         assertEquals(expectedMakeLower, returnedMakeLower);
 
         ConfigAttributeDefinition returnedMakeUpper = map.getAttributes(new MockMethodInvocation(TargetObject.class,
                     "makeUpperCase", new Class[] {String.class}));
-        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition();
-        expectedMakeUpper.addConfigAttribute(new SecurityConfig("ROLE_UPPER"));
+        ConfigAttributeDefinition expectedMakeUpper = new ConfigAttributeDefinition("ROLE_UPPER");
         assertEquals(expectedMakeUpper, returnedMakeUpper);
 
         ConfigAttributeDefinition returnedCountLength = map.getAttributes(new MockMethodInvocation(TargetObject.class,
                     "countLength", new Class[] {String.class}));
-        ConfigAttributeDefinition expectedCountLength = new ConfigAttributeDefinition();
-        expectedCountLength.addConfigAttribute(new SecurityConfig("ROLE_GENERAL"));
+        ConfigAttributeDefinition expectedCountLength = new ConfigAttributeDefinition("ROLE_GENERAL");
         assertEquals(expectedCountLength, returnedCountLength);
     }
 
@@ -215,10 +208,8 @@ public class MethodDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returnedCountLength = map.getAttributes(new MockMethodInvocation(TargetObject.class,
                     "countLength", new Class[] {String.class}));
-        ConfigAttributeDefinition expectedCountLength = new ConfigAttributeDefinition();
-        expectedCountLength.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
-        expectedCountLength.addConfigAttribute(new SecurityConfig("ROLE_TWO"));
-        expectedCountLength.addConfigAttribute(new SecurityConfig("RUN_AS_ENTRY"));
+        ConfigAttributeDefinition expectedCountLength = new ConfigAttributeDefinition(
+                new String[] {"ROLE_ONE", "ROLE_TWO", "RUN_AS_ENTRY"});
         assertEquals(expectedCountLength, returnedCountLength);
     }
 

+ 4 - 16
core/src/test/java/org/springframework/security/intercept/method/MockMethodDefinitionSource.java

@@ -26,7 +26,6 @@ import java.util.Vector;
 
 
 /**
- * DOCUMENT ME!
  *
  * @author Ben Alex
  * @version $Id$
@@ -43,34 +42,23 @@ public class MockMethodDefinitionSource extends AbstractMethodDefinitionSource {
         returnAnIterator = returnAnIteratorWhenRequested;
         list = new Vector();
 
-        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition();
-        def1.addConfigAttribute(new SecurityConfig("MOCK_LOWER"));
+        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition("MOCK_LOWER");
         list.add(def1);
 
         if (includeInvalidAttributes) {
-            ConfigAttributeDefinition def2 = new ConfigAttributeDefinition();
-            def2.addConfigAttribute(new SecurityConfig("MOCK_LOWER"));
-            def2.addConfigAttribute(new SecurityConfig("INVALID_ATTRIBUTE"));
+            ConfigAttributeDefinition def2 = new ConfigAttributeDefinition(new String[] {"MOCK_LOWER","INVALID_ATTRIBUTE"});
             list.add(def2);
         }
 
-        ConfigAttributeDefinition def3 = new ConfigAttributeDefinition();
-        def3.addConfigAttribute(new SecurityConfig("MOCK_UPPER"));
-        def3.addConfigAttribute(new SecurityConfig("RUN_AS_"));
+        ConfigAttributeDefinition def3 = new ConfigAttributeDefinition(new String[] {"MOCK_UPPER", "RUN_AS_"});
         list.add(def3);
 
         if (includeInvalidAttributes) {
-            ConfigAttributeDefinition def4 = new ConfigAttributeDefinition();
-            def4.addConfigAttribute(new SecurityConfig("MOCK_SOMETHING"));
-            def4.addConfigAttribute(new SecurityConfig("ANOTHER_INVALID"));
+            ConfigAttributeDefinition def4 = new ConfigAttributeDefinition(new String[] {"MOCK_SOMETHING", "ANOTHER_INVALID"});
             list.add(def4);
         }
     }
 
-    private MockMethodDefinitionSource() {
-        super();
-    }
-
     //~ Methods ========================================================================================================
 
     public Iterator getConfigAttributeDefinitions() {

+ 11 - 24
core/src/test/java/org/springframework/security/intercept/web/DefaultFilterInvocationDefinitionSourceTests.java

@@ -52,8 +52,7 @@ public class DefaultFilterInvocationDefinitionSourceTests {
 
     @Test
     public void lookupNotRequiringExactMatchSuccessIfNotMatching() {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/secure/super/**", def);
 
         FilterInvocation fi = createFilterInvocation("/SeCuRE/super/somefile.html", null);
@@ -67,8 +66,7 @@ public class DefaultFilterInvocationDefinitionSourceTests {
      */
     @Test
     public void lookupNotRequiringExactMatchSucceedsIfSecureUrlPathContainsUpperCase() {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/SeCuRE/super/**", def);
 
         FilterInvocation fi = createFilterInvocation("/secure/super/somefile.html", null);
@@ -81,8 +79,7 @@ public class DefaultFilterInvocationDefinitionSourceTests {
     @Test
     public void lookupRequiringExactMatchFailsIfNotMatching() {
         map = new DefaultFilterInvocationDefinitionSource(new AntUrlPathMatcher(false));
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/secure/super/**", def);
 
         FilterInvocation fi = createFilterInvocation("/SeCuRE/super/somefile.html", null);
@@ -94,8 +91,7 @@ public class DefaultFilterInvocationDefinitionSourceTests {
     @Test
     public void lookupRequiringExactMatchIsSuccessful() {
         map = new DefaultFilterInvocationDefinitionSource(new AntUrlPathMatcher(false));
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/SeCurE/super/**", def);
 
         FilterInvocation fi = createFilterInvocation("/SeCurE/super/somefile.html", null);
@@ -106,8 +102,7 @@ public class DefaultFilterInvocationDefinitionSourceTests {
 
     @Test
     public void lookupRequiringExactMatchWithAdditionalSlashesIsSuccessful() {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/someAdminPage.html**", def);
 
         FilterInvocation fi = createFilterInvocation("/someAdminPage.html?a=/test", null);
@@ -118,15 +113,13 @@ public class DefaultFilterInvocationDefinitionSourceTests {
 
     @Test(expected = IllegalArgumentException.class)
     public void unknownHttpMethodIsRejected() {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/someAdminPage.html**", "UNKNOWN", def);
     }
 
     @Test
     public void httpMethodLookupSucceeds() {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/somepage**", "GET", def);
 
         FilterInvocation fi = createFilterInvocation("/somepage", "GET");
@@ -136,8 +129,7 @@ public class DefaultFilterInvocationDefinitionSourceTests {
 
     @Test
     public void requestWithDifferentHttpMethodDoesntMatch() {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/somepage**", "GET", def);
 
         FilterInvocation fi = createFilterInvocation("/somepage", null);
@@ -147,15 +139,11 @@ public class DefaultFilterInvocationDefinitionSourceTests {
 
     @Test
     public void httpMethodSpecificUrlTakesPrecedence() {
-
-
         // Even though this is added before the method-specific def, the latter should match
-        ConfigAttributeDefinition allMethodDef = new ConfigAttributeDefinition();
-        allMethodDef.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition allMethodDef = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/**", null, allMethodDef);
 
-        ConfigAttributeDefinition postOnlyDef = new ConfigAttributeDefinition();
-        postOnlyDef.addConfigAttribute(new SecurityConfig("ROLE_TWO"));
+        ConfigAttributeDefinition postOnlyDef = new ConfigAttributeDefinition("ROLE_TWO");
         map.addSecureUrl("/somepage**", "POST", postOnlyDef);
 
         FilterInvocation fi = createFilterInvocation("/somepage", "POST");
@@ -168,8 +156,7 @@ public class DefaultFilterInvocationDefinitionSourceTests {
      */
     @Test
     public void extraQuestionMarkStillMatches() {        
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("ROLE_ONE"));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("ROLE_ONE");
         map.addSecureUrl("/someAdminPage.html*", def);
 
         FilterInvocation fi = createFilterInvocation("/someAdminPage.html?x=2/aa?y=3", null);

+ 6 - 19
core/src/test/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditorTests.java

@@ -201,9 +201,8 @@ public class FilterInvocationDefinitionSourceEditorTests extends TestCase {
         ConfigAttributeDefinition returned = map.getAttributes(new FilterInvocation(httpRequest,
                     new MockHttpServletResponse(), new MockFilterChain()));
 
-        ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
-        expected.addConfigAttribute(new SecurityConfig("ROLE_WE_DONT_HAVE"));
-        expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
+        ConfigAttributeDefinition expected = new ConfigAttributeDefinition(
+                new String[] {"ROLE_WE_DONT_HAVE", "ANOTHER_ROLE"});
 
         assertEquals(expected, returned);
     }
@@ -220,10 +219,7 @@ public class FilterInvocationDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returned = map.getAttributes(new FilterInvocation(httpRequest,
                     new MockHttpServletResponse(), new MockFilterChain()));
-
-        ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
-        expected.addConfigAttribute(new SecurityConfig("ROLE_SUPERVISOR"));
-        expected.addConfigAttribute(new SecurityConfig("ROLE_TELLER"));
+        ConfigAttributeDefinition expected = new ConfigAttributeDefinition(new String[] {"ROLE_SUPERVISOR", "ROLE_TELLER"});
 
         assertEquals(expected, returned);
     }
@@ -239,10 +235,7 @@ public class FilterInvocationDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returned = map.getAttributes(new FilterInvocation(httpRequest,
                     new MockHttpServletResponse(), new MockFilterChain()));
-
-        ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
-        expected.addConfigAttribute(new SecurityConfig("ROLE_WE_DONT_HAVE"));
-        expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
+        ConfigAttributeDefinition expected = new ConfigAttributeDefinition(new String[] {"ROLE_WE_DONT_HAVE", "ANOTHER_ROLE"});
 
         assertEquals(expected, returned);
     }
@@ -258,10 +251,7 @@ public class FilterInvocationDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returned = map.getAttributes(new FilterInvocation(httpRequest,
                     new MockHttpServletResponse(), new MockFilterChain()));
-
-        ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
-        expected.addConfigAttribute(new SecurityConfig("ROLE_WE_DONT_HAVE"));
-        expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
+        ConfigAttributeDefinition expected = new ConfigAttributeDefinition(new String[] {"ROLE_WE_DONT_HAVE", "ANOTHER_ROLE"});
 
         assertEquals(expected, returned);
     }
@@ -305,10 +295,7 @@ public class FilterInvocationDefinitionSourceEditorTests extends TestCase {
 
         ConfigAttributeDefinition returned = map.getAttributes(new FilterInvocation(httpRequest,
                     new MockHttpServletResponse(), new MockFilterChain()));
-
-        ConfigAttributeDefinition expected = new ConfigAttributeDefinition();
-        expected.addConfigAttribute(new SecurityConfig("ROLE_WE_DONT_HAVE"));
-        expected.addConfigAttribute(new SecurityConfig("ANOTHER_ROLE"));
+        ConfigAttributeDefinition expected = new ConfigAttributeDefinition(new String[] {"ROLE_WE_DONT_HAVE", "ANOTHER_ROLE"});
 
         assertEquals(expected, returned);
     }

+ 6 - 16
core/src/test/java/org/springframework/security/intercept/web/FilterSecurityInterceptorTests.java

@@ -42,6 +42,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.LinkedHashMap;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
@@ -147,9 +148,7 @@ public class FilterSecurityInterceptorTests extends TestCase {
         interceptor.setApplicationEventPublisher(MockApplicationContext.getContext());
 
         // Setup a mock config attribute definition
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("MOCK_OK"));
-
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("MOCK_OK");
         MockFilterInvocationDefinitionMap mockSource = new MockFilterInvocationDefinitionMap("/secure/page.html", def);
         interceptor.setObjectDefinitionSource(mockSource);
 
@@ -202,9 +201,7 @@ public class FilterSecurityInterceptorTests extends TestCase {
         interceptor.setApplicationEventPublisher(MockApplicationContext.getContext());
 
         // Setup a mock config attribute definition
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("MOCK_OK"));
-
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("MOCK_OK");
         MockFilterInvocationDefinitionMap mockSource = new MockFilterInvocationDefinitionMap("/secure/page.html", def);
         interceptor.setObjectDefinitionSource(mockSource);
 
@@ -227,19 +224,12 @@ public class FilterSecurityInterceptorTests extends TestCase {
     }
 
     public void testNotLoadedFromApplicationContext() throws Exception {
-        FilterInvocationDefinitionSourceMapping mapping = new FilterInvocationDefinitionSourceMapping();
-        mapping.setUrl("/secure/**");
-        mapping.addConfigAttribute("ROLE_USER");
-
-        List mappings = new ArrayList(1);
-        mappings.add(mapping);
-
-        DefaultFilterInvocationDefinitionSource filterInvocationDefinitionSource
+        DefaultFilterInvocationDefinitionSource fids
                 = new DefaultFilterInvocationDefinitionSource(new AntUrlPathMatcher());
-        filterInvocationDefinitionSource.setMappings(mappings);
+        fids.addSecureUrl("/secure/**", null, new ConfigAttributeDefinition(new String[] {"ROLE_USER"}));
 
         FilterSecurityInterceptor filter = new FilterSecurityInterceptor();
-        filter.setObjectDefinitionSource(filterInvocationDefinitionSource);
+        filter.setObjectDefinitionSource(fids);
 
         MockFilterChain filterChain = new MockFilterChain();
         filterChain.expectToProceed = true;

+ 4 - 11
core/src/test/java/org/springframework/security/intercept/web/MockFilterInvocationDefinitionSource.java

@@ -43,26 +43,19 @@ public class MockFilterInvocationDefinitionSource extends DefaultFilterInvocatio
         returnAnIterator = returnAnIteratorWhenRequested;
         list = new Vector();
 
-        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition();
-        def1.addConfigAttribute(new SecurityConfig("MOCK_LOWER"));
+        ConfigAttributeDefinition def1 = new ConfigAttributeDefinition("MOCK_LOWER");
         list.add(def1);
 
         if (includeInvalidAttributes) {
-            ConfigAttributeDefinition def2 = new ConfigAttributeDefinition();
-            def2.addConfigAttribute(new SecurityConfig("MOCK_LOWER"));
-            def2.addConfigAttribute(new SecurityConfig("INVALID_ATTRIBUTE"));
+            ConfigAttributeDefinition def2 = new ConfigAttributeDefinition(new String[] {"MOCK_LOWER", "INVALID_ATTRIBUTE"});
             list.add(def2);
         }
 
-        ConfigAttributeDefinition def3 = new ConfigAttributeDefinition();
-        def3.addConfigAttribute(new SecurityConfig("MOCK_UPPER"));
-        def3.addConfigAttribute(new SecurityConfig("RUN_AS"));
+        ConfigAttributeDefinition def3 = new ConfigAttributeDefinition(new String[] {"MOCK_UPPER","RUN_AS"});
         list.add(def3);
 
         if (includeInvalidAttributes) {
-            ConfigAttributeDefinition def4 = new ConfigAttributeDefinition();
-            def4.addConfigAttribute(new SecurityConfig("MOCK_SOMETHING"));
-            def4.addConfigAttribute(new SecurityConfig("ANOTHER_INVALID"));
+            ConfigAttributeDefinition def4 = new ConfigAttributeDefinition(new String[] {"MOCK_SOMETHING","ANOTHER_INVALID"});
             list.add(def4);
         }
     }

+ 4 - 11
core/src/test/java/org/springframework/security/runas/RunAsManagerImplTests.java

@@ -61,9 +61,7 @@ public class RunAsManagerImplTests extends TestCase {
 
     public void testDoesNotReturnAdditionalAuthoritiesIfCalledWithoutARunAsSetting()
         throws Exception {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("SOMETHING_WE_IGNORE"));
-
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("SOMETHING_WE_IGNORE");
         UsernamePasswordAuthenticationToken inputToken = new UsernamePasswordAuthenticationToken("Test", "Password",
                 new GrantedAuthority[] {new GrantedAuthorityImpl("ROLE_ONE"), new GrantedAuthorityImpl("ROLE_TWO")});
 
@@ -75,9 +73,7 @@ public class RunAsManagerImplTests extends TestCase {
     }
 
     public void testRespectsRolePrefix() throws Exception {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("RUN_AS_SOMETHING"));
-
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("RUN_AS_SOMETHING");
         UsernamePasswordAuthenticationToken inputToken = new UsernamePasswordAuthenticationToken("Test", "Password",
                 new GrantedAuthority[] {new GrantedAuthorityImpl("ONE"), new GrantedAuthorityImpl("TWO")});
 
@@ -101,11 +97,8 @@ public class RunAsManagerImplTests extends TestCase {
         assertEquals("my_password".hashCode(), resultCast.getKeyHash());
     }
 
-    public void testReturnsAdditionalGrantedAuthorities()
-        throws Exception {
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig("RUN_AS_SOMETHING"));
-
+    public void testReturnsAdditionalGrantedAuthorities() throws Exception {
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition("RUN_AS_SOMETHING");
         UsernamePasswordAuthenticationToken inputToken = new UsernamePasswordAuthenticationToken("Test", "Password",
                 new GrantedAuthority[] {new GrantedAuthorityImpl("ROLE_ONE"), new GrantedAuthorityImpl("ROLE_TWO")});
 

+ 4 - 8
core/src/test/java/org/springframework/security/securechannel/ChannelDecisionManagerImplTests.java

@@ -95,8 +95,7 @@ public class ChannelDecisionManagerImplTests extends TestCase {
         MockFilterChain chain = new MockFilterChain();
         FilterInvocation fi = new FilterInvocation(request, response, chain);
 
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("xyz"));
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition("xyz");
 
         cdm.decide(fi, cad);
         assertTrue(fi.getResponse().isCommitted());
@@ -115,9 +114,7 @@ public class ChannelDecisionManagerImplTests extends TestCase {
         MockFilterChain chain = new MockFilterChain();
         FilterInvocation fi = new FilterInvocation(request, response, chain);
 
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("abc"));
-        cad.addConfigAttribute(new SecurityConfig("ANY_CHANNEL"));
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition(new String[]{"abc", "ANY_CHANNEL"});
 
         cdm.decide(fi, cad);
         assertFalse(fi.getResponse().isCommitted());
@@ -138,8 +135,7 @@ public class ChannelDecisionManagerImplTests extends TestCase {
         MockFilterChain chain = new MockFilterChain();
         FilterInvocation fi = new FilterInvocation(request, response, chain);
 
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("SOME_ATTRIBUTE_NO_PROCESSORS_SUPPORT"));
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition("SOME_ATTRIBUTE_NO_PROCESSORS_SUPPORT");
 
         cdm.decide(fi, cad);
         assertFalse(fi.getResponse().isCommitted());
@@ -198,7 +194,7 @@ public class ChannelDecisionManagerImplTests extends TestCase {
 
         public void decide(FilterInvocation invocation, ConfigAttributeDefinition config)
                 throws IOException, ServletException {
-            Iterator iter = config.getConfigAttributes();
+            Iterator iter = config.getConfigAttributes().iterator();
 
             if (failIfCalled) {
                 fail("Should not have called this channel processor: " + configAttribute);

+ 7 - 17
core/src/test/java/org/springframework/security/securechannel/ChannelProcessingFilterTests.java

@@ -52,9 +52,7 @@ public class ChannelProcessingFilterTests extends TestCase {
         throws Exception {
         ChannelProcessingFilter filter = new ChannelProcessingFilter();
 
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("MOCK"));
-
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("MOCK");
         MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path", attr, true);
         filter.setFilterInvocationDefinitionSource(fids);
 
@@ -83,8 +81,7 @@ public class ChannelProcessingFilterTests extends TestCase {
         ChannelProcessingFilter filter = new ChannelProcessingFilter();
         filter.setChannelDecisionManager(new MockChannelDecisionManager(false, "SUPPORTS_MOCK_ONLY"));
 
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("SUPPORTS_MOCK_ONLY"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("SUPPORTS_MOCK_ONLY");
 
         MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path", attr, true);
 
@@ -99,10 +96,7 @@ public class ChannelProcessingFilterTests extends TestCase {
         ChannelProcessingFilter filter = new ChannelProcessingFilter();
         filter.setChannelDecisionManager(new MockChannelDecisionManager(false, "SUPPORTS_MOCK_ONLY"));
 
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("SUPPORTS_MOCK_ONLY"));
-        attr.addConfigAttribute(new SecurityConfig("INVALID_ATTRIBUTE"));
-
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition(new String[] {"SUPPORTS_MOCK_ONLY", "INVALID_ATTRIBUTE"});
         MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path", attr, true);
 
         filter.setFilterInvocationDefinitionSource(fids);
@@ -120,8 +114,7 @@ public class ChannelProcessingFilterTests extends TestCase {
         ChannelProcessingFilter filter = new ChannelProcessingFilter();
         filter.setChannelDecisionManager(new MockChannelDecisionManager(true, "SOME_ATTRIBUTE"));
 
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("SOME_ATTRIBUTE"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("SOME_ATTRIBUTE");
 
         MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path", attr, true);
 
@@ -143,8 +136,7 @@ public class ChannelProcessingFilterTests extends TestCase {
         ChannelProcessingFilter filter = new ChannelProcessingFilter();
         filter.setChannelDecisionManager(new MockChannelDecisionManager(false, "SOME_ATTRIBUTE"));
 
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("SOME_ATTRIBUTE"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("SOME_ATTRIBUTE");
 
         MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path", attr, true);
 
@@ -166,8 +158,7 @@ public class ChannelProcessingFilterTests extends TestCase {
         ChannelProcessingFilter filter = new ChannelProcessingFilter();
         filter.setChannelDecisionManager(new MockChannelDecisionManager(false, "NOT_USED"));
 
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("NOT_USED"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("NOT_USED");
 
         MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path", attr, true);
 
@@ -211,8 +202,7 @@ public class ChannelProcessingFilterTests extends TestCase {
         filter.setChannelDecisionManager(new MockChannelDecisionManager(false, "MOCK"));
         assertTrue(filter.getChannelDecisionManager() != null);
 
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("MOCK"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("MOCK");
 
         MockFilterInvocationDefinitionMap fids = new MockFilterInvocationDefinitionMap("/path", attr, false);
 

+ 2 - 6
core/src/test/java/org/springframework/security/securechannel/InsecureChannelProcessorTests.java

@@ -45,9 +45,7 @@ public class InsecureChannelProcessorTests extends TestCase {
     }
 
     public void testDecideDetectsAcceptableChannel() throws Exception {
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
-        cad.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition(new String[]{"SOME_IGNORED_ATTRIBUTE", "REQUIRES_INSECURE_CHANNEL"});
 
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setQueryString("info=true");
@@ -69,9 +67,7 @@ public class InsecureChannelProcessorTests extends TestCase {
 
     public void testDecideDetectsUnacceptableChannel()
         throws Exception {
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
-        cad.addConfigAttribute(new SecurityConfig("REQUIRES_INSECURE_CHANNEL"));
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition(new String[]{"SOME_IGNORED_ATTRIBUTE", "REQUIRES_INSECURE_CHANNEL"});
 
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setQueryString("info=true");

+ 3 - 16
core/src/test/java/org/springframework/security/securechannel/SecureChannelProcessorTests.java

@@ -36,18 +36,8 @@ import org.springframework.mock.web.MockHttpServletResponse;
 public class SecureChannelProcessorTests extends TestCase {
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(SecureChannelProcessorTests.class);
-    }
-
-    public final void setUp() throws Exception {
-        super.setUp();
-    }
-
     public void testDecideDetectsAcceptableChannel() throws Exception {
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
-        cad.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition(new String[]{"SOME_IGNORED_ATTRIBUTE", "REQUIRES_SECURE_CHANNEL"});
 
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setQueryString("info=true");
@@ -68,11 +58,8 @@ public class SecureChannelProcessorTests extends TestCase {
         assertFalse(fi.getResponse().isCommitted());
     }
 
-    public void testDecideDetectsUnacceptableChannel()
-        throws Exception {
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new SecurityConfig("SOME_IGNORED_ATTRIBUTE"));
-        cad.addConfigAttribute(new SecurityConfig("REQUIRES_SECURE_CHANNEL"));
+    public void testDecideDetectsUnacceptableChannel() throws Exception {
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition(new String[]{"SOME_IGNORED_ATTRIBUTE", "REQUIRES_SECURE_CHANNEL"});
 
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setQueryString("info=true");

+ 3 - 6
core/src/test/java/org/springframework/security/util/FilterChainProxyTests.java

@@ -34,6 +34,8 @@ import org.springframework.security.intercept.web.DefaultFilterInvocationDefinit
 import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;
 
 import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 /**
  * Tests {@link FilterChainProxy}.
@@ -69,8 +71,6 @@ public class FilterChainProxyTests {
             filterChainProxy.afterPropertiesSet();
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
-            assertEquals("FilterChainProxy requires the FilterInvocationDefinitionSource to return a non-null response to getConfigAttributeDefinitions()",
-                expected.getMessage());
         }
     }
 
@@ -79,8 +79,7 @@ public class FilterChainProxyTests {
         FilterChainProxy filterChainProxy = new FilterChainProxy();
         filterChainProxy.setApplicationContext(MockApplicationContext.getContext());
 
-        ConfigAttributeDefinition cad = new ConfigAttributeDefinition();
-        cad.addConfigAttribute(new MockConfigAttribute());
+        ConfigAttributeDefinition cad = new ConfigAttributeDefinition(new MockConfigAttribute());
 
         DefaultFilterInvocationDefinitionSource fids =
                 new DefaultFilterInvocationDefinitionSource(new AntUrlPathMatcher());
@@ -93,8 +92,6 @@ public class FilterChainProxyTests {
             filterChainProxy.init(new MockFilterConfig());
             fail("Should have thrown IllegalArgumentException");
         } catch (IllegalArgumentException expected) {
-            assertTrue(expected.getMessage()
-                               .endsWith("returned null to the getAttribute() method, which is invalid when used with FilterChainProxy"));
         }
     }
 

+ 6 - 14
core/src/test/java/org/springframework/security/vote/AffirmativeBasedTests.java

@@ -80,9 +80,7 @@ public class AffirmativeBasedTests extends TestCase {
         TestingAuthenticationToken auth = makeTestToken();
         AffirmativeBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("DENY_FOR_SURE")); // deny
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"ROLE_1", "DENY_FOR_SURE"});
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
@@ -93,8 +91,7 @@ public class AffirmativeBasedTests extends TestCase {
         TestingAuthenticationToken auth = makeTestToken();
         AffirmativeBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_2")); // grant
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("ROLE_2");
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
@@ -105,8 +102,7 @@ public class AffirmativeBasedTests extends TestCase {
         TestingAuthenticationToken auth = makeTestToken();
         AffirmativeBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_WE_DO_NOT_HAVE")); // deny
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("ROLE_WE_DO_NOT_HAVE");
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -123,8 +119,7 @@ public class AffirmativeBasedTests extends TestCase {
 
         assertTrue(!mgr.isAllowIfAllAbstainDecisions()); // check default
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("IGNORED_BY_ALL")); // abstain
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("IGNORED_BY_ALL");
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -141,8 +136,7 @@ public class AffirmativeBasedTests extends TestCase {
         mgr.setAllowIfAllAbstainDecisions(true);
         assertTrue(mgr.isAllowIfAllAbstainDecisions()); // check changed
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("IGNORED_BY_ALL")); // abstain
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("IGNORED_BY_ALL");
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
@@ -153,9 +147,7 @@ public class AffirmativeBasedTests extends TestCase {
         TestingAuthenticationToken auth = makeTestToken();
         AffirmativeBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("ROLE_2")); // grant
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"ROLE_1", "ROLE_2"});
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);

+ 3 - 6
core/src/test/java/org/springframework/security/vote/AuthenticatedVoterTests.java

@@ -72,8 +72,7 @@ public class AuthenticatedVoterTests extends TestCase {
 
     public void testAnonymousWorks() {
         AuthenticatedVoter voter = new AuthenticatedVoter();
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig(AuthenticatedVoter.IS_AUTHENTICATED_ANONYMOUSLY));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition(AuthenticatedVoter.IS_AUTHENTICATED_ANONYMOUSLY);
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED, voter.vote(createAnonymous(), null, def));
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED, voter.vote(createRememberMe(), null, def));
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED, voter.vote(createFullyAuthenticated(), null, def));
@@ -81,8 +80,7 @@ public class AuthenticatedVoterTests extends TestCase {
 
     public void testFullyWorks() {
         AuthenticatedVoter voter = new AuthenticatedVoter();
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig(AuthenticatedVoter.IS_AUTHENTICATED_FULLY));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition(AuthenticatedVoter.IS_AUTHENTICATED_FULLY);
         assertEquals(AccessDecisionVoter.ACCESS_DENIED, voter.vote(createAnonymous(), null, def));
         assertEquals(AccessDecisionVoter.ACCESS_DENIED, voter.vote(createRememberMe(), null, def));
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED, voter.vote(createFullyAuthenticated(), null, def));
@@ -90,8 +88,7 @@ public class AuthenticatedVoterTests extends TestCase {
 
     public void testRememberMeWorks() {
         AuthenticatedVoter voter = new AuthenticatedVoter();
-        ConfigAttributeDefinition def = new ConfigAttributeDefinition();
-        def.addConfigAttribute(new SecurityConfig(AuthenticatedVoter.IS_AUTHENTICATED_REMEMBERED));
+        ConfigAttributeDefinition def = new ConfigAttributeDefinition(AuthenticatedVoter.IS_AUTHENTICATED_REMEMBERED);
         assertEquals(AccessDecisionVoter.ACCESS_DENIED, voter.vote(createAnonymous(), null, def));
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED, voter.vote(createRememberMe(), null, def));
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED, voter.vote(createFullyAuthenticated(), null, def));

+ 60 - 68
core/src/test/java/org/springframework/security/vote/BasicAclEntryVoterTests.java

@@ -73,11 +73,11 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject, "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
@@ -86,21 +86,20 @@ public class BasicAclEntryVoterTests extends TestCase {
         assertEquals(aclManager, voter.getAclManager());
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
         assertEquals("FOO_ADMIN_OR_WRITE_ACCESS", voter.getProcessConfigAttribute());
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         assertEquals(2, voter.getRequirePermission().length);
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         assertEquals(SomeDomainObject.class, voter.getProcessDomainObjectClass());
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO_ADMIN_OR_WRITE_ACCESS");
 
         // Setup a MockMethodInvocation, so voter can retrieve domainObject
         MethodInvocation mi = getMethodInvocation(domainObject);
 
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED,
-            voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
+                voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
     }
 
     public void testOnlySupportsMethodInvocationAndJoinPoint() {
@@ -206,30 +205,29 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject, "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
         BasicAclEntryVoter voter = new BasicAclEntryVoter();
         voter.setAclManager(aclManager);
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("A_DIFFERENT_ATTRIBUTE"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("A_DIFFERENT_ATTRIBUTE");
 
         // Setup a MockMethodInvocation, so voter can retrieve domainObject
         MethodInvocation mi = getMethodInvocation(domainObject);
 
         assertEquals(AccessDecisionVoter.ACCESS_ABSTAIN,
-            voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
+                voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
     }
 
     public void testVoterAbstainsIfNotMatchingConfigAttribute()
@@ -239,30 +237,29 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject, "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
         BasicAclEntryVoter voter = new BasicAclEntryVoter();
         voter.setAclManager(aclManager);
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO_ADMIN_OR_WRITE_ACCESS");
 
         // Setup a MockMethodInvocation, so voter can retrieve domainObject
         MethodInvocation mi = getMethodInvocation(domainObject);
 
         assertEquals(AccessDecisionVoter.ACCESS_ABSTAIN,
-            voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
+                voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
     }
 
     public void testVoterCanDenyAccessBasedOnInternalMethodOfDomainObject()
@@ -272,29 +269,28 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject.getParent(), "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
         BasicAclEntryVoter voter = new BasicAclEntryVoter();
         voter.setAclManager(aclManager);
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         voter.setInternalMethod("getParent");
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO_ADMIN_OR_WRITE_ACCESS");
 
         // Setup a MockMethodInvocation, so voter can retrieve domainObject
         MethodInvocation mi = getMethodInvocation(domainObject);
 
         assertEquals(AccessDecisionVoter.ACCESS_DENIED,
-            voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
+                voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
     }
 
     public void testVoterCanDenyAccessIfPrincipalHasNoPermissionsAtAllToDomainObject()
@@ -304,30 +300,29 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject, "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
         BasicAclEntryVoter voter = new BasicAclEntryVoter();
         voter.setAclManager(aclManager);
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         voter.setInternalMethod("getParent");
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO_ADMIN_OR_WRITE_ACCESS");
 
         // Setup a MockMethodInvocation, so voter can retrieve domainObject
         MethodInvocation mi = getMethodInvocation(domainObject);
 
         // NB: scott is the principal, not rod
         assertEquals(AccessDecisionVoter.ACCESS_DENIED,
-            voter.vote(new UsernamePasswordAuthenticationToken("scott", null), mi, attr));
+                voter.vote(new UsernamePasswordAuthenticationToken("scott", null), mi, attr));
     }
 
     public void testVoterCanGrantAccessBasedOnInternalMethodOfDomainObject()
@@ -337,33 +332,32 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject.getParent(), "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
         BasicAclEntryVoter voter = new BasicAclEntryVoter();
         voter.setAclManager(aclManager);
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         voter.setInternalMethod("getParent");
         assertEquals("getParent", voter.getInternalMethod());
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO_ADMIN_OR_WRITE_ACCESS");
 
         // Setup a MockMethodInvocation, so voter can retrieve domainObject
         // (well actually it will access domainObject.getParent())
         MethodInvocation mi = getMethodInvocation(domainObject);
 
         assertEquals(AccessDecisionVoter.ACCESS_GRANTED,
-            voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
+                voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr));
     }
 
     public void testVoterThrowsExceptionIfInvalidInternalMethodOfDomainObject()
@@ -373,25 +367,24 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject.getParent(), "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
         BasicAclEntryVoter voter = new BasicAclEntryVoter();
         voter.setAclManager(aclManager);
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         voter.setInternalMethod("getNonExistentParentName");
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO_ADMIN_OR_WRITE_ACCESS");
 
         // Setup a MockMethodInvocation, so voter can retrieve domainObject
         // (well actually it will access domainObject.getParent())
@@ -412,30 +405,29 @@ public class BasicAclEntryVoterTests extends TestCase {
 
         // Setup an AclManager
         AclManager aclManager = new MockAclManager(domainObject.getParent(), "rod",
-                new AclEntry[] {
-                    new MockAclEntry(),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
-                    new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
+                new AclEntry[]{
+                        new MockAclEntry(),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.ADMINISTRATION),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.READ),
+                        new SimpleAclEntry("rod", new MockAclObjectIdentity(), null, SimpleAclEntry.DELETE)
                 });
 
         // Wire up a voter
         BasicAclEntryVoter voter = new BasicAclEntryVoter();
         voter.setAclManager(aclManager);
         voter.setProcessConfigAttribute("FOO_ADMIN_OR_WRITE_ACCESS");
-        voter.setRequirePermission(new int[] {SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
+        voter.setRequirePermission(new int[]{SimpleAclEntry.ADMINISTRATION, SimpleAclEntry.WRITE});
         voter.setProcessDomainObjectClass(SomeDomainObject.class);
         voter.afterPropertiesSet();
 
         // Wire up an invocation to be voted on
-        ConfigAttributeDefinition attr = new ConfigAttributeDefinition();
-        attr.addConfigAttribute(new SecurityConfig("FOO_ADMIN_OR_WRITE_ACCESS"));
+        ConfigAttributeDefinition attr = new ConfigAttributeDefinition("FOO_ADMIN_OR_WRITE_ACCESS");
 
         // Setup a MockMethodInvocation that doesn't provide SomeDomainObject arg
         Class clazz = String.class;
-        Method method = clazz.getMethod("toString", new Class[] {});
+        Method method = clazz.getMethod("toString", new Class[]{});
 
-        MethodInvocation mi = new SimpleMethodInvocation(method, new Object[] {domainObject});
+        MethodInvocation mi = new SimpleMethodInvocation(method, new Object[]{domainObject});
 
         try {
             voter.vote(new UsernamePasswordAuthenticationToken("rod", null), mi, attr);

+ 14 - 48
core/src/test/java/org/springframework/security/vote/ConsensusBasedTests.java

@@ -35,36 +35,16 @@ import org.springframework.security.providers.TestingAuthenticationToken;
  * @version $Id$
  */
 public class ConsensusBasedTests extends TestCase {
-    //~ Constructors ===========================================================
-
-    public ConsensusBasedTests() {
-        super();
-    }
-
-    public ConsensusBasedTests(String arg0) {
-        super(arg0);
-    }
 
     //~ Methods ================================================================
 
-    public final void setUp() throws Exception {
-        super.setUp();
-    }
-
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(ConsensusBasedTests.class);
-    }
-
-    public void testOneAffirmativeVoteOneDenyVoteOneAbstainVoteDeniesAccessWithoutDefault()
-        throws Exception {
+    public void testOneAffirmativeVoteOneDenyVoteOneAbstainVoteDeniesAccessWithoutDefault() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         ConsensusBased mgr = makeDecisionManager();
         mgr.setAllowIfEqualGrantedDeniedDecisions(false);
         assertTrue(!mgr.isAllowIfEqualGrantedDeniedDecisions()); // check changed
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("DENY_FOR_SURE")); // deny
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"ROLE_1", "DENY_FOR_SURE"});
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -74,40 +54,33 @@ public class ConsensusBasedTests extends TestCase {
         }
     }
 
-    public void testOneAffirmativeVoteOneDenyVoteOneAbstainVoteGrantsAccessWithDefault()
-        throws Exception {
+    public void testOneAffirmativeVoteOneDenyVoteOneAbstainVoteGrantsAccessWithDefault() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         ConsensusBased mgr = makeDecisionManager();
 
         assertTrue(mgr.isAllowIfEqualGrantedDeniedDecisions()); // check default
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("DENY_FOR_SURE")); // deny
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"ROLE_1", "DENY_FOR_SURE"});
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
     }
 
-    public void testOneAffirmativeVoteTwoAbstainVotesGrantsAccess()
-        throws Exception {
+    public void testOneAffirmativeVoteTwoAbstainVotesGrantsAccess() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         ConsensusBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_2")); // grant
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("ROLE_2");
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
     }
 
-    public void testOneDenyVoteTwoAbstainVotesDeniesAccess()
-        throws Exception {
+    public void testOneDenyVoteTwoAbstainVotesDeniesAccess() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         ConsensusBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_WE_DO_NOT_HAVE")); // deny
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("ROLE_WE_DO_NOT_HAVE");
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -117,15 +90,13 @@ public class ConsensusBasedTests extends TestCase {
         }
     }
 
-    public void testThreeAbstainVotesDeniesAccessWithDefault()
-        throws Exception {
+    public void testThreeAbstainVotesDeniesAccessWithDefault() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         ConsensusBased mgr = makeDecisionManager();
 
         assertTrue(!mgr.isAllowIfAllAbstainDecisions()); // check default
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("IGNORED_BY_ALL")); // abstain
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("IGNORED_BY_ALL");
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -135,28 +106,23 @@ public class ConsensusBasedTests extends TestCase {
         }
     }
 
-    public void testThreeAbstainVotesGrantsAccessWithoutDefault()
-        throws Exception {
+    public void testThreeAbstainVotesGrantsAccessWithoutDefault() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         ConsensusBased mgr = makeDecisionManager();
         mgr.setAllowIfAllAbstainDecisions(true);
         assertTrue(mgr.isAllowIfAllAbstainDecisions()); // check changed
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("IGNORED_BY_ALL")); // abstain
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("IGNORED_BY_ALL");
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
     }
 
-    public void testTwoAffirmativeVotesTwoAbstainVotesGrantsAccess()
-        throws Exception {
+    public void testTwoAffirmativeVotesTwoAbstainVotesGrantsAccess() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         ConsensusBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("ROLE_2")); // grant
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"ROLE_1", "ROLE_2"});
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);

+ 1 - 1
core/src/test/java/org/springframework/security/vote/DenyAgainVoter.java

@@ -52,7 +52,7 @@ public class DenyAgainVoter implements AccessDecisionVoter {
 	}
 
 	public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
-		Iterator iter = config.getConfigAttributes();
+		Iterator iter = config.getConfigAttributes().iterator();
 
 		while (iter.hasNext()) {
 			ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 1 - 1
core/src/test/java/org/springframework/security/vote/DenyVoter.java

@@ -46,7 +46,7 @@ public class DenyVoter implements AccessDecisionVoter {
     }
 
     public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config) {
-        Iterator iter = config.getConfigAttributes();
+        Iterator iter = config.getConfigAttributes().iterator();
 
         while (iter.hasNext()) {
             ConfigAttribute attribute = (ConfigAttribute) iter.next();

+ 13 - 42
core/src/test/java/org/springframework/security/vote/UnanimousBasedTests.java

@@ -36,22 +36,9 @@ import java.util.Vector;
  * @version $Id$
  */
 public class UnanimousBasedTests extends TestCase {
-    //~ Constructors ===================================================================================================
-
-    public UnanimousBasedTests() {
-        super();
-    }
-
-    public UnanimousBasedTests(String arg0) {
-        super(arg0);
-    }
 
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(UnanimousBasedTests.class);
-    }
-
     private UnanimousBased makeDecisionManager() {
         UnanimousBased decisionManager = new UnanimousBased();
         RoleVoter roleVoter = new RoleVoter();
@@ -96,14 +83,11 @@ public class UnanimousBasedTests extends TestCase {
         super.setUp();
     }
 
-    public void testOneAffirmativeVoteOneDenyVoteOneAbstainVoteDeniesAccess()
-        throws Exception {
+    public void testOneAffirmativeVoteOneDenyVoteOneAbstainVoteDeniesAccess() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         UnanimousBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("DENY_FOR_SURE")); // deny
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"ROLE_1", "DENY_FOR_SURE"});
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -113,25 +97,21 @@ public class UnanimousBasedTests extends TestCase {
         }
     }
 
-    public void testOneAffirmativeVoteTwoAbstainVotesGrantsAccess()
-        throws Exception {
+    public void testOneAffirmativeVoteTwoAbstainVotesGrantsAccess() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         UnanimousBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_2")); // grant
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("ROLE_2");
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
     }
 
-    public void testOneDenyVoteTwoAbstainVotesDeniesAccess()
-        throws Exception {
+    public void testOneDenyVoteTwoAbstainVotesDeniesAccess() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         UnanimousBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_WE_DO_NOT_HAVE")); // deny
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("ROLE_WE_DO_NOT_HAVE");
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -145,23 +125,19 @@ public class UnanimousBasedTests extends TestCase {
         TestingAuthenticationToken auth = makeTestTokenWithFooBarPrefix();
         UnanimousBased mgr = makeDecisionManagerWithFooBarPrefix();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("FOOBAR_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("FOOBAR_2")); // grant
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"FOOBAR_1", "FOOBAR_2"});
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
     }
 
-    public void testThreeAbstainVotesDeniesAccessWithDefault()
-        throws Exception {
+    public void testThreeAbstainVotesDeniesAccessWithDefault() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         UnanimousBased mgr = makeDecisionManager();
 
         assertTrue(!mgr.isAllowIfAllAbstainDecisions()); // check default
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("IGNORED_BY_ALL")); // abstain
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("IGNORED_BY_ALL");
 
         try {
             mgr.decide(auth, new Object(), config);
@@ -171,28 +147,23 @@ public class UnanimousBasedTests extends TestCase {
         }
     }
 
-    public void testThreeAbstainVotesGrantsAccessWithoutDefault()
-        throws Exception {
+    public void testThreeAbstainVotesGrantsAccessWithoutDefault() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         UnanimousBased mgr = makeDecisionManager();
         mgr.setAllowIfAllAbstainDecisions(true);
         assertTrue(mgr.isAllowIfAllAbstainDecisions()); // check changed
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("IGNORED_BY_ALL")); // abstain
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition("IGNORED_BY_ALL");
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);
     }
 
-    public void testTwoAffirmativeVotesTwoAbstainVotesGrantsAccess()
-        throws Exception {
+    public void testTwoAffirmativeVotesTwoAbstainVotesGrantsAccess() throws Exception {
         TestingAuthenticationToken auth = makeTestToken();
         UnanimousBased mgr = makeDecisionManager();
 
-        ConfigAttributeDefinition config = new ConfigAttributeDefinition();
-        config.addConfigAttribute(new SecurityConfig("ROLE_1")); // grant
-        config.addConfigAttribute(new SecurityConfig("ROLE_2")); // grant
+        ConfigAttributeDefinition config = new ConfigAttributeDefinition(new String[]{"ROLE_1", "ROLE_2"});
 
         mgr.decide(auth, new Object(), config);
         assertTrue(true);