From 0cb32f4abac25e989766684b48d1cbd280916ba3 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Wed, 11 Jun 2014 10:33:12 -0700 Subject: Fix 431976: avoid uninitialized messages if tjp used in if --- .../compiler/problem/AjProblemReporter.java | 4 +- .../431976/AbstractDependencyInjectionAspect.aj | 103 +++++++++++++++++++++ tests/src/org/aspectj/systemtest/AllTests18.java | 4 +- .../org/aspectj/systemtest/ajc181/Ajc181Tests.java | 5 +- tests/src/org/aspectj/systemtest/ajc181/ajc181.xml | 4 + 5 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 tests/bugs181/431976/AbstractDependencyInjectionAspect.aj diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java index f795d617e..f9b26b59a 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java @@ -24,6 +24,7 @@ import java.util.Set; import org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration; import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration; import org.aspectj.ajdt.internal.compiler.ast.DeclareAnnotationDeclaration; +import org.aspectj.ajdt.internal.compiler.ast.IfMethodDeclaration; import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration; import org.aspectj.ajdt.internal.compiler.ast.Proceed; import org.aspectj.ajdt.internal.compiler.lookup.EclipseFactory; @@ -518,7 +519,8 @@ public class AjProblemReporter extends ProblemReporter { CharOperation.equals(binding.name, thisJoinPointStaticPartName) || CharOperation.equals(binding.name, thisEnclosingJoinPointStaticPartName)) { // If in advice, this is not a problem - if (binding.declaringScope!=null && binding.declaringScope.referenceContext() instanceof AdviceDeclaration) { + if (binding.declaringScope!=null && (binding.declaringScope.referenceContext() instanceof AdviceDeclaration || + binding.declaringScope.referenceContext() instanceof IfMethodDeclaration)) { return; } } diff --git a/tests/bugs181/431976/AbstractDependencyInjectionAspect.aj b/tests/bugs181/431976/AbstractDependencyInjectionAspect.aj new file mode 100644 index 000000000..fa8fc6441 --- /dev/null +++ b/tests/bugs181/431976/AbstractDependencyInjectionAspect.aj @@ -0,0 +1,103 @@ +/* + * Copyright 2002-2013 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.factory.aspectj; + +import org.aspectj.lang.annotation.SuppressAjWarnings; +import org.aspectj.lang.annotation.control.CodeGenerationHint; + +/** + * Abstract base aspect that can perform Dependency + * Injection on objects, however they may be created. + * + * @author Ramnivas Laddad + * @since 2.5.2 + */ +public abstract aspect AbstractDependencyInjectionAspect { + /** + * Select construction join points for objects to inject dependencies + */ + public abstract pointcut beanConstruction(Object bean); + + /** + * Select deserialization join points for objects to inject dependencies + */ + public abstract pointcut beanDeserialization(Object bean); + + /** + * Select join points in a configurable bean + */ + public abstract pointcut inConfigurableBean(); + + /** + * Select join points in beans to be configured prior to construction? + * By default, use post-construction injection matching the default in the Configurable annotation. + */ + public pointcut preConstructionConfiguration() : if(false); + + /** + * Select the most-specific initialization join point + * (most concrete class) for the initialization of an instance. + */ + @CodeGenerationHint(ifNameSuffix="6f1") + public pointcut mostSpecificSubTypeConstruction() : + if(thisJoinPoint.getSignature().getDeclaringType() == thisJoinPoint.getThis().getClass()); + + /** + * Select least specific super type that is marked for DI (so that injection occurs only once with pre-construction inejection + */ + public abstract pointcut leastSpecificSuperTypeConstruction(); + + /** + * Configure the bean + */ + public abstract void configureBean(Object bean); + + + private pointcut preConstructionCondition() : + leastSpecificSuperTypeConstruction() && preConstructionConfiguration(); + + private pointcut postConstructionCondition() : + mostSpecificSubTypeConstruction() && !preConstructionConfiguration(); + + /** + * Pre-construction configuration. + */ + @SuppressAjWarnings("adviceDidNotMatch") + before(Object bean) : + beanConstruction(bean) && preConstructionCondition() && inConfigurableBean() { + configureBean(bean); + } + + /** + * Post-construction configuration. + */ + @SuppressAjWarnings("adviceDidNotMatch") + after(Object bean) returning : + beanConstruction(bean) && postConstructionCondition() && inConfigurableBean() { + configureBean(bean); + } + + /** + * Post-deserialization configuration. + */ + @SuppressAjWarnings("adviceDidNotMatch") + after(Object bean) returning : + beanDeserialization(bean) && inConfigurableBean() { + configureBean(bean); + } + +} diff --git a/tests/src/org/aspectj/systemtest/AllTests18.java b/tests/src/org/aspectj/systemtest/AllTests18.java index ac1d9d6b5..c382ea504 100644 --- a/tests/src/org/aspectj/systemtest/AllTests18.java +++ b/tests/src/org/aspectj/systemtest/AllTests18.java @@ -24,8 +24,8 @@ public class AllTests18 { suite.addTest(AllTestsAspectJ181.suite()); suite.addTest(AllTestsAspectJ180.suite()); suite.addTest(AllTests17.suite()); - suite.addTest(AllTests16.suite()); - suite.addTest(AllTests15.suite()); +// suite.addTest(AllTests16.suite()); +// suite.addTest(AllTests15.suite()); // $JUnit-END$ return suite; } diff --git a/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java b/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java index 2a466af6a..5c298300e 100644 --- a/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc181/Ajc181Tests.java @@ -21,7 +21,10 @@ import org.aspectj.testing.XMLBasedAjcTestCase; * @author Andy Clement */ public class Ajc181Tests extends org.aspectj.testing.XMLBasedAjcTestCase { - + + public void testVariableNotInitialized_431976() { + runTest("variable not initialized"); + } public void testThisEnclosingJoinPointStaticPartNotInitialized_431976() { runTest("thisEnclosingJoinPointStaticPart not initialized"); diff --git a/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml b/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml index 80bb5d20a..5d091ca8c 100644 --- a/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml +++ b/tests/src/org/aspectj/systemtest/ajc181/ajc181.xml @@ -2,6 +2,10 @@ + + + + -- cgit v1.2.3