Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/Advisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/AfterAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/AfterReturningAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/AopInvocationException.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/BeforeAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/ClassFilter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/DynamicIntroductionAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/IntroductionAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/IntroductionAwareMethodMatcher.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/IntroductionInfo.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/IntroductionInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/MethodBeforeAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/MethodMatcher.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/Pointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/PointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/ProxyMethodInvocation.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/RawTargetAccess.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/SpringProxy.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/TargetClassAware.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/TargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/ThrowsAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/TrueClassFilter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/TrueMethodMatcher.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/TruePointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AbstractAspectJAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJAdviceParameterNameDiscoverer.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJAfterAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJAfterReturningAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJAfterThrowingAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJAopUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJAroundAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJExpressionPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJExpressionPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJMethodBeforeAdvice.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJPrecedenceInformation.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJProxyUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/AspectJWeaverMessageHandler.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/DeclareParentsAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/InstantiationModelAwarePointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/RuntimeTestWalker.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/SimpleAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/SingletonAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/TypePatternClassFilter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/AnnotationAwareAspectJAutoProxyCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/AspectJAdvisorFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/AspectJProxyFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/AspectMetadata.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/BeanFactoryAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/BeanFactoryAspectJAdvisorsBuilder.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/InstantiationModelAwarePointcutAdvisorImpl.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/LazySingletonAspectInstanceFactoryDecorator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/MetadataAwareAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/NotAnAtAspectException.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/PrototypeAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/SimpleMetadataAwareAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/SingletonMetadataAwareAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/aspectj/annotation/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,10 @@ + +/** + * + * Classes enabling AspectJ 5 @Annotated classes to be used in Spring AOP. + * + *

Normally to be used through an AspectJAutoProxyCreator rather than directly. + * + */ +package org.springframework.aop.aspectj.annotation; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/autoproxy/AspectJAwareAdvisorAutoProxyCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/aspectj/autoproxy/AspectJPrecedenceComparator.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/aspectj/autoproxy/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/aspectj/autoproxy/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/aspectj/autoproxy/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,9 @@ + +/** + * + * Base classes enabling auto-proxying based on AspectJ. + * Support for AspectJ annotation aspects resides in the "aspectj.annotation" package. + * + */ +package org.springframework.aop.aspectj.autoproxy; + Index: 3rdParty_sources/spring/org/springframework/aop/aspectj/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/aspectj/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/aspectj/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,14 @@ +/** + * + * AspectJ integration package. Includes Spring AOP advice implementations for AspectJ 5 + * annotation-style methods, and an AspectJExpressionPointcut: a Spring AOP Pointcut + * implementation that allows use of the AspectJ pointcut expression language with the Spring AOP + * runtime framework. + * + *

Note that use of this package does not require the use of the {@code ajc} compiler + * or AspectJ load-time weaver. It is intended to enable the use of a valuable subset of AspectJ + * functionality, with consistent semantics, with the proxy-based Spring AOP framework. + * + */ +package org.springframework.aop.aspectj; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AbstractInterceptorDrivenBeanDefinitionDecorator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AdviceEntry.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AdvisorComponentDefinition.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AdvisorEntry.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AopConfigUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AopNamespaceHandler.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AopNamespaceUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AspectComponentDefinition.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AspectEntry.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/AspectJAutoProxyBeanDefinitionParser.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/ConfigBeanDefinitionParser.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/MethodLocatingFactoryBean.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/PointcutComponentDefinition.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/PointcutEntry.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/ScopedProxyBeanDefinitionDecorator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/SimpleBeanFactoryAwareAspectInstanceFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/config/SpringConfiguredBeanDefinitionParser.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/config/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/config/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/config/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,9 @@ + +/** + * + * Support package for declarative AOP configuration, + * with XML schema being the primary configuration format. + * + */ +package org.springframework.aop.config; + Index: 3rdParty_sources/spring/org/springframework/aop/framework/AbstractAdvisingBeanPostProcessor.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/framework/AbstractAdvisingBeanPostProcessor.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/framework/AbstractAdvisingBeanPostProcessor.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,157 @@ +/* + * Copyright 2002-2014 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; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.springframework.aop.Advisor; +import org.springframework.aop.support.AopUtils; +import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.core.Ordered; +import org.springframework.util.ClassUtils; + +/** + * Base class for {@link BeanPostProcessor} implementations that apply a + * Spring AOP {@link Advisor} to specific beans. + * + * @author Juergen Hoeller + * @since 3.2 + */ +@SuppressWarnings("serial") +public abstract class AbstractAdvisingBeanPostProcessor extends ProxyConfig + implements BeanPostProcessor, BeanClassLoaderAware, Ordered { + + protected Advisor advisor; + + protected boolean beforeExistingAdvisors = false; + + private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + + /** + * This should run after all other post-processors, so that it can just add + * an advisor to existing proxies rather than double-proxy. + */ + private int order = Ordered.LOWEST_PRECEDENCE; + + private final Map, Boolean> eligibleBeans = new ConcurrentHashMap, Boolean>(64); + + + /** + * Set whether this post-processor's advisor is supposed to apply before + * existing advisors when encountering a pre-advised object. + *

Default is "false", applying the advisor after existing advisors, i.e. + * as close as possible to the target method. Switch this to "true" in order + * for this post-processor's advisor to wrap existing advisors as well. + *

Note: Check the concrete post-processor's javadoc whether it possibly + * changes this flag by default, depending on the nature of its advisor. + */ + public void setBeforeExistingAdvisors(boolean beforeExistingAdvisors) { + this.beforeExistingAdvisors = beforeExistingAdvisors; + } + + @Override + public void setBeanClassLoader(ClassLoader beanClassLoader) { + this.beanClassLoader = beanClassLoader; + } + + public void setOrder(int order) { + this.order = order; + } + + @Override + public int getOrder() { + return this.order; + } + + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) { + if (bean instanceof AopInfrastructureBean) { + // Ignore AOP infrastructure such as scoped proxies. + return bean; + } + + if (bean instanceof Advised) { + Advised advised = (Advised) bean; + if (!advised.isFrozen() && isEligible(AopUtils.getTargetClass(bean))) { + // Add our local Advisor to the existing proxy's Advisor chain... + if (this.beforeExistingAdvisors) { + advised.addAdvisor(0, this.advisor); + } + else { + advised.addAdvisor(this.advisor); + } + return bean; + } + } + + if (isEligible(bean, beanName)) { + ProxyFactory proxyFactory = new ProxyFactory(bean); + // Copy our properties (proxyTargetClass etc) inherited from ProxyConfig. + proxyFactory.copyFrom(this); + proxyFactory.addAdvisor(this.advisor); + return proxyFactory.getProxy(this.beanClassLoader); + } + + // No async proxy needed. + return bean; + } + + /** + * Check whether the given bean is eligible for advising with this + * post-processor's {@link Advisor}. + *

Delegates to {@link #isEligible(Class)} for target class checking. + * Can be overridden e.g. to specifically exclude certain beans by name. + *

Note: Only called for regular bean instances but not for existing + * proxy instances which implement {@link Advised} and allow for adding + * the local {@link Advisor} to the existing proxy's {@link Advisor} chain. + * For the latter, {@link #isEligible(Class)} is being called directly, + * with the actual target class behind the existing proxy (as determined + * by {@link AopUtils#getTargetClass(Object)}). + * @param bean the bean instance + * @param beanName the name of the bean + * @see #isEligible(Class) + */ + protected boolean isEligible(Object bean, String beanName) { + return isEligible(bean.getClass()); + } + + /** + * Check whether the given class is eligible for advising with this + * post-processor's {@link Advisor}. + *

Implements caching of {@code canApply} results per bean target class. + * @param targetClass the class to check against + * @see AopUtils#canApply(Advisor, Class) + */ + protected boolean isEligible(Class targetClass) { + Boolean eligible = this.eligibleBeans.get(targetClass); + if (eligible != null) { + return eligible; + } + eligible = AopUtils.canApply(this.advisor, targetClass); + this.eligibleBeans.put(targetClass, eligible); + return eligible; + } + +} Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AbstractSingletonProxyFactoryBean.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/Advised.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AdvisedSupport.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AdvisedSupportListener.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AdvisorChainFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AopConfigException.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AopContext.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AopInfrastructureBean.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AopProxy.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AopProxyFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/AopProxyUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/framework/CglibAopProxy.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/framework/CglibAopProxy.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/framework/CglibAopProxy.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,943 @@ +/* + * Copyright 2002-2014 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; + +import java.io.Serializable; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.UndeclaredThrowableException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; + +import org.aopalliance.aop.Advice; +import org.aopalliance.intercept.MethodInvocation; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.aop.Advisor; +import org.springframework.aop.AopInvocationException; +import org.springframework.aop.PointcutAdvisor; +import org.springframework.aop.RawTargetAccess; +import org.springframework.aop.TargetSource; +import org.springframework.aop.support.AopUtils; +import org.springframework.cglib.core.CodeGenerationException; +import org.springframework.cglib.core.SpringNamingPolicy; +import org.springframework.cglib.proxy.Callback; +import org.springframework.cglib.proxy.CallbackFilter; +import org.springframework.cglib.proxy.Dispatcher; +import org.springframework.cglib.proxy.Enhancer; +import org.springframework.cglib.proxy.Factory; +import org.springframework.cglib.proxy.MethodInterceptor; +import org.springframework.cglib.proxy.MethodProxy; +import org.springframework.cglib.proxy.NoOp; +import org.springframework.cglib.transform.impl.UndeclaredThrowableStrategy; +import org.springframework.core.SmartClassLoader; +import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; +import org.springframework.util.ObjectUtils; + +/** + * CGLIB-based {@link AopProxy} implementation for the Spring AOP framework. + * + *

Formerly named {@code Cglib2AopProxy}, as of Spring 3.2, this class depends on + * Spring's own internally repackaged version of CGLIB 3.. + * + *

Objects of this type should be obtained through proxy factories, + * configured by an {@link AdvisedSupport} object. This class is internal + * to Spring's AOP framework and need not be used directly by client code. + * + *

{@link DefaultAopProxyFactory} will automatically create CGLIB-based + * proxies if necessary, for example in case of proxying a target class + * (see the {@link DefaultAopProxyFactory attendant javadoc} for details). + * + *

Proxies created using this class are thread-safe if the underlying + * (target) class is thread-safe. + * + * @author Rod Johnson + * @author Rob Harrop + * @author Juergen Hoeller + * @author Ramnivas Laddad + * @author Chris Beams + * @author Dave Syer + * @see org.springframework.cglib.proxy.Enhancer + * @see AdvisedSupport#setProxyTargetClass + * @see DefaultAopProxyFactory + */ +@SuppressWarnings("serial") +class CglibAopProxy implements AopProxy, Serializable { + + // Constants for CGLIB callback array indices + private static final int AOP_PROXY = 0; + private static final int INVOKE_TARGET = 1; + private static final int NO_OVERRIDE = 2; + private static final int DISPATCH_TARGET = 3; + private static final int DISPATCH_ADVISED = 4; + private static final int INVOKE_EQUALS = 5; + private static final int INVOKE_HASHCODE = 6; + + + /** Logger available to subclasses; static to optimize serialization */ + protected final static Log logger = LogFactory.getLog(CglibAopProxy.class); + + /** Keeps track of the Classes that we have validated for final methods */ + private static final Map, Boolean> validatedClasses = new WeakHashMap, Boolean>(); + + + /** The configuration used to configure this proxy */ + protected final AdvisedSupport advised; + + private Object[] constructorArgs; + + private Class[] constructorArgTypes; + + /** Dispatcher used for methods on Advised */ + private final transient AdvisedDispatcher advisedDispatcher; + + private transient Map fixedInterceptorMap; + + private transient int fixedInterceptorOffset; + + + /** + * Create a new CglibAopProxy for the given AOP configuration. + * @param config the AOP configuration as AdvisedSupport object + * @throws AopConfigException if the config is invalid. We try to throw an informative + * exception in this case, rather than let a mysterious failure happen later. + */ + public CglibAopProxy(AdvisedSupport config) throws AopConfigException { + Assert.notNull(config, "AdvisedSupport must not be null"); + if (config.getAdvisors().length == 0 && config.getTargetSource() == AdvisedSupport.EMPTY_TARGET_SOURCE) { + throw new AopConfigException("No advisors and no TargetSource specified"); + } + this.advised = config; + this.advisedDispatcher = new AdvisedDispatcher(this.advised); + } + + /** + * Set constructor arguments to use for creating the proxy. + * @param constructorArgs the constructor argument values + * @param constructorArgTypes the constructor argument types + */ + public void setConstructorArguments(Object[] constructorArgs, Class[] constructorArgTypes) { + if (constructorArgs == null || constructorArgTypes == null) { + throw new IllegalArgumentException("Both 'constructorArgs' and 'constructorArgTypes' need to be specified"); + } + if (constructorArgs.length != constructorArgTypes.length) { + throw new IllegalArgumentException("Number of 'constructorArgs' (" + constructorArgs.length + + ") must match number of 'constructorArgTypes' (" + constructorArgTypes.length + ")"); + } + this.constructorArgs = constructorArgs; + this.constructorArgTypes = constructorArgTypes; + } + + + @Override + public Object getProxy() { + return getProxy(null); + } + + @Override + public Object getProxy(ClassLoader classLoader) { + if (logger.isDebugEnabled()) { + logger.debug("Creating CGLIB proxy: target source is " + this.advised.getTargetSource()); + } + + try { + Class rootClass = this.advised.getTargetClass(); + Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy"); + + Class proxySuperClass = rootClass; + if (ClassUtils.isCglibProxyClass(rootClass)) { + proxySuperClass = rootClass.getSuperclass(); + Class[] additionalInterfaces = rootClass.getInterfaces(); + for (Class additionalInterface : additionalInterfaces) { + this.advised.addInterface(additionalInterface); + } + } + + // Validate the class, writing log messages as necessary. + validateClassIfNecessary(proxySuperClass); + + // Configure CGLIB Enhancer... + Enhancer enhancer = createEnhancer(); + if (classLoader != null) { + enhancer.setClassLoader(classLoader); + if (classLoader instanceof SmartClassLoader && + ((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) { + enhancer.setUseCache(false); + } + } + enhancer.setSuperclass(proxySuperClass); + enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised)); + enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); + enhancer.setStrategy(new UndeclaredThrowableStrategy(UndeclaredThrowableException.class)); + + Callback[] callbacks = getCallbacks(rootClass); + Class[] types = new Class[callbacks.length]; + for (int x = 0; x < types.length; x++) { + types[x] = callbacks[x].getClass(); + } + // fixedInterceptorMap only populated at this point, after getCallbacks call above + enhancer.setCallbackFilter(new ProxyCallbackFilter( + this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset)); + enhancer.setCallbackTypes(types); + + // Generate the proxy class and create a proxy instance. + return createProxyClassAndInstance(enhancer, callbacks); + } + catch (CodeGenerationException 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", + ex); + } + catch (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", + ex); + } + catch (Exception ex) { + // TargetSource.getTarget() failed + throw new AopConfigException("Unexpected AOP exception", ex); + } + } + + protected Object createProxyClassAndInstance(Enhancer enhancer, Callback[] callbacks) { + enhancer.setInterceptDuringConstruction(false); + enhancer.setCallbacks(callbacks); + return (this.constructorArgs != null ? + enhancer.create(this.constructorArgTypes, this.constructorArgs) : + enhancer.create()); + } + + /** + * Creates the CGLIB {@link Enhancer}. Subclasses may wish to override this to return a custom + * {@link Enhancer} implementation. + */ + protected Enhancer createEnhancer() { + return new Enhancer(); + } + + /** + * Checks to see whether the supplied {@code Class} has already been validated and + * validates it if not. + */ + private void validateClassIfNecessary(Class proxySuperClass) { + if (logger.isWarnEnabled()) { + synchronized (validatedClasses) { + if (!validatedClasses.containsKey(proxySuperClass)) { + doValidateClass(proxySuperClass); + validatedClasses.put(proxySuperClass, Boolean.TRUE); + } + } + } + } + + /** + * Checks for final methods on the {@code Class} and writes warnings to the log + * for each one found. + */ + private void doValidateClass(Class proxySuperClass) { + if (logger.isWarnEnabled()) { + Method[] methods = proxySuperClass.getMethods(); + for (Method method : methods) { + if (!Object.class.equals(method.getDeclaringClass()) && !Modifier.isStatic(method.getModifiers()) && + Modifier.isFinal(method.getModifiers())) { + logger.warn("Unable to proxy method [" + method + "] because it is final: " + + "All calls to this method via a proxy will NOT be routed to the target instance."); + } + } + } + } + + private Callback[] getCallbacks(Class rootClass) throws Exception { + // Parameters used for optimisation choices... + boolean exposeProxy = this.advised.isExposeProxy(); + boolean isFrozen = this.advised.isFrozen(); + boolean isStatic = this.advised.getTargetSource().isStatic(); + + // Choose an "aop" interceptor (used for AOP calls). + Callback aopInterceptor = new DynamicAdvisedInterceptor(this.advised); + + // Choose a "straight to target" interceptor. (used for calls that are + // unadvised but can return this). May be required to expose the proxy. + Callback targetInterceptor; + if (exposeProxy) { + targetInterceptor = isStatic ? + new StaticUnadvisedExposedInterceptor(this.advised.getTargetSource().getTarget()) : + new DynamicUnadvisedExposedInterceptor(this.advised.getTargetSource()); + } + else { + targetInterceptor = isStatic ? + new StaticUnadvisedInterceptor(this.advised.getTargetSource().getTarget()) : + new DynamicUnadvisedInterceptor(this.advised.getTargetSource()); + } + + // Choose a "direct to target" dispatcher (used for + // unadvised calls to static targets that cannot return this). + Callback targetDispatcher = isStatic ? + new StaticDispatcher(this.advised.getTargetSource().getTarget()) : new SerializableNoOp(); + + Callback[] mainCallbacks = new Callback[]{ + aopInterceptor, // for normal advice + targetInterceptor, // invoke target without considering advice, if optimized + new SerializableNoOp(), // no override for methods mapped to this + targetDispatcher, this.advisedDispatcher, + new EqualsInterceptor(this.advised), + new HashCodeInterceptor(this.advised) + }; + + Callback[] callbacks; + + // If the target is a static one and the advice chain is frozen, + // then we can make some optimisations by sending the AOP calls + // direct to the target using the fixed chain for that method. + if (isStatic && isFrozen) { + Method[] methods = rootClass.getMethods(); + Callback[] fixedCallbacks = new Callback[methods.length]; + this.fixedInterceptorMap = new HashMap(methods.length); + + // TODO: small memory optimisation here (can skip creation for methods with no advice) + for (int x = 0; x < methods.length; x++) { + List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(methods[x], rootClass); + fixedCallbacks[x] = new FixedChainStaticTargetInterceptor( + chain, this.advised.getTargetSource().getTarget(), this.advised.getTargetClass()); + this.fixedInterceptorMap.put(methods[x].toString(), x); + } + + // Now copy both the callbacks from mainCallbacks + // and fixedCallbacks into the callbacks array. + callbacks = new Callback[mainCallbacks.length + fixedCallbacks.length]; + System.arraycopy(mainCallbacks, 0, callbacks, 0, mainCallbacks.length); + System.arraycopy(fixedCallbacks, 0, callbacks, mainCallbacks.length, fixedCallbacks.length); + this.fixedInterceptorOffset = mainCallbacks.length; + } + else { + callbacks = mainCallbacks; + } + return callbacks; + } + + /** + * Process a return value. Wraps a return of {@code this} if necessary to be the + * {@code proxy} and also verifies that {@code null} is not returned as a primitive. + */ + private static Object processReturnType(Object proxy, Object target, Method method, Object retVal) { + // Massage return value if necessary + if (retVal != null && retVal == target && !RawTargetAccess.class.isAssignableFrom(method.getDeclaringClass())) { + // Special case: it returned "this". Note that we can't help + // if the target sets a reference to itself in another returned object. + retVal = proxy; + } + Class returnType = method.getReturnType(); + if (retVal == null && returnType != Void.TYPE && returnType.isPrimitive()) { + throw new AopInvocationException( + "Null return value from advice does not match primitive return type for: " + method); + } + return retVal; + } + + + @Override + public boolean equals(Object other) { + return (this == other || (other instanceof CglibAopProxy && + AopProxyUtils.equalsInProxy(this.advised, ((CglibAopProxy) other).advised))); + } + + @Override + public int hashCode() { + return CglibAopProxy.class.hashCode() * 13 + this.advised.getTargetSource().hashCode(); + } + + + /** + * Serializable replacement for CGLIB's NoOp interface. + * Public to allow use elsewhere in the framework. + */ + public static class SerializableNoOp implements NoOp, Serializable { + } + + + /** + * Method interceptor used for static targets with no advice chain. The call + * is passed directly back to the target. Used when the proxy needs to be + * exposed and it can't be determined that the method won't return + * {@code this}. + */ + private static class StaticUnadvisedInterceptor implements MethodInterceptor, Serializable { + + private final Object target; + + public StaticUnadvisedInterceptor(Object target) { + this.target = target; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + Object retVal = methodProxy.invoke(this.target, args); + return processReturnType(proxy, this.target, method, retVal); + } + } + + + /** + * Method interceptor used for static targets with no advice chain, when the + * proxy is to be exposed. + */ + private static class StaticUnadvisedExposedInterceptor implements MethodInterceptor, Serializable { + + private final Object target; + + public StaticUnadvisedExposedInterceptor(Object target) { + this.target = target; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + Object oldProxy = null; + try { + oldProxy = AopContext.setCurrentProxy(proxy); + Object retVal = methodProxy.invoke(this.target, args); + return processReturnType(proxy, this.target, method, retVal); + } + finally { + AopContext.setCurrentProxy(oldProxy); + } + } + } + + + /** + * Interceptor used to invoke a dynamic target without creating a method + * invocation or evaluating an advice chain. (We know there was no advice + * for this method.) + */ + private static class DynamicUnadvisedInterceptor implements MethodInterceptor, Serializable { + + private final TargetSource targetSource; + + public DynamicUnadvisedInterceptor(TargetSource targetSource) { + this.targetSource = targetSource; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + Object target = this.targetSource.getTarget(); + try { + Object retVal = methodProxy.invoke(target, args); + return processReturnType(proxy, target, method, retVal); + } + finally { + this.targetSource.releaseTarget(target); + } + } + } + + + /** + * Interceptor for unadvised dynamic targets when the proxy needs exposing. + */ + private static class DynamicUnadvisedExposedInterceptor implements MethodInterceptor, Serializable { + + private final TargetSource targetSource; + + public DynamicUnadvisedExposedInterceptor(TargetSource targetSource) { + this.targetSource = targetSource; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + Object oldProxy = null; + Object target = this.targetSource.getTarget(); + try { + oldProxy = AopContext.setCurrentProxy(proxy); + Object retVal = methodProxy.invoke(target, args); + return processReturnType(proxy, target, method, retVal); + } + finally { + AopContext.setCurrentProxy(oldProxy); + this.targetSource.releaseTarget(target); + } + } + } + + + /** + * Dispatcher for a static target. Dispatcher is much faster than + * interceptor. This will be used whenever it can be determined that a + * method definitely does not return "this" + */ + private static class StaticDispatcher implements Dispatcher, Serializable { + + private Object target; + + public StaticDispatcher(Object target) { + this.target = target; + } + + @Override + public Object loadObject() { + return this.target; + } + } + + + /** + * Dispatcher for any methods declared on the Advised class. + */ + private static class AdvisedDispatcher implements Dispatcher, Serializable { + + private final AdvisedSupport advised; + + public AdvisedDispatcher(AdvisedSupport advised) { + this.advised = advised; + } + + @Override + public Object loadObject() throws Exception { + return this.advised; + } + } + + + /** + * Dispatcher for the {@code equals} method. + * Ensures that the method call is always handled by this class. + */ + private static class EqualsInterceptor implements MethodInterceptor, Serializable { + + private final AdvisedSupport advised; + + public EqualsInterceptor(AdvisedSupport advised) { + this.advised = advised; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) { + Object other = args[0]; + if (proxy == other) { + return true; + } + if (other instanceof Factory) { + Callback callback = ((Factory) other).getCallback(INVOKE_EQUALS); + if (!(callback instanceof EqualsInterceptor)) { + return false; + } + AdvisedSupport otherAdvised = ((EqualsInterceptor) callback).advised; + return AopProxyUtils.equalsInProxy(this.advised, otherAdvised); + } + else { + return false; + } + } + } + + + /** + * Dispatcher for the {@code hashCode} method. + * Ensures that the method call is always handled by this class. + */ + private static class HashCodeInterceptor implements MethodInterceptor, Serializable { + + private final AdvisedSupport advised; + + public HashCodeInterceptor(AdvisedSupport advised) { + this.advised = advised; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) { + return CglibAopProxy.class.hashCode() * 13 + this.advised.getTargetSource().hashCode(); + } + } + + + /** + * Interceptor used specifically for advised methods on a frozen, static proxy. + */ + private static class FixedChainStaticTargetInterceptor implements MethodInterceptor, Serializable { + + private final List adviceChain; + + private final Object target; + + private final Class targetClass; + + public FixedChainStaticTargetInterceptor(List adviceChain, Object target, Class targetClass) { + this.adviceChain = adviceChain; + this.target = target; + this.targetClass = targetClass; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + MethodInvocation invocation = new CglibMethodInvocation(proxy, this.target, method, args, + this.targetClass, this.adviceChain, methodProxy); + // If we get here, we need to create a MethodInvocation. + Object retVal = invocation.proceed(); + retVal = processReturnType(proxy, this.target, method, retVal); + return retVal; + } + } + + + /** + * General purpose AOP callback. Used when the target is dynamic or when the + * proxy is not frozen. + */ + private static class DynamicAdvisedInterceptor implements MethodInterceptor, Serializable { + + private final AdvisedSupport advised; + + public DynamicAdvisedInterceptor(AdvisedSupport advised) { + this.advised = advised; + } + + @Override + public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + Object oldProxy = null; + boolean setProxyContext = false; + Class targetClass = null; + Object target = null; + try { + if (this.advised.exposeProxy) { + // Make invocation available if necessary. + oldProxy = AopContext.setCurrentProxy(proxy); + setProxyContext = true; + } + // May be null. Get as late as possible to minimize the time we + // "own" the target, in case it comes from a pool... + target = getTarget(); + if (target != null) { + targetClass = target.getClass(); + } + List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); + Object retVal; + // Check whether we only have one InvokerInterceptor: that is, + // no real advice, but just reflective invocation of the target. + if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) { + // We can skip creating a MethodInvocation: just invoke the target directly. + // Note that the final invoker must be an InvokerInterceptor, so we know + // it does nothing but a reflective operation on the target, and no hot + // swapping or fancy proxying. + retVal = methodProxy.invoke(target, args); + } + else { + // We need to create a method invocation... + retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed(); + } + retVal = processReturnType(proxy, target, method, retVal); + return retVal; + } + finally { + if (target != null) { + releaseTarget(target); + } + if (setProxyContext) { + // Restore old proxy. + AopContext.setCurrentProxy(oldProxy); + } + } + } + + @Override + public boolean equals(Object other) { + return (this == other || + (other instanceof DynamicAdvisedInterceptor && + this.advised.equals(((DynamicAdvisedInterceptor) other).advised))); + } + + /** + * CGLIB uses this to drive proxy creation. + */ + @Override + public int hashCode() { + return this.advised.hashCode(); + } + + protected Object getTarget() throws Exception { + return this.advised.getTargetSource().getTarget(); + } + + protected void releaseTarget(Object target) throws Exception { + this.advised.getTargetSource().releaseTarget(target); + } + } + + + /** + * Implementation of AOP Alliance MethodInvocation used by this AOP proxy. + */ + private static class CglibMethodInvocation extends ReflectiveMethodInvocation { + + private final MethodProxy methodProxy; + + private final boolean publicMethod; + + public CglibMethodInvocation(Object proxy, Object target, Method method, Object[] arguments, + Class targetClass, List interceptorsAndDynamicMethodMatchers, MethodProxy methodProxy) { + super(proxy, target, method, arguments, targetClass, interceptorsAndDynamicMethodMatchers); + this.methodProxy = methodProxy; + this.publicMethod = Modifier.isPublic(method.getModifiers()); + } + + /** + * Gives a marginal performance improvement versus using reflection to + * invoke the target when invoking public methods. + */ + @Override + protected Object invokeJoinpoint() throws Throwable { + if (this.publicMethod) { + return this.methodProxy.invoke(this.target, this.arguments); + } + else { + return super.invokeJoinpoint(); + } + } + } + + + /** + * CallbackFilter to assign Callbacks to methods. + */ + private static class ProxyCallbackFilter implements CallbackFilter { + + private final AdvisedSupport advised; + + private final Map fixedInterceptorMap; + + private final int fixedInterceptorOffset; + + public ProxyCallbackFilter(AdvisedSupport advised, Map fixedInterceptorMap, int fixedInterceptorOffset) { + this.advised = advised; + this.fixedInterceptorMap = fixedInterceptorMap; + this.fixedInterceptorOffset = fixedInterceptorOffset; + } + + /** + * Implementation of CallbackFilter.accept() to return the index of the + * callback we need. + *

The callbacks for each proxy are built up of a set of fixed callbacks + * for general use and then a set of callbacks that are specific to a method + * for use on static targets with a fixed advice chain. + *

The callback used is determined thus: + *

+ *
For exposed proxies
+ *
Exposing the proxy requires code to execute before and after the + * method/chain invocation. This means we must use + * DynamicAdvisedInterceptor, since all other interceptors can avoid the + * need for a try/catch block
+ *
For Object.finalize():
+ *
No override for this method is used.
+ *
For equals():
+ *
The EqualsInterceptor is used to redirect equals() calls to a + * special handler to this proxy.
+ *
For methods on the Advised class:
+ *
the AdvisedDispatcher is used to dispatch the call directly to + * the target
+ *
For advised methods:
+ *
If the target is static and the advice chain is frozen then a + * FixedChainStaticTargetInterceptor specific to the method is used to + * invoke the advice chain. Otherwise a DyanmicAdvisedInterceptor is + * used.
+ *
For non-advised methods:
+ *
Where it can be determined that the method will not return {@code this} + * or when {@code ProxyFactory.getExposeProxy()} returns {@code false}, + * then a Dispatcher is used. For static targets, the StaticDispatcher is used; + * and for dynamic targets, a DynamicUnadvisedInterceptor is used. + * If it possible for the method to return {@code this} then a + * StaticUnadvisedInterceptor is used for static targets - the + * DynamicUnadvisedInterceptor already considers this.
+ *
+ */ + @Override + public int accept(Method method) { + if (AopUtils.isFinalizeMethod(method)) { + logger.debug("Found finalize() method - using NO_OVERRIDE"); + return NO_OVERRIDE; + } + if (!this.advised.isOpaque() && method.getDeclaringClass().isInterface() && + method.getDeclaringClass().isAssignableFrom(Advised.class)) { + if (logger.isDebugEnabled()) { + logger.debug("Method is declared on Advised interface: " + method); + } + return DISPATCH_ADVISED; + } + // We must always proxy equals, to direct calls to this. + if (AopUtils.isEqualsMethod(method)) { + logger.debug("Found 'equals' method: " + method); + return INVOKE_EQUALS; + } + // We must always calculate hashCode based on the proxy. + if (AopUtils.isHashCodeMethod(method)) { + logger.debug("Found 'hashCode' method: " + method); + return INVOKE_HASHCODE; + } + Class targetClass = this.advised.getTargetClass(); + // Proxy is not yet available, but that shouldn't matter. + List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); + boolean haveAdvice = !chain.isEmpty(); + boolean exposeProxy = this.advised.isExposeProxy(); + boolean isStatic = this.advised.getTargetSource().isStatic(); + boolean isFrozen = this.advised.isFrozen(); + if (haveAdvice || !isFrozen) { + // If exposing the proxy, then AOP_PROXY must be used. + if (exposeProxy) { + if (logger.isDebugEnabled()) { + logger.debug("Must expose proxy on advised method: " + method); + } + return AOP_PROXY; + } + String key = method.toString(); + // Check to see if we have fixed interceptor to serve this method. + // Else use the AOP_PROXY. + if (isStatic && isFrozen && this.fixedInterceptorMap.containsKey(key)) { + if (logger.isDebugEnabled()) { + logger.debug("Method has advice and optimisations are enabled: " + method); + } + // We know that we are optimising so we can use the + // FixedStaticChainInterceptors. + int index = this.fixedInterceptorMap.get(key); + return (index + this.fixedInterceptorOffset); + } + else { + if (logger.isDebugEnabled()) { + logger.debug("Unable to apply any optimisations to advised method: " + method); + } + return AOP_PROXY; + } + } + else { + // See if the return type of the method is outside the class hierarchy + // of the target type. If so we know it never needs to have return type + // massage and can use a dispatcher. + // If the proxy is being exposed, then must use the interceptor the + // correct one is already configured. If the target is not static, then + // cannot use a dispatcher because the target cannot be released. + if (exposeProxy || !isStatic) { + return INVOKE_TARGET; + } + Class returnType = method.getReturnType(); + if (targetClass == returnType) { + if (logger.isDebugEnabled()) { + logger.debug("Method " + method + + "has return type same as target type (may return this) - using INVOKE_TARGET"); + } + return INVOKE_TARGET; + } + else if (returnType.isPrimitive() || !returnType.isAssignableFrom(targetClass)) { + if (logger.isDebugEnabled()) { + logger.debug("Method " + method + + " has return type that ensures this cannot be returned- using DISPATCH_TARGET"); + } + return DISPATCH_TARGET; + } + else { + if (logger.isDebugEnabled()) { + logger.debug("Method " + method + + "has return type that is assignable from the target type (may return this) - " + + "using INVOKE_TARGET"); + } + return INVOKE_TARGET; + } + } + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!(other instanceof ProxyCallbackFilter)) { + return false; + } + ProxyCallbackFilter otherCallbackFilter = (ProxyCallbackFilter) other; + AdvisedSupport otherAdvised = otherCallbackFilter.advised; + if (this.advised == null || otherAdvised == null) { + return false; + } + if (this.advised.isFrozen() != otherAdvised.isFrozen()) { + return false; + } + if (this.advised.isExposeProxy() != otherAdvised.isExposeProxy()) { + return false; + } + if (this.advised.getTargetSource().isStatic() != otherAdvised.getTargetSource().isStatic()) { + return false; + } + if (!AopProxyUtils.equalsProxiedInterfaces(this.advised, otherAdvised)) { + return false; + } + // Advice instance identity is unimportant to the proxy class: + // All that matters is type and ordering. + Advisor[] thisAdvisors = this.advised.getAdvisors(); + Advisor[] thatAdvisors = otherAdvised.getAdvisors(); + if (thisAdvisors.length != thatAdvisors.length) { + return false; + } + for (int i = 0; i < thisAdvisors.length; i++) { + Advisor thisAdvisor = thisAdvisors[i]; + Advisor thatAdvisor = thatAdvisors[i]; + if (!equalsAdviceClasses(thisAdvisor, thatAdvisor)) { + return false; + } + if (!equalsPointcuts(thisAdvisor, thatAdvisor)) { + return false; + } + } + return true; + } + + private boolean equalsAdviceClasses(Advisor a, Advisor b) { + Advice aa = a.getAdvice(); + Advice ba = b.getAdvice(); + if (aa == null || ba == null) { + return (aa == ba); + } + return aa.getClass().equals(ba.getClass()); + } + + private boolean equalsPointcuts(Advisor a, Advisor b) { + // If only one of the advisor (but not both) is PointcutAdvisor, then it is a mismatch. + // Takes care of the situations where an IntroductionAdvisor is used (see SPR-3959). + return (!(a instanceof PointcutAdvisor) || + (b instanceof PointcutAdvisor && + ObjectUtils.nullSafeEquals(((PointcutAdvisor) a).getPointcut(), ((PointcutAdvisor) b).getPointcut()))); + } + + @Override + public int hashCode() { + int hashCode = 0; + Advisor[] advisors = this.advised.getAdvisors(); + for (Advisor advisor : advisors) { + Advice advice = advisor.getAdvice(); + if (advice != null) { + hashCode = 13 * hashCode + advice.getClass().hashCode(); + } + } + hashCode = 13 * hashCode + (this.advised.isFrozen() ? 1 : 0); + hashCode = 13 * hashCode + (this.advised.isExposeProxy() ? 1 : 0); + hashCode = 13 * hashCode + (this.advised.isOptimize() ? 1 : 0); + hashCode = 13 * hashCode + (this.advised.isOpaque() ? 1 : 0); + return hashCode; + } + } + +} Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/DefaultAdvisorChainFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/DefaultAopProxyFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/InterceptorAndDynamicMethodMatcher.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/JdkDynamicAopProxy.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/framework/ObjenesisCglibAopProxy.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/framework/ObjenesisCglibAopProxy.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/framework/ObjenesisCglibAopProxy.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,70 @@ +/* + * 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.aop.framework; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.cglib.proxy.Callback; +import org.springframework.cglib.proxy.Enhancer; +import org.springframework.cglib.proxy.Factory; +import org.springframework.objenesis.ObjenesisException; +import org.springframework.objenesis.ObjenesisStd; + +/** + * Objenesis based extension of {@link CglibAopProxy} to create proxy instances without + * invoking the constructor of the class. + * + * @author Oliver Gierke + * @since 4.0 + */ +@SuppressWarnings("serial") +class ObjenesisCglibAopProxy extends CglibAopProxy { + + private static final Log logger = LogFactory.getLog(ObjenesisCglibAopProxy.class); + + private final ObjenesisStd objenesis; + + + /** + * Creates a new {@link ObjenesisCglibAopProxy} using the given {@link AdvisedSupport}. + * @param config must not be {@literal null}. + */ + public ObjenesisCglibAopProxy(AdvisedSupport config) { + super(config); + this.objenesis = new ObjenesisStd(true); + } + + + @Override + @SuppressWarnings("unchecked") + protected Object createProxyClassAndInstance(Enhancer enhancer, Callback[] callbacks) { + try { + Factory factory = (Factory) this.objenesis.newInstance(enhancer.createClass()); + factory.setCallbacks(callbacks); + return factory; + } + catch (ObjenesisException ex) { + // Fallback to regular proxy construction on unsupported JVMs + if (logger.isDebugEnabled()) { + logger.debug("Unable to instantiate proxy using Objenesis, falling back to regular proxy construction", ex); + } + return super.createProxyClassAndInstance(enhancer, callbacks); + } + } + +} Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/ProxyConfig.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/ProxyCreatorSupport.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/ProxyFactory.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/ProxyFactoryBean.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/ReflectiveMethodInvocation.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/AdvisorAdapter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/AdvisorAdapterRegistrationManager.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/AdvisorAdapterRegistry.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/AfterReturningAdviceAdapter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/AfterReturningAdviceInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/DefaultAdvisorAdapterRegistry.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/GlobalAdvisorAdapterRegistry.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/MethodBeforeAdviceAdapter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/MethodBeforeAdviceInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/ThrowsAdviceAdapter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/ThrowsAdviceInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/adapter/UnknownAdviceTypeException.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/framework/adapter/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/framework/adapter/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/framework/adapter/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,18 @@ + +/** + * + * SPI package allowing Spring AOP framework to handle arbitrary advice types. + *
+ * Users who want merely to use the Spring AOP framework, rather than extend + * its capabilities, don't need to concern themselves with this package. + *
+ * You may wish to use these adapters to wrap Spring-specific advices, such as MethodBeforeAdvice, + * in MethodInterceptor, to allow their use in another AOP framework supporting the AOP Alliance interfaces. + *
+ *
+ * These adapters do not depend on any other Spring framework classes to allow such usage. + *
+ * + */ +package org.springframework.aop.framework.adapter; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/AbstractAdvisorAutoProxyCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/AbstractAutoProxyCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/AutoProxyUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/BeanFactoryAdvisorRetrievalHelper.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/BeanNameAutoProxyCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/DefaultAdvisorAutoProxyCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/InfrastructureAdvisorAutoProxyCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/ProxyCreationContext.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/TargetSourceCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,16 @@ + +/** + * + * Bean post-processors for use in ApplicationContexts to simplify AOP usage + * by automatically creating AOP proxies without the need to use a ProxyFactoryBean. + * + *

The various post-processors in this package need only be added to an ApplicationContext + * (typically in an XML bean definition document) to automatically proxy selected beans. + * + *

NB: Automatic auto-proxying is not supported for BeanFactory implementations, + * as post-processors beans are only automatically detected in application contexts. + * Post-processors can be explicitly registered on a ConfigurableBeanFactory instead. + * + */ +package org.springframework.aop.framework.autoproxy; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/target/AbstractBeanFactoryBasedTargetSourceCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/target/LazyInitTargetSourceCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/framework/autoproxy/target/QuickTargetSourceCreator.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/framework/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/framework/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/framework/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,19 @@ + +/** + * + * Package containing Spring's basic AOP infrastructure, compliant with the + * AOP Alliance interfaces. + * + *

Spring AOP supports proxying interfaces or classes, introductions, and offers + * static and dynamic pointcuts. + * + *

Any Spring AOP proxy can be cast to the ProxyConfig AOP configuration interface + * in this package to add or remove interceptors. + * + *

The ProxyFactoryBean is a convenient way to create AOP proxies in a BeanFactory + * or ApplicationContext. However, proxies can be created programmatically using the + * ProxyFactory class. + * + */ +package org.springframework.aop.framework; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/AbstractMonitoringInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/AbstractTraceInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,125 @@ +/* + * Copyright 2002-2014 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.interceptor; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.core.task.support.TaskExecutorAdapter; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Base class for asynchronous method execution aspects, such as + * {@link org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor} + * or {@code org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect}. + * + *

Provides support for executor qualification on a method-by-method basis. + * {@code AsyncExecutionAspectSupport} objects must be constructed with a default {@code + * Executor}, but each individual method may further qualify a specific {@code Executor} + * bean to be used when executing it, e.g. through an annotation attribute. + * + * @author Chris Beams + * @since 3.1.2 + */ +public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { + + private final Map executors = new ConcurrentHashMap(16); + + private Executor defaultExecutor; + + private BeanFactory beanFactory; + + + /** + * Create a new {@link AsyncExecutionAspectSupport}, using the provided default + * executor unless individual async methods indicate via qualifier that a more + * specific executor should be used. + * @param defaultExecutor the executor to use when executing asynchronous methods + */ + public AsyncExecutionAspectSupport(Executor defaultExecutor) { + this.defaultExecutor = defaultExecutor; + } + + + /** + * Supply the executor to be used when executing async methods. + * @param defaultExecutor the {@code Executor} (typically a Spring {@code + * AsyncTaskExecutor} or {@link java.util.concurrent.ExecutorService}) to delegate to + * unless a more specific executor has been requested via a qualifier on the async + * method, in which case the executor will be looked up at invocation time against the + * enclosing bean factory. + * @see #getExecutorQualifier + * @see #setBeanFactory(BeanFactory) + */ + public void setExecutor(Executor defaultExecutor) { + this.defaultExecutor = defaultExecutor; + } + + /** + * Set the {@link BeanFactory} to be used when looking up executors by qualifier. + */ + @Override + public void setBeanFactory(BeanFactory beanFactory) { + this.beanFactory = beanFactory; + } + + + /** + * Determine the specific executor to use when executing the given method. + * @return the executor to use (or {@code null}, but just if no default executor has been set) + */ + protected AsyncTaskExecutor determineAsyncExecutor(Method method) { + AsyncTaskExecutor executor = this.executors.get(method); + if (executor == null) { + Executor executorToUse = this.defaultExecutor; + String qualifier = getExecutorQualifier(method); + if (StringUtils.hasLength(qualifier)) { + Assert.notNull(this.beanFactory, "BeanFactory must be set on " + getClass().getSimpleName() + + " to access qualified executor '" + qualifier + "'"); + executorToUse = BeanFactoryAnnotationUtils.qualifiedBeanOfType( + this.beanFactory, Executor.class, qualifier); + } + else if (executorToUse == null) { + return null; + } + executor = (executorToUse instanceof AsyncTaskExecutor ? + (AsyncTaskExecutor) executorToUse : new TaskExecutorAdapter(executorToUse)); + this.executors.put(method, executor); + } + return executor; + } + + /** + * Return the qualifier or bean name of the executor to be used when executing the + * given async method, typically specified in the form of an annotation attribute. + * Returning an empty string or {@code null} indicates that no specific executor has + * been specified and that the {@linkplain #setExecutor(Executor) default executor} + * should be used. + * @param method the method to inspect for executor qualifier metadata + * @return the qualifier if specified, otherwise empty string or {@code null} + * @see #determineAsyncExecutor(Method) + */ + protected abstract String getExecutorQualifier(Method method); + +} Index: 3rdParty_sources/spring/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,135 @@ +/* + * Copyright 2002-2014 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.interceptor; + +import java.lang.reflect.Method; +import java.util.concurrent.Callable; +import java.util.concurrent.Executor; +import java.util.concurrent.Future; + +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; + +import org.springframework.aop.support.AopUtils; +import org.springframework.core.BridgeMethodResolver; +import org.springframework.core.Ordered; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.util.ClassUtils; +import org.springframework.util.ReflectionUtils; + +/** + * AOP Alliance {@code MethodInterceptor} that processes method invocations + * asynchronously, using a given {@link org.springframework.core.task.AsyncTaskExecutor}. + * Typically used with the {@link org.springframework.scheduling.annotation.Async} annotation. + * + *

In terms of target method signatures, any parameter types are supported. + * However, the return type is constrained to either {@code void} or + * {@code java.util.concurrent.Future}. In the latter case, the Future handle + * returned from the proxy will be an actual asynchronous Future that can be used + * to track the result of the asynchronous method execution. However, since the + * target method needs to implement the same signature, it will have to return + * a temporary Future handle that just passes the return value through + * (like Spring's {@link org.springframework.scheduling.annotation.AsyncResult} + * or EJB 3.1's {@code javax.ejb.AsyncResult}). + * + *

As of Spring 3.1.2 the {@code AnnotationAsyncExecutionInterceptor} subclass is + * preferred for use due to its support for executor qualification in conjunction with + * Spring's {@code @Async} annotation. + * + * @author Juergen Hoeller + * @author Chris Beams + * @since 3.0 + * @see org.springframework.scheduling.annotation.Async + * @see org.springframework.scheduling.annotation.AsyncAnnotationAdvisor + * @see org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor + */ +public class AsyncExecutionInterceptor extends AsyncExecutionAspectSupport + implements MethodInterceptor, Ordered { + + /** + * Create a new {@code AsyncExecutionInterceptor}. + * @param defaultExecutor the {@link Executor} (typically a Spring {@link AsyncTaskExecutor} + * or {@link java.util.concurrent.ExecutorService}) to delegate to + */ + public AsyncExecutionInterceptor(Executor defaultExecutor) { + super(defaultExecutor); + } + + + /** + * Intercept the given method invocation, submit the actual calling of the method to + * the correct task executor and return immediately to the caller. + * @param invocation the method to intercept and make asynchronous + * @return {@link Future} if the original method returns {@code Future}; {@code null} + * otherwise. + */ + @Override + public Object invoke(final MethodInvocation invocation) throws Throwable { + Class targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null); + Method specificMethod = ClassUtils.getMostSpecificMethod(invocation.getMethod(), targetClass); + specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); + + AsyncTaskExecutor executor = determineAsyncExecutor(specificMethod); + if (executor == null) { + throw new IllegalStateException( + "No executor specified and no default executor set on AsyncExecutionInterceptor either"); + } + + Future result = executor.submit( + new Callable() { + @Override + public Object call() throws Exception { + try { + Object result = invocation.proceed(); + if (result instanceof Future) { + return ((Future) result).get(); + } + } + catch (Throwable ex) { + ReflectionUtils.rethrowException(ex); + } + return null; + } + }); + + if (Future.class.isAssignableFrom(invocation.getMethod().getReturnType())) { + return result; + } + else { + return null; + } + } + + /** + * This implementation is a no-op for compatibility in Spring 3.1.2. + * Subclasses may override to provide support for extracting qualifier information, + * e.g. via an annotation on the given method. + * @return always {@code null} + * @since 3.1.2 + * @see #determineAsyncExecutor(Method) + */ + @Override + protected String getExecutorQualifier(Method method) { + return null; + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } + +} Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/ConcurrencyThrottleInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/DebugInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/ExposeBeanNameAdvisors.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/ExposeInvocationInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/JamonPerformanceMonitorInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/PerformanceMonitorInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/interceptor/SimpleTraceInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/interceptor/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/interceptor/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/interceptor/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,10 @@ + +/** + * + * Provides miscellaneous interceptor implementations. + * More specific interceptors can be found in corresponding + * functionality packages, like "transaction" and "orm". + * + */ +package org.springframework.aop.interceptor; + Index: 3rdParty_sources/spring/org/springframework/aop/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,25 @@ + +/** + * + * Core Spring AOP interfaces, built on AOP Alliance AOP interoperability interfaces. + * + *
Any AOP Alliance MethodInterceptor is usable in Spring. + * + *
Spring AOP also offers: + *
    + *
  • Introduction support + *
  • A Pointcut abstraction, supporting "static" pointcuts + * (class and method-based) and "dynamic" pointcuts (also considering method arguments). + * There are currently no AOP Alliance interfaces for pointcuts. + *
  • A full range of advice types, including around, before, after returning and throws advice. + *
  • Extensibility allowing arbitrary custom advice types to + * be plugged in without modifying the core framework. + *
+ * + *
+ * Spring AOP can be used programmatically or (preferably) + * integrated with the Spring IoC container. + * + */ +package org.springframework.aop; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/scope/DefaultScopedObject.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/scope/ScopedObject.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/scope/ScopedProxyFactoryBean.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/scope/ScopedProxyUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/scope/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/scope/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/scope/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,8 @@ + +/** + * + * Support for AOP-based scoping of target objects, with configurable backend. + * + */ +package org.springframework.aop.scope; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/AbstractBeanFactoryPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/AbstractExpressionPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/AbstractGenericPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/AbstractPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/AbstractRegexpMethodPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/AopUtils.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/ClassFilters.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/ComposablePointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/ControlFlowPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/DefaultBeanFactoryPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/DefaultIntroductionAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/DefaultPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/DelegatePerTargetObjectIntroductionInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/DelegatingIntroductionInterceptor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/DynamicMethodMatcher.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/DynamicMethodMatcherPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/ExpressionPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/IntroductionInfoSupport.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/JdkRegexpMethodPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/MethodMatchers.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/NameMatchMethodPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/NameMatchMethodPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/Pointcuts.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/RegexpMethodPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/RootClassFilter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/StaticMethodMatcher.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/StaticMethodMatcherPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/StaticMethodMatcherPointcutAdvisor.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/annotation/AnnotationClassFilter.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/annotation/AnnotationMatchingPointcut.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/support/annotation/AnnotationMethodMatcher.java'. Fisheye: No comparison available. Pass `N' to diff? Index: 3rdParty_sources/spring/org/springframework/aop/support/annotation/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/support/annotation/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/support/annotation/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,8 @@ + +/** + * + * Annotation support for AOP pointcuts. + * + */ +package org.springframework.aop.support.annotation; + Index: 3rdParty_sources/spring/org/springframework/aop/support/package-info.java =================================================================== diff -u --- 3rdParty_sources/spring/org/springframework/aop/support/package-info.java (revision 0) +++ 3rdParty_sources/spring/org/springframework/aop/support/package-info.java (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -0,0 +1,8 @@ + +/** + * + * Convenience classes for using Spring's AOP API. + * + */ +package org.springframework.aop.support; + Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/AbstractBeanFactoryBasedTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/AbstractLazyCreationTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/AbstractPoolingTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/AbstractPrototypeBasedTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/CommonsPoolTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/EmptyTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/HotSwappableTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/LazyInitTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/PoolingConfig.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/PrototypeTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/SimpleBeanTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/SingletonTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/ThreadLocalTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/ThreadLocalTargetSourceStats.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/dynamic/AbstractRefreshableTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/dynamic/BeanFactoryRefreshableTargetSource.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 2b6774d5449fee3258575f0164adf4a2056aff5a refers to a dead (removed) revision in file `3rdParty_sources/spring/org/springframework/aop/target/dynamic/Refreshable.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_build/3rdParty.userlibraries =================================================================== diff -u -r2b6774d5449fee3258575f0164adf4a2056aff5a -rf7ffe05b8e0fa81c27c3e52ce296e6433706afc2 --- lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision 2b6774d5449fee3258575f0164adf4a2056aff5a) +++ lams_build/3rdParty.userlibraries (.../3rdParty.userlibraries) (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -44,5 +44,7 @@ + + Index: lams_build/build.xml =================================================================== diff -u -r2b6774d5449fee3258575f0164adf4a2056aff5a -rf7ffe05b8e0fa81c27c3e52ce296e6433706afc2 --- lams_build/build.xml (.../build.xml) (revision 2b6774d5449fee3258575f0164adf4a2056aff5a) +++ lams_build/build.xml (.../build.xml) (revision f7ffe05b8e0fa81c27c3e52ce296e6433706afc2) @@ -646,7 +646,7 @@ - + + +