10 changed files with 390 additions and 0 deletions
@ -0,0 +1,52 @@ |
|||||||
|
/* Copyright 2004, 2005 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.acegisecurity; |
||||||
|
|
||||||
|
import org.springframework.util.Assert; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* An entity used in our generics testing. |
||||||
|
* |
||||||
|
* @author Ben Alex |
||||||
|
* @version $Id$ |
||||||
|
*/ |
||||||
|
public class Entity { |
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
String info; |
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public Entity(String info) { |
||||||
|
Assert.hasText(info, "Some information must be given!"); |
||||||
|
this.info = info; |
||||||
|
} |
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public String getInfo() { |
||||||
|
return info; |
||||||
|
} |
||||||
|
|
||||||
|
void makeLowercase() { |
||||||
|
this.info = info.toLowerCase(); |
||||||
|
} |
||||||
|
|
||||||
|
void makeUppercase() { |
||||||
|
this.info = info.toUpperCase(); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,44 @@ |
|||||||
|
/* Copyright 2004, 2005 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.acegisecurity; |
||||||
|
|
||||||
|
/** |
||||||
|
* An extended version of <code>Entity</code>. |
||||||
|
* |
||||||
|
* @author Ben Alex |
||||||
|
* @version $Id$ |
||||||
|
*/ |
||||||
|
public class Organisation extends Entity { |
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private boolean active = true; |
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public Organisation(String name) { |
||||||
|
super(name); |
||||||
|
} |
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public boolean isActive() { |
||||||
|
return this.active; |
||||||
|
} |
||||||
|
|
||||||
|
void deactive() { |
||||||
|
this.active = true; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
package org.acegisecurity; |
||||||
|
|
||||||
|
public interface OrganisationService extends Service<Organisation> { |
||||||
|
public void deactive(Organisation org); |
||||||
|
} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
package org.acegisecurity; |
||||||
|
|
||||||
|
public class OrganisationServiceImpl extends ServiceImpl<Organisation> implements OrganisationService { |
||||||
|
|
||||||
|
public void deactive(Organisation org) { |
||||||
|
org.deactive(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,44 @@ |
|||||||
|
/* Copyright 2004, 2005 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.acegisecurity; |
||||||
|
|
||||||
|
/** |
||||||
|
* An extended version of <code>Entity</code>. |
||||||
|
* |
||||||
|
* @author Ben Alex |
||||||
|
* @version $Id$ |
||||||
|
*/ |
||||||
|
public class Person extends Entity { |
||||||
|
//~ Instance fields ========================================================
|
||||||
|
|
||||||
|
private boolean active = true; |
||||||
|
|
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public Person(String name) { |
||||||
|
super(name); |
||||||
|
} |
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public boolean isActive() { |
||||||
|
return this.active; |
||||||
|
} |
||||||
|
|
||||||
|
void deactive() { |
||||||
|
this.active = true; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,5 @@ |
|||||||
|
package org.acegisecurity; |
||||||
|
|
||||||
|
public interface PersonService extends Service<Person> { |
||||||
|
public void deactive(Person person); |
||||||
|
} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
package org.acegisecurity; |
||||||
|
|
||||||
|
public class PersonServiceImpl extends ServiceImpl<Person> implements PersonService { |
||||||
|
|
||||||
|
public void deactive(Person person) { |
||||||
|
person.deactive(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,37 @@ |
|||||||
|
/* Copyright 2004, 2005 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.acegisecurity; |
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* An interface that uses Java 5 generics. |
||||||
|
* |
||||||
|
* @author Ben Alex |
||||||
|
* @version $Id$ |
||||||
|
*/ |
||||||
|
public interface Service<E extends Entity> { |
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public int countElements(Collection<E> ids); |
||||||
|
|
||||||
|
public void makeLowerCase(E input); |
||||||
|
|
||||||
|
public void makeUpperCase(E input); |
||||||
|
|
||||||
|
public void publicMakeLowerCase(E input); |
||||||
|
} |
||||||
@ -0,0 +1,23 @@ |
|||||||
|
package org.acegisecurity; |
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
|
||||||
|
public class ServiceImpl<E extends Entity> implements Service<E> { |
||||||
|
|
||||||
|
public int countElements(Collection<E> ids) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
public void makeLowerCase(E input) { |
||||||
|
input.makeLowercase(); |
||||||
|
} |
||||||
|
|
||||||
|
public void makeUpperCase(E input) { |
||||||
|
input.makeUppercase(); |
||||||
|
} |
||||||
|
|
||||||
|
public void publicMakeLowerCase(E input) { |
||||||
|
input.makeUppercase(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,162 @@ |
|||||||
|
/* Copyright 2004, 2005 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.acegisecurity.intercept.method; |
||||||
|
|
||||||
|
import junit.framework.TestCase; |
||||||
|
|
||||||
|
import org.acegisecurity.ConfigAttributeDefinition; |
||||||
|
import org.acegisecurity.Entity; |
||||||
|
import org.acegisecurity.OrganisationService; |
||||||
|
import org.acegisecurity.PersonService; |
||||||
|
import org.acegisecurity.PersonServiceImpl; |
||||||
|
import org.acegisecurity.SecurityConfig; |
||||||
|
import org.acegisecurity.Service; |
||||||
|
import org.acegisecurity.ServiceImpl; |
||||||
|
|
||||||
|
import org.aopalliance.intercept.MethodInvocation; |
||||||
|
|
||||||
|
import java.lang.reflect.AccessibleObject; |
||||||
|
import java.lang.reflect.Method; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Extra tests to demonstrate generics behaviour with |
||||||
|
* <code>MethodDefinitionMap</code>. |
||||||
|
* |
||||||
|
* @author Ben Alex |
||||||
|
* @version $Id$ |
||||||
|
*/ |
||||||
|
public class MethodDefinitionSourceEditorTigerTests extends TestCase { |
||||||
|
//~ Constructors ===========================================================
|
||||||
|
|
||||||
|
public MethodDefinitionSourceEditorTigerTests() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public MethodDefinitionSourceEditorTigerTests(String arg0) { |
||||||
|
super(arg0); |
||||||
|
} |
||||||
|
|
||||||
|
//~ Methods ================================================================
|
||||||
|
|
||||||
|
public final void setUp() throws Exception { |
||||||
|
super.setUp(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
junit.textui.TestRunner.run(MethodDefinitionSourceEditorTests.class); |
||||||
|
} |
||||||
|
|
||||||
|
public void testConcreteClassInvocationsAlsoReturnDefinitionsAgainstInterface() |
||||||
|
throws Exception { |
||||||
|
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor(); |
||||||
|
editor.setAsText( |
||||||
|
"org.acegisecurity.Service.makeLower*=ROLE_FROM_INTERFACE\r\norg.acegisecurity.Service.makeUpper*=ROLE_FROM_INTERFACE\r\norg.acegisecurity.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")); |
||||||
|
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")); |
||||||
|
assertEquals(expectedMakeUpper, returnedMakeUpper); |
||||||
|
} |
||||||
|
|
||||||
|
public void testGenericsSuperclassDeclarationsAreIncludedWhenSubclassesOverride() |
||||||
|
throws Exception { |
||||||
|
MethodDefinitionSourceEditor editor = new MethodDefinitionSourceEditor(); |
||||||
|
editor.setAsText( |
||||||
|
"org.acegisecurity.Service.makeLower*=ROLE_FROM_INTERFACE\r\norg.acegisecurity.Service.makeUpper*=ROLE_FROM_INTERFACE\r\norg.acegisecurity.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")); |
||||||
|
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")); |
||||||
|
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")); |
||||||
|
assertEquals(expectedMakeUpper, returnedMakeUpper); |
||||||
|
} |
||||||
|
|
||||||
|
//~ Inner Classes ==========================================================
|
||||||
|
|
||||||
|
private class MockMethodInvocation implements MethodInvocation { |
||||||
|
Method method; |
||||||
|
|
||||||
|
public MockMethodInvocation(Class clazz, String methodName, |
||||||
|
Class[] parameterTypes) throws NoSuchMethodException { |
||||||
|
System.out.println(clazz + " " + methodName + " " |
||||||
|
+ parameterTypes[0]); |
||||||
|
method = clazz.getMethod(methodName, parameterTypes); |
||||||
|
} |
||||||
|
|
||||||
|
private MockMethodInvocation() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public Object[] getArguments() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Method getMethod() { |
||||||
|
return method; |
||||||
|
} |
||||||
|
|
||||||
|
public AccessibleObject getStaticPart() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object getThis() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object proceed() throws Throwable { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue