SEC-99: Extra tests to explore generics behaviour.
This commit is contained in:
parent
72256a225f
commit
863ba3f0a3
|
@ -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