From 333fe84ee8594ba120e1233d64c0088409391af9 Mon Sep 17 00:00:00 2001 From: Ben Alex Date: Sat, 11 Sep 2004 06:14:58 +0000 Subject: [PATCH] Clarify interface contract for ObjectDefinitionSource when no ConfigAttributes exist for a given secure object invocation, plus unit tests and fixes for concrete implementations. Thanks to Sean Radford for spotting the inconsistency. --- .../intercept/ObjectDefinitionSource.java | 5 +++++ .../method/MethodDefinitionAttributes.java | 6 +++++- .../method/MethodDefinitionAttributesTests.java | 10 ++++++++++ .../method/MethodDefinitionSourceEditorTests.java | 14 ++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/acegisecurity/intercept/ObjectDefinitionSource.java b/core/src/main/java/org/acegisecurity/intercept/ObjectDefinitionSource.java index b97c9b0fbc..6c095689c1 100644 --- a/core/src/main/java/org/acegisecurity/intercept/ObjectDefinitionSource.java +++ b/core/src/main/java/org/acegisecurity/intercept/ObjectDefinitionSource.java @@ -34,6 +34,11 @@ public interface ObjectDefinitionSource { /** * Accesses the ConfigAttributeDefinition that applies to a * given secure object. + * + *

+ * Returns null if no ConfigAttribiteDefinition + * applies. + *

* * @param object the object being secured * diff --git a/core/src/main/java/org/acegisecurity/intercept/method/MethodDefinitionAttributes.java b/core/src/main/java/org/acegisecurity/intercept/method/MethodDefinitionAttributes.java index 89bdea224f..94d37d9155 100644 --- a/core/src/main/java/org/acegisecurity/intercept/method/MethodDefinitionAttributes.java +++ b/core/src/main/java/org/acegisecurity/intercept/method/MethodDefinitionAttributes.java @@ -103,7 +103,11 @@ public class MethodDefinitionAttributes extends AbstractMethodDefinitionSource { // add the method level attributes for the implemented intreface methods addInterfaceMethodAttributes(definition, invocation.getMethod()); - return definition; + if (definition.size() == 0) { + return null; + } else { + return definition; + } } private void add(ConfigAttributeDefinition definition, Collection attribs) { diff --git a/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionAttributesTests.java b/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionAttributesTests.java index c436bae86b..4f3ec7b748 100644 --- a/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionAttributesTests.java +++ b/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionAttributesTests.java @@ -26,6 +26,7 @@ import net.sf.acegisecurity.MockMethodInvocation; import net.sf.acegisecurity.OtherTargetObject; import net.sf.acegisecurity.SecurityConfig; import net.sf.acegisecurity.TargetObject; +import net.sf.acegisecurity.acl.basic.SomeDomain; import net.sf.acegisecurity.context.ContextHolder; import net.sf.acegisecurity.context.SecureContext; import net.sf.acegisecurity.context.SecureContextImpl; @@ -202,6 +203,15 @@ public class MethodDefinitionAttributesTests extends TestCase { ContextHolder.setContext(null); } + public void testNullReturnedIfZeroAttributesDefinedForMethodInvocation() + throws Exception { + // SomeDomain is not defined in the MockAttributes() + // (which getConfigAttributeDefinition refers to) + ConfigAttributeDefinition def = getConfigAttributeDefinition(SomeDomain.class, + "getId", null); + assertNull(def); + } + private ConfigAttributeDefinition getConfigAttributeDefinition( Class clazz, String methodName, Class[] args) throws Exception { final Method method = clazz.getMethod(methodName, args); diff --git a/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionSourceEditorTests.java b/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionSourceEditorTests.java index 4c950b9dc0..ca57e2e0fb 100644 --- a/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionSourceEditorTests.java +++ b/core/src/test/java/org/acegisecurity/intercept/method/MethodDefinitionSourceEditorTests.java @@ -157,6 +157,20 @@ public class MethodDefinitionSourceEditorTests extends TestCase { assertEquals(expectedCountLength, returnedCountLength); } + public void testNullIsReturnedByMethodDefinitionSourceWhenMethodInvocationNotDefined() + throws Exception { + MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor(); + editor.setAsText( + "net.sf.acegisecurity.TargetObject.countLength=ROLE_ONE,ROLE_TWO,RUN_AS_ENTRY"); + + MethodDefinitionMap map = (MethodDefinitionMap) editor.getValue(); + + ConfigAttributeDefinition configAttributeDefinition = map.getAttributes(new MockMethodInvocation( + TargetObject.class, "makeLowerCase", + new Class[] {String.class})); + assertNull(configAttributeDefinition); + } + public void testNullReturnsEmptyMap() { MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor(); editor.setAsText(null);