|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2022 the original author or authors. |
|
|
|
|
* Copyright 2002-2023 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. |
|
|
|
|
@ -20,6 +20,7 @@ import java.io.FileNotFoundException;
@@ -20,6 +20,7 @@ import java.io.FileNotFoundException;
|
|
|
|
|
import java.lang.annotation.Retention; |
|
|
|
|
import java.lang.annotation.RetentionPolicy; |
|
|
|
|
import java.lang.reflect.Method; |
|
|
|
|
import java.lang.reflect.Modifier; |
|
|
|
|
import java.lang.reflect.UndeclaredThrowableException; |
|
|
|
|
import java.rmi.RemoteException; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
@ -76,24 +77,21 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -76,24 +77,21 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* To be overridden by concrete test subclasses. |
|
|
|
|
* @return the fixture |
|
|
|
|
*/ |
|
|
|
|
protected abstract AspectJAdvisorFactory getFixture(); |
|
|
|
|
protected abstract AspectJAdvisorFactory getAdvisorFactory(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void rejectsPerCflowAspect() { |
|
|
|
|
assertThatExceptionOfType(AopConfigException.class).isThrownBy(() -> |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new PerCflowAspect(), "someBean"))) |
|
|
|
|
assertThatExceptionOfType(AopConfigException.class) |
|
|
|
|
.isThrownBy(() -> getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerCflowAspect(), "someBean"))) |
|
|
|
|
.withMessageContaining("PERCFLOW"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void rejectsPerCflowBelowAspect() { |
|
|
|
|
assertThatExceptionOfType(AopConfigException.class).isThrownBy(() -> |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new PerCflowBelowAspect(), "someBean"))) |
|
|
|
|
assertThatExceptionOfType(AopConfigException.class) |
|
|
|
|
.isThrownBy(() -> getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerCflowBelowAspect(), "someBean"))) |
|
|
|
|
.withMessageContaining("PERCFLOWBELOW"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -102,9 +100,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -102,9 +100,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
int realAge = 65; |
|
|
|
|
target.setAge(realAge); |
|
|
|
|
TestBean itb = (TestBean) createProxy(target, |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerTargetAspect(), "someBean")), |
|
|
|
|
TestBean.class); |
|
|
|
|
TestBean itb = createProxy(target, TestBean.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerTargetAspect(), "someBean"))); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); |
|
|
|
|
|
|
|
|
|
Advised advised = (Advised) itb; |
|
|
|
|
@ -139,15 +136,13 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -139,15 +136,13 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
PerTargetAspect aspect1 = new PerTargetAspect(); |
|
|
|
|
aspect1.count = 100; |
|
|
|
|
aspect1.setOrder(10); |
|
|
|
|
advisors.addAll( |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1"))); |
|
|
|
|
advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect1, "someBean1"))); |
|
|
|
|
PerTargetAspect aspect2 = new PerTargetAspect(); |
|
|
|
|
aspect2.setOrder(5); |
|
|
|
|
advisors.addAll( |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2"))); |
|
|
|
|
advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect2, "someBean2"))); |
|
|
|
|
OrderComparator.sort(advisors); |
|
|
|
|
|
|
|
|
|
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class); |
|
|
|
|
TestBean itb = createProxy(target, TestBean.class, advisors); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); |
|
|
|
|
|
|
|
|
|
// Hit the method in the per clause to instantiate the aspect
|
|
|
|
|
@ -166,14 +161,12 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -166,14 +161,12 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
List<Advisor> advisors = new ArrayList<>(); |
|
|
|
|
PerTargetAspectWithOrderAnnotation10 aspect1 = new PerTargetAspectWithOrderAnnotation10(); |
|
|
|
|
aspect1.count = 100; |
|
|
|
|
advisors.addAll( |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect1, "someBean1"))); |
|
|
|
|
advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect1, "someBean1"))); |
|
|
|
|
PerTargetAspectWithOrderAnnotation5 aspect2 = new PerTargetAspectWithOrderAnnotation5(); |
|
|
|
|
advisors.addAll( |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspect2, "someBean2"))); |
|
|
|
|
advisors.addAll(getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspect2, "someBean2"))); |
|
|
|
|
OrderComparator.sort(advisors); |
|
|
|
|
|
|
|
|
|
TestBean itb = (TestBean) createProxy(target, advisors, TestBean.class); |
|
|
|
|
TestBean itb = createProxy(target, TestBean.class, advisors); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); |
|
|
|
|
|
|
|
|
|
// Hit the method in the per clause to instantiate the aspect
|
|
|
|
|
@ -188,9 +181,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -188,9 +181,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
int realAge = 65; |
|
|
|
|
target.setAge(realAge); |
|
|
|
|
TestBean itb = (TestBean) createProxy(target, |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerThisAspect(), "someBean")), |
|
|
|
|
TestBean.class); |
|
|
|
|
TestBean itb = createProxy(target, TestBean.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new PerThisAspect(), "someBean"))); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must NOT apply").isEqualTo(realAge); |
|
|
|
|
|
|
|
|
|
Advised advised = (Advised) itb; |
|
|
|
|
@ -225,7 +217,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -225,7 +217,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
int realAge = 65; |
|
|
|
|
target.setAge(realAge); |
|
|
|
|
PerTypeWithinAspectInstanceFactory aif = new PerTypeWithinAspectInstanceFactory(); |
|
|
|
|
TestBean itb = (TestBean) createProxy(target, getFixture().getAdvisors(aif), TestBean.class); |
|
|
|
|
TestBean itb = createProxy(target, TestBean.class, getAdvisorFactory().getAdvisors(aif)); |
|
|
|
|
assertThat(aif.getInstantiationCount()).as("No method calls").isEqualTo(0); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must now apply").isEqualTo(0); |
|
|
|
|
|
|
|
|
|
@ -254,7 +246,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -254,7 +246,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
assertThat(itb.getAge()).as("Around advice must still apply").isEqualTo(1); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must still apply").isEqualTo(2); |
|
|
|
|
|
|
|
|
|
TestBean itb2 = (TestBean) createProxy(target, getFixture().getAdvisors(aif), TestBean.class); |
|
|
|
|
TestBean itb2 = createProxy(target, TestBean.class, getAdvisorFactory().getAdvisors(aif)); |
|
|
|
|
assertThat(aif.getInstantiationCount()).isEqualTo(1); |
|
|
|
|
assertThat(itb2.getAge()).as("Around advice be independent for second instance").isEqualTo(0); |
|
|
|
|
assertThat(aif.getInstantiationCount()).isEqualTo(2); |
|
|
|
|
@ -278,10 +270,9 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -278,10 +270,9 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
@Test |
|
|
|
|
void namedPointcutFromAspectLibraryWithBinding() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
ITestBean itb = (ITestBean) createProxy(target, |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory( |
|
|
|
|
new NamedPointcutAspectFromLibraryWithBinding(), "someBean")), |
|
|
|
|
ITestBean.class); |
|
|
|
|
ITestBean itb = createProxy(target, ITestBean.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory( |
|
|
|
|
new NamedPointcutAspectFromLibraryWithBinding(), "someBean"))); |
|
|
|
|
itb.setAge(10); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(20); |
|
|
|
|
assertThat(target.getAge()).isEqualTo(20); |
|
|
|
|
@ -291,9 +282,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -291,9 +282,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
int realAge = 65; |
|
|
|
|
target.setAge(realAge); |
|
|
|
|
ITestBean itb = (ITestBean) createProxy(target, |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspectInstance, "someBean")), |
|
|
|
|
ITestBean.class); |
|
|
|
|
ITestBean itb = createProxy(target, ITestBean.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(aspectInstance, "someBean"))); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(-1); |
|
|
|
|
assertThat(target.getAge()).isEqualTo(realAge); |
|
|
|
|
} |
|
|
|
|
@ -301,10 +291,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -301,10 +291,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
@Test |
|
|
|
|
void bindingWithSingleArg() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
ITestBean itb = (ITestBean) createProxy(target, |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new BindingAspectWithSingleArg(), "someBean")), |
|
|
|
|
ITestBean.class); |
|
|
|
|
ITestBean itb = createProxy(target, ITestBean.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new BindingAspectWithSingleArg(), "someBean"))); |
|
|
|
|
itb.setAge(10); |
|
|
|
|
assertThat(itb.getAge()).as("Around advice must apply").isEqualTo(20); |
|
|
|
|
assertThat(target.getAge()).isEqualTo(20); |
|
|
|
|
@ -313,10 +301,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -313,10 +301,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
@Test |
|
|
|
|
void bindingWithMultipleArgsDifferentlyOrdered() { |
|
|
|
|
ManyValuedArgs target = new ManyValuedArgs(); |
|
|
|
|
ManyValuedArgs mva = (ManyValuedArgs) createProxy(target, |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new ManyValuedArgs(), "someBean")), |
|
|
|
|
ManyValuedArgs.class); |
|
|
|
|
ManyValuedArgs mva = createProxy(target, ManyValuedArgs.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new ManyValuedArgs(), "someBean"))); |
|
|
|
|
|
|
|
|
|
String a = "a"; |
|
|
|
|
int b = 12; |
|
|
|
|
@ -334,10 +320,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -334,10 +320,8 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
void introductionOnTargetNotImplementingInterface() { |
|
|
|
|
NotLockable notLockableTarget = new NotLockable(); |
|
|
|
|
assertThat(notLockableTarget instanceof Lockable).isFalse(); |
|
|
|
|
NotLockable notLockable1 = (NotLockable) createProxy(notLockableTarget, |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
NotLockable.class); |
|
|
|
|
NotLockable notLockable1 = createProxy(notLockableTarget, NotLockable.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean"))); |
|
|
|
|
assertThat(notLockable1 instanceof Lockable).isTrue(); |
|
|
|
|
Lockable lockable = (Lockable) notLockable1; |
|
|
|
|
assertThat(lockable.locked()).isFalse(); |
|
|
|
|
@ -345,72 +329,64 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -345,72 +329,64 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
assertThat(lockable.locked()).isTrue(); |
|
|
|
|
|
|
|
|
|
NotLockable notLockable2Target = new NotLockable(); |
|
|
|
|
NotLockable notLockable2 = (NotLockable) createProxy(notLockable2Target, |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
NotLockable.class); |
|
|
|
|
NotLockable notLockable2 = createProxy(notLockable2Target, NotLockable.class, |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean"))); |
|
|
|
|
assertThat(notLockable2 instanceof Lockable).isTrue(); |
|
|
|
|
Lockable lockable2 = (Lockable) notLockable2; |
|
|
|
|
assertThat(lockable2.locked()).isFalse(); |
|
|
|
|
notLockable2.setIntValue(1); |
|
|
|
|
lockable2.lock(); |
|
|
|
|
assertThatIllegalStateException().isThrownBy(() -> |
|
|
|
|
notLockable2.setIntValue(32)); |
|
|
|
|
assertThatIllegalStateException().isThrownBy(() -> notLockable2.setIntValue(32)); |
|
|
|
|
assertThat(lockable2.locked()).isTrue(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void introductionAdvisorExcludedFromTargetImplementingInterface() { |
|
|
|
|
assertThat(AopUtils.findAdvisorsThatCanApply( |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
CannotBeUnlocked.class).isEmpty()).isTrue(); |
|
|
|
|
assertThat(AopUtils.findAdvisorsThatCanApply(getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean")), NotLockable.class)).hasSize(2); |
|
|
|
|
assertThat(AopUtils.findAdvisorsThatCanApply(getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(new MakeLockable(),"someBean")), NotLockable.class)).hasSize(2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void introductionOnTargetImplementingInterface() { |
|
|
|
|
CannotBeUnlocked target = new CannotBeUnlocked(); |
|
|
|
|
Lockable proxy = (Lockable) createProxy(target, |
|
|
|
|
Lockable proxy = createProxy(target, CannotBeUnlocked.class, |
|
|
|
|
// Ensure that we exclude
|
|
|
|
|
AopUtils.findAdvisorsThatCanApply( |
|
|
|
|
getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
CannotBeUnlocked.class |
|
|
|
|
), |
|
|
|
|
CannotBeUnlocked.class); |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
CannotBeUnlocked.class)); |
|
|
|
|
assertThat(proxy).isInstanceOf(Lockable.class); |
|
|
|
|
Lockable lockable = proxy; |
|
|
|
|
assertThat(lockable.locked()).as("Already locked").isTrue(); |
|
|
|
|
lockable.lock(); |
|
|
|
|
assertThat(lockable.locked()).as("Real target ignores locking").isTrue(); |
|
|
|
|
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> |
|
|
|
|
lockable.unlock()); |
|
|
|
|
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> lockable.unlock()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void introductionOnTargetExcludedByTypePattern() { |
|
|
|
|
ArrayList<Object> target = new ArrayList<>(); |
|
|
|
|
List<?> proxy = (List<?>) createProxy(target, |
|
|
|
|
List<?> proxy = createProxy(target, List.class, |
|
|
|
|
AopUtils.findAdvisorsThatCanApply( |
|
|
|
|
getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
List.class |
|
|
|
|
), |
|
|
|
|
List.class); |
|
|
|
|
getAdvisorFactory().getAdvisors(aspectInstanceFactory(new MakeLockable(), "someBean")), |
|
|
|
|
List.class)); |
|
|
|
|
assertThat(proxy instanceof Lockable).as("Type pattern must have excluded mixin").isFalse(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void introductionBasedOnAnnotationMatch_SPR5307() { |
|
|
|
|
void introductionBasedOnAnnotationMatch() { // gh-9980
|
|
|
|
|
AnnotatedTarget target = new AnnotatedTargetImpl(); |
|
|
|
|
List<Advisor> advisors = getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeAnnotatedTypeModifiable(), "someBean")); |
|
|
|
|
Object proxy = createProxy(target, advisors, AnnotatedTarget.class); |
|
|
|
|
System.out.println(advisors.get(1)); |
|
|
|
|
assertThat(proxy instanceof Lockable).isTrue(); |
|
|
|
|
Lockable lockable = (Lockable)proxy; |
|
|
|
|
lockable.locked(); |
|
|
|
|
List<Advisor> advisors = getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(new MakeAnnotatedTypeModifiable(), "someBean")); |
|
|
|
|
Object proxy = createProxy(target, AnnotatedTarget.class, advisors); |
|
|
|
|
assertThat(proxy).isInstanceOf(Lockable.class); |
|
|
|
|
Lockable lockable = (Lockable) proxy; |
|
|
|
|
assertThat(lockable.locked()).isFalse(); |
|
|
|
|
lockable.lock(); |
|
|
|
|
assertThat(lockable.locked()).isTrue(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: Why does this test fail? It hasn't been run before, so it maybe never actually passed...
|
|
|
|
|
@ -419,12 +395,12 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -419,12 +395,12 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
void introductionWithArgumentBinding() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
|
|
|
|
|
List<Advisor> advisors = getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeITestBeanModifiable(), "someBean")); |
|
|
|
|
advisors.addAll(getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean"))); |
|
|
|
|
List<Advisor> advisors = getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(new MakeITestBeanModifiable(), "someBean")); |
|
|
|
|
advisors.addAll(getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(new MakeLockable(), "someBean"))); |
|
|
|
|
|
|
|
|
|
Modifiable modifiable = (Modifiable) createProxy(target, advisors, ITestBean.class); |
|
|
|
|
Modifiable modifiable = (Modifiable) createProxy(target, ITestBean.class, advisors); |
|
|
|
|
assertThat(modifiable).isInstanceOf(Modifiable.class); |
|
|
|
|
Lockable lockable = (Lockable) modifiable; |
|
|
|
|
assertThat(lockable.locked()).isFalse(); |
|
|
|
|
@ -443,8 +419,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -443,8 +419,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
|
|
|
|
|
lockable.lock(); |
|
|
|
|
assertThat(lockable.locked()).isTrue(); |
|
|
|
|
assertThatIllegalStateException().as("Should be locked").isThrownBy(() -> |
|
|
|
|
itb.setName("Else")); |
|
|
|
|
assertThatIllegalStateException().as("Should be locked").isThrownBy(() -> itb.setName("Else")); |
|
|
|
|
lockable.unlock(); |
|
|
|
|
itb.setName("Tony"); |
|
|
|
|
} |
|
|
|
|
@ -453,12 +428,11 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -453,12 +428,11 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
void aspectMethodThrowsExceptionLegalOnSignature() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
UnsupportedOperationException expectedException = new UnsupportedOperationException(); |
|
|
|
|
List<Advisor> advisors = getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean")); |
|
|
|
|
List<Advisor> advisors = getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean")); |
|
|
|
|
assertThat(advisors.size()).as("One advice method was found").isEqualTo(1); |
|
|
|
|
ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); |
|
|
|
|
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy( |
|
|
|
|
itb::getAge); |
|
|
|
|
ITestBean itb = createProxy(target, ITestBean.class, advisors); |
|
|
|
|
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(itb::getAge); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO document this behaviour.
|
|
|
|
|
@ -467,39 +441,23 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -467,39 +441,23 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
void aspectMethodThrowsExceptionIllegalOnSignature() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
RemoteException expectedException = new RemoteException(); |
|
|
|
|
List<Advisor> advisors = getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean")); |
|
|
|
|
List<Advisor> advisors = getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(new ExceptionThrowingAspect(expectedException), "someBean")); |
|
|
|
|
assertThat(advisors.size()).as("One advice method was found").isEqualTo(1); |
|
|
|
|
ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); |
|
|
|
|
assertThatExceptionOfType(UndeclaredThrowableException.class).isThrownBy( |
|
|
|
|
itb::getAge).withCause(expectedException); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected Object createProxy(Object target, List<Advisor> advisors, Class<?>... interfaces) { |
|
|
|
|
ProxyFactory pf = new ProxyFactory(target); |
|
|
|
|
if (interfaces.length > 1 || interfaces[0].isInterface()) { |
|
|
|
|
pf.setInterfaces(interfaces); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
pf.setProxyTargetClass(true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Required everywhere we use AspectJ proxies
|
|
|
|
|
pf.addAdvice(ExposeInvocationInterceptor.INSTANCE); |
|
|
|
|
pf.addAdvisors(advisors); |
|
|
|
|
|
|
|
|
|
pf.setExposeProxy(true); |
|
|
|
|
return pf.getProxy(); |
|
|
|
|
ITestBean itb = createProxy(target, ITestBean.class, advisors); |
|
|
|
|
assertThatExceptionOfType(UndeclaredThrowableException.class) |
|
|
|
|
.isThrownBy(itb::getAge) |
|
|
|
|
.withCause(expectedException); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void twoAdvicesOnOneAspect() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
TwoAdviceAspect twoAdviceAspect = new TwoAdviceAspect(); |
|
|
|
|
List<Advisor> advisors = getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(twoAdviceAspect, "someBean")); |
|
|
|
|
List<Advisor> advisors = getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(twoAdviceAspect, "someBean")); |
|
|
|
|
assertThat(advisors.size()).as("Two advice methods found").isEqualTo(2); |
|
|
|
|
ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); |
|
|
|
|
ITestBean itb = createProxy(target, ITestBean.class, advisors); |
|
|
|
|
itb.setName(""); |
|
|
|
|
assertThat(itb.getAge()).isEqualTo(0); |
|
|
|
|
int newAge = 32; |
|
|
|
|
@ -510,40 +468,63 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -510,40 +468,63 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
@Test |
|
|
|
|
void afterAdviceTypes() throws Exception { |
|
|
|
|
InvocationTrackingAspect aspect = new InvocationTrackingAspect(); |
|
|
|
|
List<Advisor> advisors = getFixture().getAdvisors( |
|
|
|
|
new SingletonMetadataAwareAspectInstanceFactory(aspect, "exceptionHandlingAspect")); |
|
|
|
|
Echo echo = (Echo) createProxy(new Echo(), advisors, Echo.class); |
|
|
|
|
List<Advisor> advisors = getAdvisorFactory().getAdvisors( |
|
|
|
|
aspectInstanceFactory(aspect, "exceptionHandlingAspect")); |
|
|
|
|
Echo echo = createProxy(new Echo(), Echo.class, advisors); |
|
|
|
|
|
|
|
|
|
assertThat(aspect.invocations).isEmpty(); |
|
|
|
|
assertThat(echo.echo(42)).isEqualTo(42); |
|
|
|
|
assertThat(aspect.invocations).containsExactly("around - start", "before", "after returning", "after", "around - end"); |
|
|
|
|
|
|
|
|
|
aspect.invocations.clear(); |
|
|
|
|
assertThatExceptionOfType(FileNotFoundException.class).isThrownBy(() -> echo.echo(new FileNotFoundException())); |
|
|
|
|
assertThatExceptionOfType(FileNotFoundException.class) |
|
|
|
|
.isThrownBy(() -> echo.echo(new FileNotFoundException())); |
|
|
|
|
assertThat(aspect.invocations).containsExactly("around - start", "before", "after throwing", "after", "around - end"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void failureWithoutExplicitDeclarePrecedence() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( |
|
|
|
|
MetadataAwareAspectInstanceFactory aspectInstanceFactory = aspectInstanceFactory( |
|
|
|
|
new NoDeclarePrecedenceShouldFail(), "someBean"); |
|
|
|
|
ITestBean itb = (ITestBean) createProxy(target, |
|
|
|
|
getFixture().getAdvisors(aspectInstanceFactory), ITestBean.class); |
|
|
|
|
itb.getAge(); |
|
|
|
|
ITestBean itb = createProxy(target, ITestBean.class, getAdvisorFactory().getAdvisors(aspectInstanceFactory)); |
|
|
|
|
assertThat(itb.getAge()).isEqualTo(42); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void declarePrecedenceNotSupported() { |
|
|
|
|
TestBean target = new TestBean(); |
|
|
|
|
assertThatIllegalArgumentException().isThrownBy(() -> { |
|
|
|
|
MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( |
|
|
|
|
MetadataAwareAspectInstanceFactory aspectInstanceFactory = aspectInstanceFactory( |
|
|
|
|
new DeclarePrecedenceShouldSucceed(), "someBean"); |
|
|
|
|
createProxy(target, getFixture().getAdvisors(aspectInstanceFactory), ITestBean.class); |
|
|
|
|
createProxy(target, ITestBean.class, getAdvisorFactory().getAdvisors(aspectInstanceFactory)); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static MetadataAwareAspectInstanceFactory aspectInstanceFactory(Object aspectInstance, String aspectName) { |
|
|
|
|
return new SingletonMetadataAwareAspectInstanceFactory(aspectInstance, aspectName); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
private static <T> T createProxy(Object target, Class<T> type, List<Advisor> advisors) { |
|
|
|
|
ProxyFactory pf = new ProxyFactory(target); |
|
|
|
|
if (type.isInterface()) { |
|
|
|
|
pf.addInterface(type); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
pf.setProxyTargetClass(true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Required everywhere we use AspectJ proxies
|
|
|
|
|
pf.addAdvice(ExposeInvocationInterceptor.INSTANCE); |
|
|
|
|
pf.addAdvisors(advisors); |
|
|
|
|
|
|
|
|
|
pf.setExposeProxy(true); |
|
|
|
|
return (T) pf.getProxy(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Aspect("percflow(execution(* *(..)))") |
|
|
|
|
static class PerCflowAspect { |
|
|
|
|
} |
|
|
|
|
@ -758,11 +739,11 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -758,11 +739,11 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
|
|
|
|
|
static class Echo { |
|
|
|
|
|
|
|
|
|
Object echo(Object o) throws Exception { |
|
|
|
|
if (o instanceof Exception) { |
|
|
|
|
throw (Exception) o; |
|
|
|
|
Object echo(Object obj) throws Exception { |
|
|
|
|
if (obj instanceof Exception ex) { |
|
|
|
|
throw ex; |
|
|
|
|
} |
|
|
|
|
return o; |
|
|
|
|
return obj; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -824,7 +805,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -824,7 +805,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
|
|
|
|
|
@Around("getAge()") |
|
|
|
|
int preventExecution(ProceedingJoinPoint pjp) { |
|
|
|
|
return 666; |
|
|
|
|
return 42; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -844,7 +825,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
@@ -844,7 +825,7 @@ abstract class AbstractAspectJAdvisorFactoryTests {
|
|
|
|
|
|
|
|
|
|
@Around("getAge()") |
|
|
|
|
int preventExecution(ProceedingJoinPoint pjp) { |
|
|
|
|
return 666; |
|
|
|
|
return 42; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|