10 changed files with 390 additions and 0 deletions
@ -0,0 +1,52 @@
@@ -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 @@
@@ -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 @@
@@ -0,0 +1,5 @@
|
||||
package org.acegisecurity; |
||||
|
||||
public interface OrganisationService extends Service<Organisation> { |
||||
public void deactive(Organisation org); |
||||
} |
||||
@ -0,0 +1,9 @@
@@ -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 @@
@@ -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 @@
@@ -0,0 +1,5 @@
|
||||
package org.acegisecurity; |
||||
|
||||
public interface PersonService extends Service<Person> { |
||||
public void deactive(Person person); |
||||
} |
||||
@ -0,0 +1,9 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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