diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java index 0d04031fb3..810d935ad3 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -205,9 +205,8 @@ class CglibAopProxy implements AopProxy, Serializable { return createProxyClassAndInstance(enhancer, callbacks); } catch (CodeGenerationException | IllegalArgumentException ex) { - throw new AopConfigException("Could not generate CGLIB subclass of class [" + - this.advised.getTargetClass() + "]: " + - "Common causes of this problem include using a final class or a non-visible class", + throw new AopConfigException("Could not generate CGLIB subclass of " + this.advised.getTargetClass() + + ": Common causes of this problem include using a final class or a non-visible class", ex); } catch (Throwable ex) { diff --git a/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java b/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java index 43cc76aa8c..46f27fdde0 100644 --- a/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java +++ b/spring-aop/src/test/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 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. @@ -46,7 +46,6 @@ import test.aop.PerTargetAspect; import test.aop.TwoAdviceAspect; import org.springframework.aop.Advisor; -import org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor; import org.springframework.aop.framework.Advised; import org.springframework.aop.framework.AopConfigException; import org.springframework.aop.framework.ProxyFactory; @@ -82,22 +81,24 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Test public void testRejectsPerCflowAspect() { try { - getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerCflowAspect(),"someBean")); + getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new PerCflowAspect(), "someBean")); fail("Cannot accept cflow"); } catch (AopConfigException ex) { - assertTrue(ex.getMessage().indexOf("PERCFLOW") != -1); + assertTrue(ex.getMessage().contains("PERCFLOW")); } } @Test public void testRejectsPerCflowBelowAspect() { try { - getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new PerCflowBelowAspect(),"someBean")); + getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new PerCflowBelowAspect(), "someBean")); fail("Cannot accept cflowbelow"); } catch (AopConfigException ex) { - assertTrue(ex.getMessage().indexOf("PERCFLOWBELOW") != -1); + assertTrue(ex.getMessage().contains("PERCFLOWBELOW")); } } @@ -112,7 +113,8 @@ public abstract class AbstractAspectJAdvisorFactoryTests { assertEquals("Around advice must NOT apply", realAge, itb.getAge()); Advised advised = (Advised) itb; - SyntheticInstantiationAdvisor sia = (SyntheticInstantiationAdvisor) advised.getAdvisors()[1]; + ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor sia = + (ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor) advised.getAdvisors()[1]; assertTrue(sia.getPointcut().getMethodMatcher().matches(TestBean.class.getMethod("getSpouse"), null)); InstantiationModelAwarePointcutAdvisorImpl imapa = (InstantiationModelAwarePointcutAdvisorImpl) advised.getAdvisors()[3]; LazySingletonAspectInstanceFactoryDecorator maaif = @@ -199,7 +201,8 @@ public abstract class AbstractAspectJAdvisorFactoryTests { Advised advised = (Advised) itb; // Will be ExposeInvocationInterceptor, synthetic instantiation advisor, 2 method advisors assertEquals(4, advised.getAdvisors().length); - SyntheticInstantiationAdvisor sia = (SyntheticInstantiationAdvisor) advised.getAdvisors()[1]; + ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor sia = + (ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor) advised.getAdvisors()[1]; assertTrue(sia.getPointcut().getMethodMatcher().matches(TestBean.class.getMethod("getSpouse"), null)); InstantiationModelAwarePointcutAdvisorImpl imapa = (InstantiationModelAwarePointcutAdvisorImpl) advised.getAdvisors()[2]; LazySingletonAspectInstanceFactoryDecorator maaif = @@ -227,16 +230,15 @@ public 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 = (TestBean) createProxy(target, getFixture().getAdvisors(aif), TestBean.class); assertEquals("No method calls", 0, aif.getInstantiationCount()); assertEquals("Around advice must now apply", 0, itb.getAge()); Advised advised = (Advised) itb; // Will be ExposeInvocationInterceptor, synthetic instantiation advisor, 2 method advisors assertEquals(4, advised.getAdvisors().length); - SyntheticInstantiationAdvisor sia = (SyntheticInstantiationAdvisor) advised.getAdvisors()[1]; + ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor sia = + (ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor) advised.getAdvisors()[1]; assertTrue(sia.getPointcut().getMethodMatcher().matches(TestBean.class.getMethod("getSpouse"), null)); InstantiationModelAwarePointcutAdvisorImpl imapa = (InstantiationModelAwarePointcutAdvisorImpl) advised.getAdvisors()[2]; LazySingletonAspectInstanceFactoryDecorator maaif = @@ -257,9 +259,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { assertEquals("Around advice must still apply", 1, itb.getAge()); assertEquals("Around advice must still apply", 2, itb.getAge()); - TestBean itb2 = (TestBean) createProxy(target, - getFixture().getAdvisors(aif), - TestBean.class); + TestBean itb2 = (TestBean) createProxy(target, getFixture().getAdvisors(aif), TestBean.class); assertEquals(1, aif.getInstantiationCount()); assertEquals("Around advice be independent for second instance", 0, itb2.getAge()); assertEquals(2, aif.getInstantiationCount()); @@ -284,7 +284,8 @@ public abstract class AbstractAspectJAdvisorFactoryTests { public void testNamedPointcutFromAspectLibraryWithBinding() { TestBean target = new TestBean(); ITestBean itb = (ITestBean) createProxy(target, - getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new NamedPointcutAspectFromLibraryWithBinding(),"someBean")), + getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory( + new NamedPointcutAspectFromLibraryWithBinding(), "someBean")), ITestBean.class); itb.setAge(10); assertEquals("Around advice must apply", 20, itb.getAge()); @@ -296,7 +297,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { int realAge = 65; target.setAge(realAge); ITestBean itb = (ITestBean) createProxy(target, - getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspectInstance,"someBean")), + getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(aspectInstance, "someBean")), ITestBean.class); assertEquals("Around advice must apply", -1, itb.getAge()); assertEquals(realAge, target.getAge()); @@ -306,7 +307,8 @@ public abstract class AbstractAspectJAdvisorFactoryTests { public void testBindingWithSingleArg() { TestBean target = new TestBean(); ITestBean itb = (ITestBean) createProxy(target, - getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new BindingAspectWithSingleArg(),"someBean")), + getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new BindingAspectWithSingleArg(), "someBean")), ITestBean.class); itb.setAge(10); assertEquals("Around advice must apply", 20, itb.getAge()); @@ -317,7 +319,8 @@ public abstract class AbstractAspectJAdvisorFactoryTests { public void testBindingWithMultipleArgsDifferentlyOrdered() { ManyValuedArgs target = new ManyValuedArgs(); ManyValuedArgs mva = (ManyValuedArgs) createProxy(target, - getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new ManyValuedArgs(),"someBean")), + getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new ManyValuedArgs(), "someBean")), ManyValuedArgs.class); String a = "a"; @@ -338,7 +341,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { assertFalse(notLockableTarget instanceof Lockable); NotLockable notLockable1 = (NotLockable) createProxy(notLockableTarget, getFixture().getAdvisors( - new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean")), + new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), NotLockable.class); assertTrue(notLockable1 instanceof Lockable); Lockable lockable = (Lockable) notLockable1; @@ -349,7 +352,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { NotLockable notLockable2Target = new NotLockable(); NotLockable notLockable2 = (NotLockable) createProxy(notLockable2Target, getFixture().getAdvisors( - new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean")), + new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), NotLockable.class); assertTrue(notLockable2 instanceof Lockable); Lockable lockable2 = (Lockable) notLockable2; @@ -368,11 +371,11 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Test public void testIntroductionAdvisorExcludedFromTargetImplementingInterface() { assertTrue(AopUtils.findAdvisorsThatCanApply( - getFixture().getAdvisors( - new SingletonMetadataAwareAspectInstanceFactory( - new MakeLockable(),"someBean")), - CannotBeUnlocked.class).isEmpty()); - assertEquals(2, AopUtils.findAdvisorsThatCanApply(getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean")), NotLockable.class).size()); + getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), + CannotBeUnlocked.class).isEmpty()); + assertEquals(2, AopUtils.findAdvisorsThatCanApply(getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean")), NotLockable.class).size()); } @Test @@ -408,42 +411,34 @@ public abstract class AbstractAspectJAdvisorFactoryTests { getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean")), List.class ), - CannotBeUnlocked.class); + List.class); assertFalse("Type pattern must have excluded mixin", proxy instanceof Lockable); } - /* prereq AspectJ 1.6.7 @Test - public void testIntroductionBasedOnAnnotationMatch_Spr5307() { + public void testIntroductionBasedOnAnnotationMatch_SPR5307() { AnnotatedTarget target = new AnnotatedTargetImpl(); - List advisors = getFixture().getAdvisors( - new SingletonMetadataAwareAspectInstanceFactory(new MakeAnnotatedTypeModifiable(),"someBean")); - Object proxy = createProxy(target, - advisors, - AnnotatedTarget.class); + new SingletonMetadataAwareAspectInstanceFactory(new MakeAnnotatedTypeModifiable(), "someBean")); + Object proxy = createProxy(target, advisors, AnnotatedTarget.class); System.out.println(advisors.get(1)); assertTrue(proxy instanceof Lockable); Lockable lockable = (Lockable)proxy; lockable.locked(); } - */ // TODO: Why does this test fail? It hasn't been run before, so it maybe never actually passed... - @Test @Ignore public void testIntroductionWithArgumentBinding() { TestBean target = new TestBean(); List advisors = getFixture().getAdvisors( - new SingletonMetadataAwareAspectInstanceFactory(new MakeITestBeanModifiable(),"someBean")); + new SingletonMetadataAwareAspectInstanceFactory(new MakeITestBeanModifiable(), "someBean")); advisors.addAll(getFixture().getAdvisors( - new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(),"someBean"))); + new SingletonMetadataAwareAspectInstanceFactory(new MakeLockable(), "someBean"))); - Modifiable modifiable = (Modifiable) createProxy(target, - advisors, - ITestBean.class); + Modifiable modifiable = (Modifiable) createProxy(target, advisors, ITestBean.class); assertThat(modifiable, instanceOf(Modifiable.class)); Lockable lockable = (Lockable) modifiable; assertFalse(lockable.locked()); @@ -477,11 +472,11 @@ public abstract class AbstractAspectJAdvisorFactoryTests { public void testAspectMethodThrowsExceptionLegalOnSignature() { TestBean target = new TestBean(); UnsupportedOperationException expectedException = new UnsupportedOperationException(); - List advisors = getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new ExceptionAspect(expectedException),"someBean")); + List advisors = getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new ExceptionAspect(expectedException), "someBean")); assertEquals("One advice method was found", 1, advisors.size()); - ITestBean itb = (ITestBean) createProxy(target, - advisors, - ITestBean.class); + ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); + try { itb.getAge(); fail(); @@ -497,11 +492,11 @@ public abstract class AbstractAspectJAdvisorFactoryTests { public void testAspectMethodThrowsExceptionIllegalOnSignature() { TestBean target = new TestBean(); RemoteException expectedException = new RemoteException(); - List advisors = getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new ExceptionAspect(expectedException),"someBean")); + List advisors = getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(new ExceptionAspect(expectedException), "someBean")); assertEquals("One advice method was found", 1, advisors.size()); - ITestBean itb = (ITestBean) createProxy(target, - advisors, - ITestBean.class); + ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); + try { itb.getAge(); fail(); @@ -522,10 +517,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { // Required everywhere we use AspectJ proxies pf.addAdvice(ExposeInvocationInterceptor.INSTANCE); - - for (Object a : advisors) { - pf.addAdvisor((Advisor) a); - } + pf.addAdvisors(advisors); pf.setExposeProxy(true); return pf.getProxy(); @@ -534,13 +526,11 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Test public void testTwoAdvicesOnOneAspect() { TestBean target = new TestBean(); - TwoAdviceAspect twoAdviceAspect = new TwoAdviceAspect(); - List advisors = getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(twoAdviceAspect,"someBean")); + List advisors = getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(twoAdviceAspect, "someBean")); assertEquals("Two advice methods found", 2, advisors.size()); - ITestBean itb = (ITestBean) createProxy(target, - advisors, - ITestBean.class); + ITestBean itb = (ITestBean) createProxy(target, advisors, ITestBean.class); itb.setName(""); assertEquals(0, itb.getAge()); int newAge = 32; @@ -551,16 +541,15 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Test public void testAfterAdviceTypes() throws Exception { Echo target = new Echo(); - ExceptionHandling afterReturningAspect = new ExceptionHandling(); - List advisors = getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(afterReturningAspect,"someBean")); - Echo echo = (Echo) createProxy(target, - advisors, - Echo.class); + List advisors = getFixture().getAdvisors( + new SingletonMetadataAwareAspectInstanceFactory(afterReturningAspect, "someBean")); + Echo echo = (Echo) createProxy(target, advisors, Echo.class); assertEquals(0, afterReturningAspect.successCount); assertEquals("", echo.echo("")); assertEquals(1, afterReturningAspect.successCount); assertEquals(0, afterReturningAspect.failureCount); + try { echo.echo(new FileNotFoundException()); fail(); @@ -580,9 +569,9 @@ public abstract class AbstractAspectJAdvisorFactoryTests { public void testFailureWithoutExplicitDeclarePrecedence() { TestBean target = new TestBean(); MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( - new NoDeclarePrecedenceShouldFail(), "someBean"); + new NoDeclarePrecedenceShouldFail(), "someBean"); ITestBean itb = (ITestBean) createProxy(target, - getFixture().getAdvisors(aspectInstanceFactory), ITestBean.class); + getFixture().getAdvisors(aspectInstanceFactory), ITestBean.class); itb.getAge(); } @@ -590,21 +579,10 @@ public abstract class AbstractAspectJAdvisorFactoryTests { public void testDeclarePrecedenceNotSupported() { TestBean target = new TestBean(); MetadataAwareAspectInstanceFactory aspectInstanceFactory = new SingletonMetadataAwareAspectInstanceFactory( - new DeclarePrecedenceShouldSucceed(), "someBean"); - createProxy(target, getFixture().getAdvisors(aspectInstanceFactory), - ITestBean.class); + new DeclarePrecedenceShouldSucceed(), "someBean"); + createProxy(target, getFixture().getAdvisors(aspectInstanceFactory), ITestBean.class); } - /** Not supported in 2.0! - public void testExplicitDeclarePrecedencePreventsFailure() { - TestBean target = new TestBean(); - ITestBean itb = (ITestBean) createProxy(target, - getFixture().getAdvisors(new SingletonMetadataAwareAspectInstanceFactory(new DeclarePrecedenceShouldSucceed(), "someBean")), - ITestBean.class); - assertEquals(666, itb.getAge()); - } - */ - @Aspect("percflow(execution(* *(..)))") public static class PerCflowAspect { @@ -723,6 +701,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Aspect public static class NamedPointcutAspectWithoutFQN { + @Pointcut("execution(* getAge())") public void getAge() { } @@ -779,7 +758,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Around(value="setAge(age)",argNames="age") // @ArgNames({"age"}) // AMC needs more work here? ignoring pjp arg... ok?? - // argNames should be suported in Around as it is in Pointcut + // argNames should be suported in Around as it is in Pointcut public void changeReturnType(ProceedingJoinPoint pjp, int age) throws Throwable { pjp.proceed(new Object[] {age*2}); } @@ -788,12 +767,12 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Aspect public static class ManyValuedArgs { + public String mungeArgs(String a, int b, int c, String d, StringBuffer e) { return a + b + c + d + e; } - @Around(value="execution(String mungeArgs(..)) && args(a, b, c, d, e)", - argNames="b,c,d,e,a") + @Around(value="execution(String mungeArgs(..)) && args(a, b, c, d, e)", argNames="b,c,d,e,a") public String reverseAdvice(ProceedingJoinPoint pjp, int b, int c, String d, StringBuffer e, String a) throws Throwable { assertEquals(a + b+ c+ d+ e, pjp.proceed()); return a + b + c + d + e; @@ -803,6 +782,7 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Aspect public static class ExceptionAspect { + private final Exception ex; public ExceptionAspect(Exception ex) { @@ -829,8 +809,11 @@ public abstract class AbstractAspectJAdvisorFactoryTests { @Aspect public static class ExceptionHandling { + public int successCount; + public int failureCount; + public int afterCount; @AfterReturning("execution(* echo(*))") @@ -902,10 +885,12 @@ public abstract class AbstractAspectJAdvisorFactoryTests { abstract class AbstractMakeModifiable { public interface MutableModifable extends Modifiable { + void markDirty(); } public static class ModifiableImpl implements MutableModifable { + private boolean modified; @Override @@ -924,10 +909,9 @@ abstract class AbstractMakeModifiable { } } - @Before(value="execution(void set*(*)) && this(modifiable) && args(newValue)", - argNames="modifiable,newValue") - public void recordModificationIfSetterArgumentDiffersFromOldValue(JoinPoint jp, - MutableModifable mixin, Object newValue) { + @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, @@ -992,6 +976,7 @@ class MakeITestBeanModifiable extends AbstractMakeModifiable { } + /** * Adds a declare parents pointcut - spr5307 * @author Andy Clement @@ -1001,8 +986,7 @@ class MakeITestBeanModifiable extends AbstractMakeModifiable { class MakeAnnotatedTypeModifiable extends AbstractMakeModifiable { @DeclareParents(value = "(@org.springframework.aop.aspectj.annotation.Measured *)", -// @DeclareParents(value = "(@Measured *)", // this would be a nice alternative... - defaultImpl=DefaultLockable.class) + defaultImpl = DefaultLockable.class) public static Lockable mixin; } @@ -1014,14 +998,11 @@ class MakeAnnotatedTypeModifiable extends AbstractMakeModifiable { @Aspect class MakeLockable { - @DeclareParents(value = "org.springframework..*", - defaultImpl=DefaultLockable.class) + @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 - { + public void checkNotLocked( Lockable mixin) { // Can also obtain the mixin (this) this way //Lockable mixin = (Lockable) jp.getThis(); if (mixin.locked()) { @@ -1069,6 +1050,7 @@ interface Modifiable { } + /** * Used as a target. * @author Andy Clement @@ -1076,11 +1058,12 @@ interface Modifiable { interface AnnotatedTarget { } + @Measured class AnnotatedTargetImpl implements AnnotatedTarget { - } + @Retention(RetentionPolicy.RUNTIME) @interface Measured {} @@ -1104,9 +1087,7 @@ class PerThisAspect { public int count; - /** - * Just to check that this doesn't cause problems with introduction processing - */ + // Just to check that this doesn't cause problems with introduction processing private ITestBean fieldThatShouldBeIgnoredBySpringAtAspectJProcessing = new TestBean(); @Around("execution(int *.getAge())") diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurerTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurerTests.java index 903b34f115..cc937dbc5b 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurerTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 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. @@ -16,9 +16,6 @@ package org.springframework.beans.factory.config; -import java.lang.reflect.Field; -import java.util.Collections; -import java.util.Map; import java.util.Properties; import org.junit.After; @@ -56,7 +53,7 @@ public class PropertyPlaceholderConfigurerTests { @Before - public void setUp() { + public void setup() { p1BeanDef = rootBeanDefinition(TestBean.class) .addPropertyValue("name", "${" + P1 + "}") .getBeanDefinition(); @@ -66,16 +63,14 @@ public class PropertyPlaceholderConfigurerTests { ppcProperties = new Properties(); ppcProperties.setProperty(P1, P1_LOCAL_PROPS_VAL); System.setProperty(P1, P1_SYSTEM_PROPS_VAL); - getModifiableSystemEnvironment().put(P1, P1_SYSTEM_ENV_VAL); ppc = new PropertyPlaceholderConfigurer(); ppc.setProperties(ppcProperties); } @After - public void tearDown() { + public void cleanup() { System.clearProperty(P1); - getModifiableSystemEnvironment().remove(P1); } @@ -84,8 +79,8 @@ public class PropertyPlaceholderConfigurerTests { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.registerBeanDefinition("testBean", genericBeanDefinition(TestBean.class) - .addPropertyValue("name", "${my.name}") - .getBeanDefinition()); + .addPropertyValue("name", "${my.name}") + .getBeanDefinition()); PropertyPlaceholderConfigurer pc = new PropertyPlaceholderConfigurer(); Resource resource = new ClassPathResource("PropertyPlaceholderConfigurerTests.properties", this.getClass()); @@ -95,7 +90,7 @@ public class PropertyPlaceholderConfigurerTests { @Test public void resolveFromSystemProperties() { - getModifiableSystemEnvironment().put("otherKey", "systemValue"); + System.setProperty("otherKey", "systemValue"); p1BeanDef = rootBeanDefinition(TestBean.class) .addPropertyValue("name", "${" + P1 + "}") .addPropertyValue("sex", "${otherKey}") @@ -105,12 +100,12 @@ public class PropertyPlaceholderConfigurerTests { TestBean bean = bf.getBean(TestBean.class); assertThat(bean.getName(), equalTo(P1_LOCAL_PROPS_VAL)); assertThat(bean.getSex(), equalTo("systemValue")); - getModifiableSystemEnvironment().remove("otherKey"); + System.clearProperty("otherKey"); } @Test public void resolveFromLocalProperties() { - tearDown(); // eliminate entries from system props/environment + System.clearProperty(P1); registerWithGeneratedName(p1BeanDef, bf); ppc.postProcessBeanFactory(bf); TestBean bean = bf.getBean(TestBean.class); @@ -134,16 +129,6 @@ public class PropertyPlaceholderConfigurerTests { assertThat(bean.getName(), equalTo(P1_SYSTEM_PROPS_VAL)); } - @Test - public void setSystemSystemPropertiesMode_toOverride_andResolveFromSystemEnvironment() { - registerWithGeneratedName(p1BeanDef, bf); - System.clearProperty(P1); // will now fall all the way back to system environment - ppc.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE); - ppc.postProcessBeanFactory(bf); - TestBean bean = bf.getBean(TestBean.class); - assertThat(bean.getName(), equalTo(P1_SYSTEM_ENV_VAL)); - } - @Test public void setSystemSystemPropertiesMode_toOverride_andSetSearchSystemEnvironment_toFalse() { registerWithGeneratedName(p1BeanDef, bf); @@ -160,7 +145,7 @@ public class PropertyPlaceholderConfigurerTests { * settings regarding resolving properties from the environment. */ @Test - public void twoPlacholderConfigurers_withConflictingSettings() { + public void twoPlaceholderConfigurers_withConflictingSettings() { String P2 = "p2"; String P2_LOCAL_PROPS_VAL = "p2LocalPropsVal"; String P2_SYSTEM_PROPS_VAL = "p2SystemPropsVal"; @@ -178,7 +163,6 @@ public class PropertyPlaceholderConfigurerTests { ppc.postProcessBeanFactory(bf); System.setProperty(P2, P2_SYSTEM_PROPS_VAL); - getModifiableSystemEnvironment().put(P2, P2_SYSTEM_ENV_VAL); Properties ppc2Properties = new Properties(); ppc2Properties.put(P2, P2_LOCAL_PROPS_VAL); @@ -198,7 +182,6 @@ public class PropertyPlaceholderConfigurerTests { assertThat(p2Bean.getCountry(), equalTo(P2_SYSTEM_PROPS_VAL)); System.clearProperty(P2); - getModifiableSystemEnvironment().remove(P2); } @Test @@ -210,9 +193,9 @@ public class PropertyPlaceholderConfigurerTests { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.registerBeanDefinition("testBean", rootBeanDefinition(TestBean.class) - .addPropertyValue("name", "@") - .addPropertyValue("sex", "${key2}") - .getBeanDefinition()); + .addPropertyValue("name", "@") + .addPropertyValue("sex", "${key2}") + .getBeanDefinition()); System.setProperty("key1", "systemKey1Value"); System.setProperty("key2", "systemKey2Value"); @@ -228,100 +211,41 @@ public class PropertyPlaceholderConfigurerTests { public void nullValueIsPreserved() { PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); ppc.setNullValue("customNull"); - getModifiableSystemEnvironment().put("my.name", "customNull"); + System.setProperty("my.name", "customNull"); DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.registerBeanDefinition("testBean", rootBeanDefinition(TestBean.class) .addPropertyValue("name", "${my.name}") .getBeanDefinition()); ppc.postProcessBeanFactory(bf); assertThat(bf.getBean(TestBean.class).getName(), nullValue()); - getModifiableSystemEnvironment().remove("my.name"); + System.clearProperty("my.name"); } @Test public void trimValuesIsOffByDefault() { PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); - getModifiableSystemEnvironment().put("my.name", " myValue "); + System.setProperty("my.name", " myValue "); DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.registerBeanDefinition("testBean", rootBeanDefinition(TestBean.class) .addPropertyValue("name", "${my.name}") .getBeanDefinition()); ppc.postProcessBeanFactory(bf); assertThat(bf.getBean(TestBean.class).getName(), equalTo(" myValue ")); - getModifiableSystemEnvironment().remove("my.name"); + System.clearProperty("my.name"); } @Test public void trimValuesIsApplied() { PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); ppc.setTrimValues(true); - getModifiableSystemEnvironment().put("my.name", " myValue "); + System.setProperty("my.name", " myValue "); DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.registerBeanDefinition("testBean", rootBeanDefinition(TestBean.class) .addPropertyValue("name", "${my.name}") .getBeanDefinition()); ppc.postProcessBeanFactory(bf); assertThat(bf.getBean(TestBean.class).getName(), equalTo("myValue")); - getModifiableSystemEnvironment().remove("my.name"); + System.clearProperty("my.name"); } - - @SuppressWarnings("unchecked") - private static Map getModifiableSystemEnvironment() { - // for os x / linux - Class[] classes = Collections.class.getDeclaredClasses(); - Map env = System.getenv(); - for (Class cl : classes) { - if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { - try { - Field field = cl.getDeclaredField("m"); - field.setAccessible(true); - Object obj = field.get(env); - if (obj != null && obj.getClass().getName().equals("java.lang.ProcessEnvironment$StringEnvironment")) { - return (Map) obj; - } - } - catch (Exception ex) { - throw new RuntimeException(ex); - } - } - } - - // for windows - Class processEnvironmentClass; - try { - processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); - } - catch (Exception ex) { - throw new RuntimeException(ex); - } - - try { - Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment"); - theCaseInsensitiveEnvironmentField.setAccessible(true); - Object obj = theCaseInsensitiveEnvironmentField.get(null); - return (Map) obj; - } - catch (NoSuchFieldException ex) { - // do nothing - } - catch (Exception ex) { - throw new RuntimeException(ex); - } - - try { - Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment"); - theEnvironmentField.setAccessible(true); - Object obj = theEnvironmentField.get(null); - return (Map) obj; - } - catch (NoSuchFieldException ex) { - // do nothing - } - catch (Exception ex) { - throw new RuntimeException(ex); - } - - throw new IllegalStateException(); - } } diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java index b7a6d67e14..7ffaafd8ea 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java @@ -118,9 +118,9 @@ class ConfigurationClassEnhancer { /** * Creates a new CGLIB {@link Enhancer} instance. */ - private Enhancer newEnhancer(Class superclass, @Nullable ClassLoader classLoader) { + private Enhancer newEnhancer(Class configSuperClass, @Nullable ClassLoader classLoader) { Enhancer enhancer = new Enhancer(); - enhancer.setSuperclass(superclass); + enhancer.setSuperclass(configSuperClass); enhancer.setInterfaces(new Class[] {EnhancedConfiguration.class}); enhancer.setUseFactory(false); enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); diff --git a/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java b/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java index 7d8049df2d..66d0d2dc8b 100644 --- a/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java +++ b/spring-context/src/test/java/org/springframework/aop/framework/AbstractAopProxyTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2016 the original author or authors. + * Copyright 2002-2018 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. @@ -212,7 +212,7 @@ public abstract class AbstractAopProxyTests { } @Test - public void testSerializationSerializableTargetAndAdvice() throws Throwable { + public void testSerializableTargetAndAdvice() throws Throwable { SerializablePerson personTarget = new SerializablePerson(); personTarget.setName("jim"); personTarget.setAge(26); @@ -435,7 +435,7 @@ public abstract class AbstractAopProxyTests { TestBean raw = new OwnSpouse(); ProxyCreatorSupport pc = new ProxyCreatorSupport(); - pc.setInterfaces(new Class[] {ITestBean.class}); + pc.setInterfaces(ITestBean.class); pc.setTarget(raw); ITestBean tb = (ITestBean) createProxy(pc); @@ -457,7 +457,7 @@ public abstract class AbstractAopProxyTests { pc.addAdvice(mi); // We don't care about the object - mockTargetSource.setTarget(new Object()); + mockTargetSource.setTarget(new TestBean()); pc.setTargetSource(mockTargetSource); AopProxy aop = createAopProxy(pc); diff --git a/spring-context/src/test/java/org/springframework/aop/framework/CglibProxyTests.java b/spring-context/src/test/java/org/springframework/aop/framework/CglibProxyTests.java index f887ee70bb..665213a79f 100644 --- a/spring-context/src/test/java/org/springframework/aop/framework/CglibProxyTests.java +++ b/spring-context/src/test/java/org/springframework/aop/framework/CglibProxyTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -174,7 +174,7 @@ public class CglibProxyTests extends AbstractAopProxyTests implements Serializab } @Test - public void testUnadvisedProxyCreationWithCallDuringConstructor() throws Exception { + public void testUnadvisedProxyCreationWithCallDuringConstructor() { CglibTestBean target = new CglibTestBean(); target.setName("Rob Harrop"); @@ -370,7 +370,7 @@ public class CglibProxyTests extends AbstractAopProxyTests implements Serializab } @Test - public void testProxyProtectedMethod() throws Exception { + public void testProxyProtectedMethod() { CountingBeforeAdvice advice = new CountingBeforeAdvice(); ProxyFactory proxyFactory = new ProxyFactory(new MyBean()); proxyFactory.addAdvice(advice); @@ -382,14 +382,14 @@ public class CglibProxyTests extends AbstractAopProxyTests implements Serializab } @Test - public void testProxyTargetClassInCaseOfNoInterfaces() throws Exception { + public void testProxyTargetClassInCaseOfNoInterfaces() { ProxyFactory proxyFactory = new ProxyFactory(new MyBean()); MyBean proxy = (MyBean) proxyFactory.getProxy(); assertEquals(4, proxy.add(1, 3)); } @Test // SPR-13328 - public void testVarargsWithEnumArray() throws Exception { + public void testVarargsWithEnumArray() { ProxyFactory proxyFactory = new ProxyFactory(new MyBean()); MyBean proxy = (MyBean) proxyFactory.getProxy(); assertTrue(proxy.doWithVarargs(MyEnum.A, MyOtherEnum.C)); diff --git a/spring-context/src/test/java/org/springframework/aop/framework/autoproxy/BeanNameAutoProxyCreatorInitTests.java b/spring-context/src/test/java/org/springframework/aop/framework/autoproxy/BeanNameAutoProxyCreatorInitTests.java index c223fe7aed..ffc5e4f5de 100644 --- a/spring-context/src/test/java/org/springframework/aop/framework/autoproxy/BeanNameAutoProxyCreatorInitTests.java +++ b/spring-context/src/test/java/org/springframework/aop/framework/autoproxy/BeanNameAutoProxyCreatorInitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2018 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. @@ -35,13 +35,13 @@ import static org.junit.Assert.*; public class BeanNameAutoProxyCreatorInitTests { @Test(expected = IllegalArgumentException.class) - public void testIgnoreAdvisorThatIsCurrentlyCreation() { + public void testIgnoreAdvisorThatIsCurrentlyInCreation() { ClassPathXmlApplicationContext ctx = - new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass()); + new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass()); TestBean bean = (TestBean) ctx.getBean("bean"); bean.setName("foo"); assertEquals("foo", bean.getName()); - bean.setName(null); // should throw + bean.setName(null); // should throw } }