From 3412f9b6f934ad1d3116a7ac7dd8f9229eb4ef3d Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Thu, 11 Dec 2008 21:55:53 +0000 Subject: [PATCH] moving unit tests from .testsuite -> .aop --- org.springframework.aop/.classpath | 2 + org.springframework.aop/ivy.xml | 2 + .../AbstractAspectJAdvisorFactoryTests.java | 41 +- .../annotation/AbstractMakeModifiable.java | 109 +++++ .../aspectj/annotation/CannotBeUnlocked.java | 41 ++ .../aop/aspectj/annotation/FooAspect.java | 28 ++ .../annotation/MakeITestBeanModifiable.java | 34 ++ .../aop/aspectj/annotation/MakeLockable.java | 73 +++ .../aop/aspectj/annotation/Modifiable.java | 30 ++ .../annotation/NamedPointcutWithArgs.java | 39 ++ .../aop/aspectj/annotation/NotLockable.java | 15 + .../ReflectiveAspectJAdvisorFactoryTests.java | 0 .../aop/framework/DefaultLockable.java | 40 ++ .../aop/framework/Lockable.java | 33 ++ .../org/springframework/beans/Colour.java | 36 ++ .../beans/INestedTestBean.java | 23 + .../org/springframework/beans/IOther.java | 24 + .../org/springframework/beans/ITestBean.java | 71 +++ .../beans/IndexedTestBean.java | 145 ++++++ .../springframework/beans/NestedTestBean.java | 60 +++ .../org/springframework/beans/TestBean.java | 424 ++++++++++++++++++ 21 files changed, 1260 insertions(+), 10 deletions(-) rename {org.springframework.testsuite => org.springframework.aop}/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java (98%) create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractMakeModifiable.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/CannotBeUnlocked.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/FooAspect.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeITestBeanModifiable.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeLockable.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/Modifiable.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NamedPointcutWithArgs.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NotLockable.java rename {org.springframework.testsuite => org.springframework.aop}/src/test/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactoryTests.java (100%) create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/framework/DefaultLockable.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/aop/framework/Lockable.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/beans/Colour.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/beans/INestedTestBean.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/beans/IOther.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/beans/ITestBean.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/beans/IndexedTestBean.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/beans/NestedTestBean.java create mode 100644 org.springframework.aop/src/test/java/org/springframework/beans/TestBean.java diff --git a/org.springframework.aop/.classpath b/org.springframework.aop/.classpath index 1d6550e897a..ebaf6620e39 100644 --- a/org.springframework.aop/.classpath +++ b/org.springframework.aop/.classpath @@ -11,6 +11,8 @@ + + diff --git a/org.springframework.aop/ivy.xml b/org.springframework.aop/ivy.xml index c985a664495..3a29401a44b 100644 --- a/org.springframework.aop/ivy.xml +++ b/org.springframework.aop/ivy.xml @@ -34,6 +34,8 @@ + + diff --git a/org.springframework.testsuite/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java similarity index 98% rename from org.springframework.testsuite/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java rename to org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java index 44c3f73a482..e757eb82e99 100644 --- a/org.springframework.testsuite/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java @@ -13,18 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.aop.aspectj.annotation; +import static org.junit.Assert.*; + +import java.io.FileNotFoundException; import java.lang.reflect.UndeclaredThrowableException; import java.rmi.RemoteException; import java.util.Collections; import java.util.LinkedList; import java.util.List; -import javax.servlet.ServletException; - -import junit.framework.TestCase; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; @@ -34,6 +33,7 @@ import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.DeclarePrecedence; import org.aspectj.lang.annotation.Pointcut; +import org.junit.Test; import org.springframework.aop.Advisor; import org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor; @@ -55,7 +55,7 @@ import org.springframework.core.annotation.Order; * * @author Rod Johnson */ -public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { +public abstract class AbstractAspectJAdvisorFactoryTests { /** * To be overridden by concrete test subclasses. @@ -64,6 +64,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { protected abstract AspectJAdvisorFactory getFixture(); + @Test public void testRejectsPerCflowAspect() { try { getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerCflowAspect(),"someBean")); @@ -74,6 +75,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { } } + @Test public void testRejectsPerCflowBelowAspect() { try { getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerCflowBelowAspect(),"someBean")); @@ -84,6 +86,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { } } + @Test public void testPerTargetAspect() throws SecurityException, NoSuchMethodException { TestBean target = new TestBean(); int realAge = 65; @@ -114,6 +117,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals("Around advice must apply", 1, itb.getAge()); } + @Test public void testMultiplePerTargetAspects() throws SecurityException, NoSuchMethodException { TestBean target = new TestBean(); int realAge = 65; @@ -141,6 +145,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals("Around advice must apply", 1, itb.getAge()); } + @Test public void testMultiplePerTargetAspectsWithOrderAnnotation() throws SecurityException, NoSuchMethodException { TestBean target = new TestBean(); int realAge = 65; @@ -166,6 +171,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals("Around advice must apply", 1, itb.getAge()); } + @Test public void testPerThisAspect() throws SecurityException, NoSuchMethodException { TestBean target = new TestBean(); int realAge = 65; @@ -200,6 +206,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals("Around advice must apply", 1, itb.getAge()); } + @Test public void testPerTypeWithinAspect() throws SecurityException, NoSuchMethodException { TestBean target = new TestBean(); int realAge = 65; @@ -243,18 +250,22 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals(2, aif.getInstantiationCount()); } + @Test public void testNamedPointcutAspectWithFQN() { testNamedPointcuts(new NamedPointcutAspectWithFQN()); } + @Test public void testNamedPointcutAspectWithoutFQN() { testNamedPointcuts(new NamedPointcutAspectWithoutFQN()); } + @Test public void testNamedPointcutFromAspectLibrary() { testNamedPointcuts(new NamedPointcutAspectFromLibrary()); } + @Test public void testNamedPointcutFromAspectLibraryWithBinding() { TestBean target = new TestBean(); ITestBean itb = (ITestBean) createProxy(target, @@ -276,6 +287,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals(realAge, target.getAge()); } + @Test public void testBindingWithSingleArg() { TestBean target = new TestBean(); ITestBean itb = (ITestBean) createProxy(target, @@ -286,6 +298,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals(20,target.getAge()); } + @Test public void testBindingWithMultipleArgsDifferentlyOrdered() { ManyValuedArgs target = new ManyValuedArgs(); ManyValuedArgs mva = (ManyValuedArgs) createProxy(target, @@ -304,6 +317,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { /** * In this case the introduction will be made. */ + @Test public void testIntroductionOnTargetNotImplementingInterface() { NotLockable notLockableTarget = new NotLockable(); assertFalse(notLockableTarget instanceof Lockable); @@ -336,6 +350,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertTrue(lockable2.locked()); } + @Test public void testIntroductionAdvisorExcludedFromTargetImplementingInterface() { assertTrue(AopUtils.findAdvisorsThatCanApply( getFixture().getAdvisors( @@ -345,7 +360,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals(2, AopUtils.findAdvisorsThatCanApply(getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean")), NotLockable.class).size()); } - @SuppressWarnings("unchecked") + @Test public void testIntroductionOnTargetImplementingInterface() { CannotBeUnlocked target = new CannotBeUnlocked(); Lockable proxy = (Lockable) createProxy(target, @@ -371,6 +386,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { } @SuppressWarnings("unchecked") + @Test public void testIntroductionOnTargetExcludedByTypePattern() { LinkedList target = new LinkedList(); List proxy = (List) createProxy(target, @@ -423,6 +439,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { itb.setName("Tony"); } + @Test public void testAspectMethodThrowsExceptionLegalOnSignature() { TestBean target = new TestBean(); UnsupportedOperationException expectedException = new UnsupportedOperationException(); @@ -442,6 +459,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { // TODO document this behaviour. // Is it different AspectJ behaviour, at least for checked exceptions? + @Test public void testAspectMethodThrowsExceptionIllegalOnSignature() { TestBean target = new TestBean(); RemoteException expectedException = new RemoteException(); @@ -459,7 +477,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { } } - protected Object createProxy(Object target, List advisors, Class ... interfaces) { + protected Object createProxy(Object target, List advisors, Class... interfaces) { ProxyFactory pf = new ProxyFactory(target); if (interfaces.length > 1 || interfaces[0].isInterface()) { pf.setInterfaces(interfaces); @@ -479,6 +497,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { return pf.getProxy(); } + @Test public void testTwoAdvicesOnOneAspect() { TestBean target = new TestBean(); @@ -495,6 +514,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals(1, itb.getAge()); } + @Test public void testAfterAdviceTypes() throws Exception { Echo target = new Echo(); @@ -508,10 +528,10 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals(1, afterReturningAspect.successCount); assertEquals(0, afterReturningAspect.failureCount); try { - echo.echo(new ServletException()); + echo.echo(new FileNotFoundException()); fail(); } - catch (ServletException ex) { + catch (FileNotFoundException ex) { // Ok } catch (Exception ex) { @@ -522,6 +542,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { assertEquals(afterReturningAspect.failureCount + afterReturningAspect.successCount, afterReturningAspect.afterCount); } + @Test public void testFailureWithoutExplicitDeclarePrecedence() { TestBean target = new TestBean(); ITestBean itb = (ITestBean) createProxy(target, @@ -536,6 +557,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { } } + @Test public void testDeclarePrecedenceNotSupported() { TestBean target = new TestBean(); try { @@ -703,7 +725,6 @@ public abstract class AbstractAspectJAdvisorFactoryTests extends TestCase { @Aspect public static class NamedPointcutAspectWithFQN { - @SuppressWarnings("unused") private ITestBean fieldThatShouldBeIgnoredBySpringAtAspectJProcessing = new TestBean(); @Pointcut("execution(* getAge())") diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractMakeModifiable.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractMakeModifiable.java new file mode 100644 index 00000000000..bae85794d94 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractMakeModifiable.java @@ -0,0 +1,109 @@ +/* + * Copyright 2002-2006 the original author or authors. + * + * 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.aop.aspectj.annotation; + +import java.lang.reflect.Method; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; + +import org.springframework.util.ObjectUtils; + +/** + * Add a DeclareParents field in concrete subclasses, to identify + * the type pattern to apply the introduction to. + * + * @author Rod Johnson + * @since 2.0 + */ +@Aspect +public abstract class AbstractMakeModifiable { + + public interface MutableModifable extends Modifiable { + void markDirty(); + } + + public static class ModifiableImpl implements MutableModifable { + private boolean modified; + + public void acceptChanges() { + modified = false; + } + + public boolean isModified() { + return modified; + } + + public void markDirty() { + this.modified = true; + } + } + + @Before(value="execution(void set*(*)) && this(modifiable) && args(newValue)", + argNames="modifiable,newValue") + public void recordModificationIfSetterArgumentDiffersFromOldValue(JoinPoint jp, + MutableModifable mixin, Object newValue) { + + /* + * We use the mixin to check and, if necessary, change, + * modification status. We need the JoinPoint to get the + * setter method. We use newValue for comparison. + * We try to invoke the getter if possible. + */ + + if (mixin.isModified()) { + // Already changed, don't need to change again + //System.out.println("changed"); + return; + } + + // Find the current raw value, by invoking the corresponding setter + Method correspondingGetter = getGetterFromSetter(((MethodSignature) jp.getSignature()).getMethod()); + boolean modified = true; + if (correspondingGetter != null) { + try { + Object oldValue = correspondingGetter.invoke(jp.getTarget()); + //System.out.println("Old value=" + oldValue + "; new=" + newValue); + modified = !ObjectUtils.nullSafeEquals(oldValue, newValue); + } + catch (Exception ex) { + ex.printStackTrace(); + // Don't sweat on exceptions; assume value was modified + } + } + else { + //System.out.println("cannot get getter for " + jp); + } + if (modified) { + mixin.markDirty(); + } + } + + private Method getGetterFromSetter(Method setter) { + String getterName = setter.getName().replaceFirst("set", "get"); + try { + return setter.getDeclaringClass().getMethod(getterName, (Class[]) null); + } + catch (NoSuchMethodException ex) { + // must be write only + return null; + } + } + +} diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/CannotBeUnlocked.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/CannotBeUnlocked.java new file mode 100644 index 00000000000..f30664f5936 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/CannotBeUnlocked.java @@ -0,0 +1,41 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.aop.aspectj.annotation; + +import org.springframework.aop.framework.Lockable; + +/** + * @author Rod Johnson + */ +public class CannotBeUnlocked implements Lockable, Comparable { + + public void lock() { + } + + public void unlock() { + throw new UnsupportedOperationException(); + } + + public boolean locked() { + return true; + } + + public int compareTo(Object arg0) { + throw new UnsupportedOperationException(); + } + +} diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/FooAspect.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/FooAspect.java new file mode 100644 index 00000000000..04db891a7df --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/FooAspect.java @@ -0,0 +1,28 @@ +/* + * Copyright 2002-2006 the original author or authors. + * + * 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.aop.aspectj.annotation; + +import org.aspectj.lang.annotation.Aspect; + +/** + * @author Rob Harrop + * @since 2.o + */ +@Aspect +public class FooAspect { + +} diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeITestBeanModifiable.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeITestBeanModifiable.java new file mode 100644 index 00000000000..58bc09c9f6c --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeITestBeanModifiable.java @@ -0,0 +1,34 @@ +/* + * Copyright 2002-2006 the original author or authors. + * + * 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.aop.aspectj.annotation; + +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.DeclareParents; + +/** + * Adds a declare parents pointcut. + * @author Rod Johnson + * @since 2.0 + */ +@Aspect +public class MakeITestBeanModifiable extends AbstractMakeModifiable { + + @DeclareParents(value = "org.springframework.beans.ITestBean+", + defaultImpl=ModifiableImpl.class) + public static MutableModifable mixin; + +} diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeLockable.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeLockable.java new file mode 100644 index 00000000000..071be326c74 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/MakeLockable.java @@ -0,0 +1,73 @@ +/* + * Copyright 2002-2006 the original author or authors. + * + * 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.aop.aspectj.annotation; + +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.DeclareParents; +import org.springframework.aop.framework.DefaultLockable; +import org.springframework.aop.framework.Lockable; + +/** + * Demonstrates introductions, AspectJ annotation style. + *

+ * @author Rod Johnson + * @since 2.0 + */ +@Aspect +public class MakeLockable { + + @DeclareParents(value = "org.springframework..*", + defaultImpl=DefaultLockable.class) + public static Lockable mixin; + + @Before(value="execution(void set*(*)) && this(mixin)", argNames="mixin") + public void checkNotLocked( + Lockable mixin) // Bind to arg + { + // Can also obtain the mixin (this) this way + //Lockable mixin = (Lockable) jp.getThis(); + if (mixin.locked()) { + throw new IllegalStateException(); + } + } + +} + +/* + * + * public aspect MakeLockable { + * + * declare parents org....* implements Lockable; + * + * private boolean Lockable.locked; + + * public void Lockable.lock() { + this.locked = true; + } + + * public void Lockable.unlock() { + this.locked = false; + } + + * public boolean Lockable.locked() { + return this.locked; + } + * + * + * } + */ diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/Modifiable.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/Modifiable.java new file mode 100644 index 00000000000..1bdfe67fe5a --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/Modifiable.java @@ -0,0 +1,30 @@ +/* + * Copyright 2002-2006 the original author or authors. + * + * 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.aop.aspectj.annotation; + +/** + * Used as a mixin. + * + * @author Rod Johnson + */ +public interface Modifiable { + + boolean isModified(); + + void acceptChanges(); + +} diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NamedPointcutWithArgs.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NamedPointcutWithArgs.java new file mode 100644 index 00000000000..8f80a5644c2 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NamedPointcutWithArgs.java @@ -0,0 +1,39 @@ +/* + * Copyright 2002-2007 the original author or authors. + * + * 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.aop.aspectj.annotation; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; + +/** + * @author Adrian Colyer + */ +@Aspect +public class NamedPointcutWithArgs { + + @Pointcut("execution(* *(..)) && args(s,..)") + public void pointcutWithArgs(String s) {} + + @Around("pointcutWithArgs(aString)") + public Object doAround(ProceedingJoinPoint pjp, String aString) throws Throwable { + System.out.println("got '" + aString + "' at '" + pjp + "'"); + throw new IllegalArgumentException(aString); + } + +} diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NotLockable.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NotLockable.java new file mode 100644 index 00000000000..928e006f182 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/NotLockable.java @@ -0,0 +1,15 @@ +package org.springframework.aop.aspectj.annotation; + +public class NotLockable { + + private int intValue; + + public int getIntValue() { + return intValue; + } + + public void setIntValue(int intValue) { + this.intValue = intValue; + } + +} diff --git a/org.springframework.testsuite/src/test/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactoryTests.java b/org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactoryTests.java similarity index 100% rename from org.springframework.testsuite/src/test/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactoryTests.java rename to org.springframework.aop/src/test/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactoryTests.java diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/framework/DefaultLockable.java b/org.springframework.aop/src/test/java/org/springframework/aop/framework/DefaultLockable.java new file mode 100644 index 00000000000..a7b4d48b39d --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/framework/DefaultLockable.java @@ -0,0 +1,40 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.aop.framework; + +/** + * Simple implementation of Lockable interface for use in mixins. + * + * @author Rod Johnson + */ +public class DefaultLockable implements Lockable { + + private boolean locked; + + public void lock() { + this.locked = true; + } + + public void unlock() { + this.locked = false; + } + + public boolean locked() { + return this.locked; + } + +} diff --git a/org.springframework.aop/src/test/java/org/springframework/aop/framework/Lockable.java b/org.springframework.aop/src/test/java/org/springframework/aop/framework/Lockable.java new file mode 100644 index 00000000000..70d6b2cfa5f --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/aop/framework/Lockable.java @@ -0,0 +1,33 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.aop.framework; + + +/** + * Simple interface to use for mixins + * + * @author Rod Johnson + * + */ +public interface Lockable { + + void lock(); + + void unlock(); + + boolean locked(); +} \ No newline at end of file diff --git a/org.springframework.aop/src/test/java/org/springframework/beans/Colour.java b/org.springframework.aop/src/test/java/org/springframework/beans/Colour.java new file mode 100644 index 00000000000..01e73f96740 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/beans/Colour.java @@ -0,0 +1,36 @@ +/* + * Copyright 2002-2007 the original author or authors. + * + * 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.beans; + +import org.springframework.core.enums.ShortCodedLabeledEnum; + +/** + * @author Rob Harrop + */ +@SuppressWarnings("serial") +public class Colour extends ShortCodedLabeledEnum { + + public static final Colour RED = new Colour(0, "RED"); + public static final Colour BLUE = new Colour(1, "BLUE"); + public static final Colour GREEN = new Colour(2, "GREEN"); + public static final Colour PURPLE = new Colour(3, "PURPLE"); + + private Colour(int code, String label) { + super(code, label); + } + +} \ No newline at end of file diff --git a/org.springframework.aop/src/test/java/org/springframework/beans/INestedTestBean.java b/org.springframework.aop/src/test/java/org/springframework/beans/INestedTestBean.java new file mode 100644 index 00000000000..7d87547b5f7 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/beans/INestedTestBean.java @@ -0,0 +1,23 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.beans; + +public interface INestedTestBean { + + public String getCompany(); + +} \ No newline at end of file diff --git a/org.springframework.aop/src/test/java/org/springframework/beans/IOther.java b/org.springframework.aop/src/test/java/org/springframework/beans/IOther.java new file mode 100644 index 00000000000..797486ec44e --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/beans/IOther.java @@ -0,0 +1,24 @@ + +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.beans; + +public interface IOther { + + void absquatulate(); + +} \ No newline at end of file diff --git a/org.springframework.aop/src/test/java/org/springframework/beans/ITestBean.java b/org.springframework.aop/src/test/java/org/springframework/beans/ITestBean.java new file mode 100644 index 00000000000..cdf5ef510dd --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/beans/ITestBean.java @@ -0,0 +1,71 @@ +/* + * Copyright 2002-2007 the original author or authors. + * + * 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.beans; + +import java.io.IOException; + +/** + * Interface used for {@link org.springframework.beans.TestBean}. + * + *

Two methods are the same as on Person, but if this + * extends person it breaks quite a few tests.. + * + * @author Rod Johnson + * @author Juergen Hoeller + */ +public interface ITestBean { + + int getAge(); + + void setAge(int age); + + String getName(); + + void setName(String name); + + ITestBean getSpouse(); + + void setSpouse(ITestBean spouse); + + ITestBean[] getSpouses(); + + String[] getStringArray(); + + void setStringArray(String[] stringArray); + + /** + * Throws a given (non-null) exception. + */ + void exceptional(Throwable t) throws Throwable; + + Object returnsThis(); + + INestedTestBean getDoctor(); + + INestedTestBean getLawyer(); + + IndexedTestBean getNestedIndexedBean(); + + /** + * Increment the age by one. + * @return the previous age + */ + int haveBirthday(); + + void unreliableFileOperation() throws IOException; + +} \ No newline at end of file diff --git a/org.springframework.aop/src/test/java/org/springframework/beans/IndexedTestBean.java b/org.springframework.aop/src/test/java/org/springframework/beans/IndexedTestBean.java new file mode 100644 index 00000000000..24f28a960fd --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/beans/IndexedTestBean.java @@ -0,0 +1,145 @@ +/* + * Copyright 2002-2006 the original author or authors. + * + * 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.beans; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * @author Juergen Hoeller + * @since 11.11.2003 + */ +public class IndexedTestBean { + + private TestBean[] array; + + private Collection collection; + + private List list; + + private Set set; + + private SortedSet sortedSet; + + private Map map; + + private SortedMap sortedMap; + + + public IndexedTestBean() { + this(true); + } + + public IndexedTestBean(boolean populate) { + if (populate) { + populate(); + } + } + + public void populate() { + TestBean tb0 = new TestBean("name0", 0); + TestBean tb1 = new TestBean("name1", 0); + TestBean tb2 = new TestBean("name2", 0); + TestBean tb3 = new TestBean("name3", 0); + TestBean tb4 = new TestBean("name4", 0); + TestBean tb5 = new TestBean("name5", 0); + TestBean tb6 = new TestBean("name6", 0); + TestBean tb7 = new TestBean("name7", 0); + TestBean tbX = new TestBean("nameX", 0); + TestBean tbY = new TestBean("nameY", 0); + this.array = new TestBean[] {tb0, tb1}; + this.list = new ArrayList(); + this.list.add(tb2); + this.list.add(tb3); + this.set = new TreeSet(); + this.set.add(tb6); + this.set.add(tb7); + this.map = new HashMap(); + this.map.put("key1", tb4); + this.map.put("key2", tb5); + this.map.put("key.3", tb5); + List list = new ArrayList(); + list.add(tbX); + list.add(tbY); + this.map.put("key4", list); + } + + + public TestBean[] getArray() { + return array; + } + + public void setArray(TestBean[] array) { + this.array = array; + } + + public Collection getCollection() { + return collection; + } + + public void setCollection(Collection collection) { + this.collection = collection; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public Set getSet() { + return set; + } + + public void setSet(Set set) { + this.set = set; + } + + public SortedSet getSortedSet() { + return sortedSet; + } + + public void setSortedSet(SortedSet sortedSet) { + this.sortedSet = sortedSet; + } + + public Map getMap() { + return map; + } + + public void setMap(Map map) { + this.map = map; + } + + public SortedMap getSortedMap() { + return sortedMap; + } + + public void setSortedMap(SortedMap sortedMap) { + this.sortedMap = sortedMap; + } + +} \ No newline at end of file diff --git a/org.springframework.aop/src/test/java/org/springframework/beans/NestedTestBean.java b/org.springframework.aop/src/test/java/org/springframework/beans/NestedTestBean.java new file mode 100644 index 00000000000..a06e15d150b --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/beans/NestedTestBean.java @@ -0,0 +1,60 @@ +/* + * Copyright 2002-2005 the original author or authors. + * + * 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.beans; + +/** + * Simple nested test bean used for testing bean factories, AOP framework etc. + * + * @author Trevor D. Cook + * @since 30.09.2003 + */ +public class NestedTestBean implements INestedTestBean { + + private String company = ""; + + public NestedTestBean() { + } + + public NestedTestBean(String company) { + setCompany(company); + } + + public void setCompany(String company) { + this.company = (company != null ? company : ""); + } + + public String getCompany() { + return company; + } + + public boolean equals(Object obj) { + if (!(obj instanceof NestedTestBean)) { + return false; + } + NestedTestBean ntb = (NestedTestBean) obj; + return this.company.equals(ntb.company); + } + + public int hashCode() { + return this.company.hashCode(); + } + + public String toString() { + return "NestedTestBean: " + this.company; + } + +} \ No newline at end of file diff --git a/org.springframework.aop/src/test/java/org/springframework/beans/TestBean.java b/org.springframework.aop/src/test/java/org/springframework/beans/TestBean.java new file mode 100644 index 00000000000..82d243e8ca6 --- /dev/null +++ b/org.springframework.aop/src/test/java/org/springframework/beans/TestBean.java @@ -0,0 +1,424 @@ +/* + * Copyright 2002-2008 the original author or authors. + * + * 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.beans; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import org.springframework.util.ObjectUtils; + +/** + * Simple test bean used for testing bean factories, the AOP framework etc. + * + * @author Rod Johnson + * @author Juergen Hoeller + * @since 15 April 2001 + */ +public class TestBean implements ITestBean, IOther, Comparable { + + private String beanName; + + private String country; + + private boolean postProcessed; + + private String name; + + private String sex; + + private int age; + + private boolean jedi; + + private ITestBean[] spouses; + + private String touchy; + + private String[] stringArray; + + private Integer[] someIntegerArray; + + private Date date = new Date(); + + private Float myFloat = new Float(0.0); + + private Collection friends = new LinkedList(); + + private Set someSet = new HashSet(); + + private Map someMap = new HashMap(); + + private List someList = new ArrayList(); + + private Properties someProperties = new Properties(); + + private INestedTestBean doctor = new NestedTestBean(); + + private INestedTestBean lawyer = new NestedTestBean(); + + private IndexedTestBean nestedIndexedBean; + + private boolean destroyed; + + private Number someNumber; + + private Colour favouriteColour; + + private Boolean someBoolean; + + private List otherColours; + + private List pets; + + + public TestBean() { + } + + public TestBean(String name) { + this.name = name; + } + + public TestBean(ITestBean spouse) { + this.spouses = new ITestBean[] {spouse}; + } + + public TestBean(String name, int age) { + this.name = name; + this.age = age; + } + + public TestBean(ITestBean spouse, Properties someProperties) { + this.spouses = new ITestBean[] {spouse}; + this.someProperties = someProperties; + } + + public TestBean(List someList) { + this.someList = someList; + } + + public TestBean(Set someSet) { + this.someSet = someSet; + } + + public TestBean(Map someMap) { + this.someMap = someMap; + } + + public TestBean(Properties someProperties) { + this.someProperties = someProperties; + } + + + public void setBeanName(String beanName) { + this.beanName = beanName; + } + + public String getBeanName() { + return beanName; + } + + public void setPostProcessed(boolean postProcessed) { + this.postProcessed = postProcessed; + } + + public boolean isPostProcessed() { + return postProcessed; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + if (this.name == null) { + this.name = sex; + } + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public boolean isJedi() { + return jedi; + } + + public void setJedi(boolean jedi) { + this.jedi = jedi; + } + + public ITestBean getSpouse() { + return (spouses != null ? spouses[0] : null); + } + + public void setSpouse(ITestBean spouse) { + this.spouses = new ITestBean[] {spouse}; + } + + public ITestBean[] getSpouses() { + return spouses; + } + + public String getTouchy() { + return touchy; + } + + public void setTouchy(String touchy) throws Exception { + if (touchy.indexOf('.') != -1) { + throw new Exception("Can't contain a ."); + } + if (touchy.indexOf(',') != -1) { + throw new NumberFormatException("Number format exception: contains a ,"); + } + this.touchy = touchy; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String[] getStringArray() { + return stringArray; + } + + public void setStringArray(String[] stringArray) { + this.stringArray = stringArray; + } + + public Integer[] getSomeIntegerArray() { + return someIntegerArray; + } + + public void setSomeIntegerArray(Integer[] someIntegerArray) { + this.someIntegerArray = someIntegerArray; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public Float getMyFloat() { + return myFloat; + } + + public void setMyFloat(Float myFloat) { + this.myFloat = myFloat; + } + + public Collection getFriends() { + return friends; + } + + public void setFriends(Collection friends) { + this.friends = friends; + } + + public Set getSomeSet() { + return someSet; + } + + public void setSomeSet(Set someSet) { + this.someSet = someSet; + } + + public Map getSomeMap() { + return someMap; + } + + public void setSomeMap(Map someMap) { + this.someMap = someMap; + } + + public List getSomeList() { + return someList; + } + + public void setSomeList(List someList) { + this.someList = someList; + } + + public Properties getSomeProperties() { + return someProperties; + } + + public void setSomeProperties(Properties someProperties) { + this.someProperties = someProperties; + } + + public INestedTestBean getDoctor() { + return doctor; + } + + public void setDoctor(INestedTestBean doctor) { + this.doctor = doctor; + } + + public INestedTestBean getLawyer() { + return lawyer; + } + + public void setLawyer(INestedTestBean lawyer) { + this.lawyer = lawyer; + } + + public Number getSomeNumber() { + return someNumber; + } + + public void setSomeNumber(Number someNumber) { + this.someNumber = someNumber; + } + + public Colour getFavouriteColour() { + return favouriteColour; + } + + public void setFavouriteColour(Colour favouriteColour) { + this.favouriteColour = favouriteColour; + } + + public Boolean getSomeBoolean() { + return someBoolean; + } + + public void setSomeBoolean(Boolean someBoolean) { + this.someBoolean = someBoolean; + } + + public IndexedTestBean getNestedIndexedBean() { + return nestedIndexedBean; + } + + public void setNestedIndexedBean(IndexedTestBean nestedIndexedBean) { + this.nestedIndexedBean = nestedIndexedBean; + } + + public List getOtherColours() { + return otherColours; + } + + public void setOtherColours(List otherColours) { + this.otherColours = otherColours; + } + + public List getPets() { + return pets; + } + + public void setPets(List pets) { + this.pets = pets; + } + + + /** + * @see ITestBean#exceptional(Throwable) + */ + public void exceptional(Throwable t) throws Throwable { + if (t != null) { + throw t; + } + } + + public void unreliableFileOperation() throws IOException { + throw new IOException(); + } + /** + * @see ITestBean#returnsThis() + */ + public Object returnsThis() { + return this; + } + + /** + * @see IOther#absquatulate() + */ + public void absquatulate() { + } + + public int haveBirthday() { + return age++; + } + + + public void destroy() { + this.destroyed = true; + } + + public boolean wasDestroyed() { + return destroyed; + } + + + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (other == null || !(other instanceof TestBean)) { + return false; + } + TestBean tb2 = (TestBean) other; + return (ObjectUtils.nullSafeEquals(this.name, tb2.name) && this.age == tb2.age); + } + + public int hashCode() { + return this.age; + } + + public int compareTo(Object other) { + if (this.name != null && other instanceof TestBean) { + return this.name.compareTo(((TestBean) other).getName()); + } + else { + return 1; + } + } + + public String toString() { + return this.name; + } + +} \ No newline at end of file