Added testsuite, as one project for now. Will move individual tests to respective modules later
This commit is contained in:
6
org.springframework.testsuite/build.xml
Normal file
6
org.springframework.testsuite/build.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="org.springframework.testsuite">
|
||||
<property file="${basedir}/../build.properties"/>
|
||||
<import file="${basedir}/../build-spring-framework/package-bundle.xml"/>
|
||||
<import file="${basedir}/../spring-build/standard/default.xml"/>
|
||||
</project>
|
||||
81
org.springframework.testsuite/ivy.xml
Normal file
81
org.springframework.testsuite/ivy.xml
Normal file
@@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
|
||||
<ivy-module
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
|
||||
version="1.3">
|
||||
|
||||
<info organisation="org.springframework" module="${ant.project.name}">
|
||||
<license name="Apache 2.0" url="http://www.apache.org/licenses/LICENSE-2.0"/>
|
||||
</info>
|
||||
|
||||
<configurations>
|
||||
<include file="${spring.build.dir}/common/default-ivy-configurations.xml"/>
|
||||
<conf name="aspectj" extends="runtime" description="JARs needed to run with AspectJ"/>
|
||||
<conf name="commons-collections" extends="runtime" description="JARs needed to run with Commons Collections"/>
|
||||
<conf name="log4j" extends="runtime" description="JARs needed to use Log4J"/>
|
||||
</configurations>
|
||||
|
||||
<publications>
|
||||
<artifact name="${ant.project.name}"/>
|
||||
<artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
|
||||
</publications>
|
||||
|
||||
<dependencies>
|
||||
<dependency org="com.oracle.toplink" name="com.springsource.oracle.toplink" rev="10.1.3" conf="test->compile"/>
|
||||
<dependency org="com.ibm.websphere" name="com.springsource.com.ibm.websphere.uow" rev="6.0.2.17" conf="test->compile"/>
|
||||
<dependency org="com.opensymphony.quartz" name="com.springsource.org.quartz" rev="1.6.2" conf="test->compile"/>
|
||||
<dependency org="edu.emory.mathcs.backport" name="com.springsource.edu.emory.mathcs.backport" rev="3.0.0" conf="test->compile"/>
|
||||
<dependency org="javax.el" name="com.springsource.javax.el" rev="2.1.0" conf="test->compile"/>
|
||||
<dependency org="javax.faces" name="com.springsource.javax.faces" rev="1.2.0.08" conf="test->compile"/>
|
||||
<dependency org="javax.jdo" name="com.springsource.javax.jdo" rev="2.0.0" conf="test->compile"/>
|
||||
<dependency org="javax.jms" name="com.springsource.javax.jms" rev="1.1.0" conf="test->compile"/>
|
||||
<dependency org="javax.mail" name="com.springsource.javax.mail" rev="1.4.0" conf="test->compile"/>
|
||||
<dependency org="javax.portlet" name="com.springsource.javax.portlet" rev="1.0.0" conf="test->compile"/>
|
||||
<dependency org="javax.resource" name="com.springsource.javax.resource" rev="1.5.0" conf="test->compile"/>
|
||||
<dependency org="javax.servlet" name="com.springsource.javax.servlet" rev="2.4.0" conf="test->compile"/>
|
||||
<dependency org="javax.servlet" name="com.springsource.javax.servlet.jsp" rev="2.0.0" conf="test->compile"/>
|
||||
<dependency org="javax.servlet" name="com.springsource.javax.servlet.jsp.jstl" rev="1.1.2" conf="test->compile"/>
|
||||
<dependency org="javax.xml.rpc" name="com.springsource.javax.xml.rpc" rev="1.1.0" conf="test->compile"/>
|
||||
<dependency org="javax.transaction" name="com.springsource.javax.transaction" rev="1.1.0" conf="test->compile"/>
|
||||
<dependency org="net.sourceforge.cglib" name="com.springsource.net.sf.cglib" rev="2.1.3" conf="test->compile"/>
|
||||
<dependency org="net.sourceforge.ehcache" name="com.springsource.net.sf.ehcache" rev="1.3.0" conf="test->compile"/>
|
||||
<dependency org="net.sourceforge.jexcelapi" name="com.springsource.jxl" rev="2.6.6" conf="test->compile"/>
|
||||
<dependency org="net.sourceforge.jasperreports" name="com.springsource.net.sf.jasperreports" rev="2.0.5" conf="test->compile"/>
|
||||
<dependency org="org.dom4j" name="com.springsource.org.dom4j" rev="1.6.1" conf="test->compile"/>
|
||||
<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.dbcp" rev="1.2.2.osgi" conf="test->runtime"/>
|
||||
<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.fileupload" rev="1.2.0" conf="test->compile"/>
|
||||
<dependency org="org.apache.commons" name="com.springsource.org.apache.commons.pool" rev="1.4.0" conf="test->compile"/>
|
||||
<dependency org="org.apache.poi" name="com.springsource.org.apache.poi" rev="3.0.2.FINAL" conf="test->compile"/>
|
||||
<dependency org="org.apache.tiles" name="com.springsource.org.apache.tiles" rev="2.0.5" conf="test->compile"/>
|
||||
<dependency org="org.apache.tiles" name="com.springsource.org.apache.tiles.core" rev="2.0.5.osgi" conf="test->compile"/>
|
||||
<dependency org="org.apache.velocity" name="com.springsource.org.apache.velocity" rev="1.5.0" conf="test->compile"/>
|
||||
<dependency org="org.apache.velocity" name="com.springsource.org.apache.velocity.tools.view" rev="1.4.0" conf="test->compile"/>
|
||||
<dependency org="org.apache.tiles" name="com.springsource.org.apache.tiles.jsp" rev="2.0.5" conf="test->compile"/>
|
||||
<dependency org="org.aspectj" name="com.springsource.org.aspectj.weaver" rev="1.5.4" conf="test->compile"/>
|
||||
<dependency org="org.codehaus.groovy" name="com.springsource.org.codehaus.groovy" rev="1.5.1" conf="test->compile"/>
|
||||
<dependency org="org.easymock" name="com.springsource.org.easymock" rev="2.3.0" conf="test->compile"/>
|
||||
<dependency org="org.freemarker" name="com.springsource.freemarker" rev="2.3.12" conf="test->compile"/>
|
||||
<dependency org="org.hibernate" name="com.springsource.org.hibernate" rev="3.2.6.ga" conf="test->compile"/>
|
||||
<dependency org="org.objectweb.asm" name="com.springsource.org.objectweb.asm" rev="2.2.3" conf="test->runtime" />
|
||||
<dependency org="org.objectweb.asm" name="com.springsource.org.objectweb.asm.commons" rev="2.2.3" conf="test->runtime" />
|
||||
<dependency org="org.springframework" name="org.springframework.aop" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.beans" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.context" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.context.support" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.core" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.jdbc" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.jms" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.orm" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.test" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.transaction" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.web" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.web.servlet" rev="latest.integration" conf="test->compile"/>
|
||||
<dependency org="org.springframework" name="org.springframework.web.portlet" rev="latest.integration" conf="test->compile"/>
|
||||
<!-- test dependencies -->
|
||||
<dependency org="org.junit" name="com.springsource.org.junit" rev="4.4.0" conf="test->runtime" />
|
||||
<dependency org="org.apache.log4j" name="com.springsource.org.apache.log4j" rev="1.2.15" conf="test->compile"/>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</ivy-module>
|
||||
59
org.springframework.testsuite/pom.xml
Normal file
59
org.springframework.testsuite/pom.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>org.springframework.core</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>Spring Core Abstractions and Utilities</name>
|
||||
<version>3.0.0.M1</version>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>com.springsource.repository.bundles.external</id>
|
||||
<name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
|
||||
<url>http://repository.springsource.com/maven/bundles/external</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.5</source>
|
||||
<target>1.5</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>com.springsource.org.apache.commons.logging</artifactId>
|
||||
<version>1.1.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.log4j</groupId>
|
||||
<artifactId>com.springsource.org.apache.log4j</artifactId>
|
||||
<version>1.2.15</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>com.springsource.org.apache.commons.collections</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>com.springsource.org.aspectj.weaver</artifactId>
|
||||
<version>1.6.2.RELEASE</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.objectweb.asm</groupId>
|
||||
<artifactId>com.springsource.org.objectweb.asm.commons</artifactId>
|
||||
<version>2.2.3</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop;
|
||||
|
||||
/**
|
||||
* Simple BeforeAdvice for testing.
|
||||
*
|
||||
* @author Dmitriy Kopylenko
|
||||
*/
|
||||
public interface SimpleBeforeAdvice extends BeforeAdvice {
|
||||
|
||||
void before() throws Throwable;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.aopalliance.aop.Advice;
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
|
||||
import org.springframework.aop.framework.adapter.AdvisorAdapter;
|
||||
|
||||
/**
|
||||
* @author Dmitriy Kopylenko
|
||||
*/
|
||||
public class SimpleBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
|
||||
|
||||
public boolean supportsAdvice(Advice advice) {
|
||||
return (advice instanceof SimpleBeforeAdvice);
|
||||
}
|
||||
|
||||
public MethodInterceptor getInterceptor(Advisor advisor) {
|
||||
SimpleBeforeAdvice advice = (SimpleBeforeAdvice) advisor.getAdvice();
|
||||
return new SimpleBeforeAdviceInterceptor(advice) ;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop;
|
||||
|
||||
/**
|
||||
* @author Dmitriy Kopylenko
|
||||
*/
|
||||
public class SimpleBeforeAdviceImpl implements SimpleBeforeAdvice {
|
||||
|
||||
private int invocationCounter;
|
||||
|
||||
public void before() throws Throwable {
|
||||
++invocationCounter;
|
||||
}
|
||||
|
||||
public int getInvocationCounter() {
|
||||
return invocationCounter;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop;
|
||||
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
import org.aopalliance.intercept.MethodInvocation;
|
||||
|
||||
/**
|
||||
* @author Dmitriy Kopylenko
|
||||
*/
|
||||
final class SimpleBeforeAdviceInterceptor implements MethodInterceptor {
|
||||
|
||||
private SimpleBeforeAdvice advice;
|
||||
|
||||
public SimpleBeforeAdviceInterceptor(SimpleBeforeAdvice advice) {
|
||||
this.advice = advice;
|
||||
}
|
||||
|
||||
public Object invoke(MethodInvocation mi) throws Throwable {
|
||||
advice.before();
|
||||
return mi.proceed();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.aop.framework.Advised;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
public abstract class AbstractAdviceBindingTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
protected ITestBean testBeanProxy;
|
||||
|
||||
protected TestBean testBeanTarget;
|
||||
|
||||
public final void setTestBean(ITestBean injectedTestBean) throws Exception {
|
||||
assertTrue(AopUtils.isAopProxy(injectedTestBean));
|
||||
this.testBeanProxy = injectedTestBean;
|
||||
// we need the real target too, not just the proxy...
|
||||
this.testBeanTarget = (TestBean) ((Advised) testBeanProxy).getTargetSource().getTarget();
|
||||
}
|
||||
|
||||
// Simple test to ensure all is well with the XML file.
|
||||
// Note that this implicitly tests that the arg-names binding is working.
|
||||
public final void testParse() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
|
||||
/**
|
||||
* Aspect used as part of before advice binding tests.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AdviceBindingTestAspect {
|
||||
|
||||
protected AdviceBindingCollaborator collaborator = null;
|
||||
|
||||
public void setCollaborator(AdviceBindingCollaborator aCollaborator) {
|
||||
this.collaborator = aCollaborator;
|
||||
}
|
||||
|
||||
// "advice" methods
|
||||
public void oneIntArg(int age) {
|
||||
this.collaborator.oneIntArg(age);
|
||||
}
|
||||
|
||||
public void oneObjectArg(Object bean) {
|
||||
this.collaborator.oneObjectArg(bean);
|
||||
}
|
||||
|
||||
public void oneIntAndOneObject(int x, Object o) {
|
||||
this.collaborator.oneIntAndOneObject(x,o);
|
||||
}
|
||||
|
||||
public void needsJoinPoint(JoinPoint tjp) {
|
||||
this.collaborator.needsJoinPoint(tjp.getSignature().getName());
|
||||
}
|
||||
|
||||
public void needsJoinPointStaticPart(JoinPoint.StaticPart tjpsp) {
|
||||
this.collaborator.needsJoinPointStaticPart(tjpsp.getSignature().getName());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Collaborator interface that makes it easy to test this aspect is
|
||||
* working as expected through mocking.
|
||||
*/
|
||||
public interface AdviceBindingCollaborator {
|
||||
|
||||
void oneIntArg(int x);
|
||||
void oneObjectArg(Object o);
|
||||
void oneIntAndOneObject(int x, Object o);
|
||||
void needsJoinPoint(String s);
|
||||
void needsJoinPointStaticPart(String s);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.easymock.MockControl;
|
||||
|
||||
import org.springframework.aop.aspectj.AdviceBindingTestAspect.AdviceBindingCollaborator;
|
||||
|
||||
/**
|
||||
* Tests for various parameter binding scenarios with before advice.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
public class AfterAdviceBindingTests extends AbstractAdviceBindingTests {
|
||||
|
||||
private AdviceBindingTestAspect afterAdviceAspect;
|
||||
|
||||
private MockControl mockControl;
|
||||
|
||||
private AdviceBindingCollaborator mockCollaborator;
|
||||
|
||||
|
||||
public void setAfterAdviceAspect(AdviceBindingTestAspect anAspect) {
|
||||
this.afterAdviceAspect = anAspect;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "after-advice-tests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
super.onSetUp();
|
||||
mockControl = MockControl.createNiceControl(AdviceBindingCollaborator.class);
|
||||
mockCollaborator = (AdviceBindingCollaborator) mockControl.getMock();
|
||||
afterAdviceAspect.setCollaborator(mockCollaborator);
|
||||
}
|
||||
|
||||
|
||||
public void testOneIntArg() {
|
||||
mockCollaborator.oneIntArg(5);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneObjectArgBindingProxyWithThis() {
|
||||
mockCollaborator.oneObjectArg(this.testBeanProxy);
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneObjectArgBindingTarget() {
|
||||
mockCollaborator.oneObjectArg(this.testBeanTarget);
|
||||
mockControl.replay();
|
||||
testBeanProxy.getDoctor();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneIntAndOneObjectArgs() {
|
||||
mockCollaborator.oneIntAndOneObject(5,this.testBeanProxy);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testNeedsJoinPoint() {
|
||||
mockCollaborator.needsJoinPoint("getAge");
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testNeedsJoinPointStaticPart() {
|
||||
mockCollaborator.needsJoinPointStaticPart("getAge");
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class AfterReturningAdviceBindingTestAspect extends AdviceBindingTestAspect {
|
||||
|
||||
private AfterReturningAdviceBindingCollaborator getCollaborator() {
|
||||
return (AfterReturningAdviceBindingCollaborator) this.collaborator;
|
||||
}
|
||||
|
||||
public void oneString(String name) {
|
||||
getCollaborator().oneString(name);
|
||||
}
|
||||
|
||||
public void oneTestBeanArg(TestBean bean) {
|
||||
getCollaborator().oneTestBeanArg(bean);
|
||||
}
|
||||
|
||||
public void testBeanArrayArg(ITestBean[] beans) {
|
||||
getCollaborator().testBeanArrayArg(beans);
|
||||
}
|
||||
|
||||
public void objectMatchNoArgs() {
|
||||
getCollaborator().objectMatchNoArgs();
|
||||
}
|
||||
|
||||
public void stringMatchNoArgs() {
|
||||
getCollaborator().stringMatchNoArgs();
|
||||
}
|
||||
|
||||
public void oneInt(int result) {
|
||||
getCollaborator().oneInt(result);
|
||||
}
|
||||
|
||||
|
||||
interface AfterReturningAdviceBindingCollaborator extends AdviceBindingCollaborator {
|
||||
|
||||
void oneString(String s);
|
||||
void oneTestBeanArg(TestBean b);
|
||||
void testBeanArrayArg(ITestBean[] b);
|
||||
void objectMatchNoArgs();
|
||||
void stringMatchNoArgs();
|
||||
void oneInt(int result);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.easymock.MockControl;
|
||||
|
||||
import org.springframework.aop.aspectj.AfterReturningAdviceBindingTestAspect.AfterReturningAdviceBindingCollaborator;
|
||||
import org.springframework.aop.framework.Advised;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* Tests for various parameter binding scenarios with before advice.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
* @author Rod Johnson
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class AfterReturningAdviceBindingTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private AfterReturningAdviceBindingTestAspect afterAdviceAspect;
|
||||
|
||||
private ITestBean testBeanProxy;
|
||||
|
||||
private TestBean testBeanTarget;
|
||||
|
||||
private MockControl mockControl;
|
||||
|
||||
private AfterReturningAdviceBindingCollaborator mockCollaborator;
|
||||
|
||||
|
||||
public void setAfterReturningAdviceAspect(AfterReturningAdviceBindingTestAspect anAspect) {
|
||||
this.afterAdviceAspect = anAspect;
|
||||
}
|
||||
|
||||
public void setTestBean(ITestBean aBean) throws Exception {
|
||||
assertTrue(AopUtils.isAopProxy(aBean));
|
||||
this.testBeanProxy = aBean;
|
||||
// we need the real target too, not just the proxy...
|
||||
this.testBeanTarget = (TestBean) ((Advised)aBean).getTargetSource().getTarget();
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "afterReturning-advice-tests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
super.onSetUp();
|
||||
mockControl = MockControl.createNiceControl(AfterReturningAdviceBindingCollaborator.class);
|
||||
mockCollaborator = (AfterReturningAdviceBindingCollaborator) mockControl.getMock();
|
||||
afterAdviceAspect.setCollaborator(mockCollaborator);
|
||||
}
|
||||
|
||||
|
||||
// simple test to ensure all is well with the xml file
|
||||
// note that this implicitly tests that the arg-names binding is working
|
||||
public void testParse() {
|
||||
}
|
||||
|
||||
public void testOneIntArg() {
|
||||
mockCollaborator.oneIntArg(5);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneObjectArg() {
|
||||
mockCollaborator.oneObjectArg(this.testBeanProxy);
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneIntAndOneObjectArgs() {
|
||||
mockCollaborator.oneIntAndOneObject(5,this.testBeanProxy);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testNeedsJoinPoint() {
|
||||
mockCollaborator.needsJoinPoint("getAge");
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testNeedsJoinPointStaticPart() {
|
||||
mockCollaborator.needsJoinPointStaticPart("getAge");
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testReturningString() {
|
||||
mockCollaborator.oneString("adrian");
|
||||
mockControl.replay();
|
||||
testBeanProxy.setName("adrian");
|
||||
testBeanProxy.getName();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testReturningObject() {
|
||||
mockCollaborator.oneObjectArg(this.testBeanTarget);
|
||||
mockControl.replay();
|
||||
testBeanProxy.returnsThis();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testReturningBean() {
|
||||
mockCollaborator.oneTestBeanArg(this.testBeanTarget);
|
||||
mockControl.replay();
|
||||
testBeanProxy.returnsThis();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testReturningBeanArray() {
|
||||
this.testBeanTarget.setSpouse(new TestBean());
|
||||
ITestBean[] spouses = (ITestBean[]) this.testBeanTarget.getSpouses();
|
||||
mockCollaborator.testBeanArrayArg(spouses);
|
||||
mockControl.replay();
|
||||
testBeanProxy.getSpouses();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testNoInvokeWhenReturningParameterTypeDoesNotMatch() {
|
||||
// we need a strict mock for this...
|
||||
mockControl = MockControl.createControl(AfterReturningAdviceBindingCollaborator.class);
|
||||
mockCollaborator = (AfterReturningAdviceBindingCollaborator) mockControl.getMock();
|
||||
afterAdviceAspect.setCollaborator(mockCollaborator);
|
||||
|
||||
mockControl.replay();
|
||||
testBeanProxy.setSpouse(this.testBeanProxy);
|
||||
testBeanProxy.getSpouse();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testReturningByType() {
|
||||
mockCollaborator.objectMatchNoArgs();
|
||||
mockControl.replay();
|
||||
testBeanProxy.returnsThis();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testReturningPrimitive() {
|
||||
mockCollaborator.oneInt(20);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(20);
|
||||
testBeanProxy.haveBirthday();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
/**
|
||||
* Aspect used as part of before advice binding tests.
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AfterThrowingAdviceBindingTestAspect {
|
||||
|
||||
// collaborator interface that makes it easy to test this aspect is
|
||||
// working as expected through mocking.
|
||||
public interface AfterThrowingAdviceBindingCollaborator {
|
||||
void noArgs();
|
||||
void oneThrowable(Throwable t);
|
||||
void oneRuntimeException(RuntimeException re);
|
||||
void noArgsOnThrowableMatch();
|
||||
void noArgsOnRuntimeExceptionMatch();
|
||||
}
|
||||
|
||||
protected AfterThrowingAdviceBindingCollaborator collaborator = null;
|
||||
|
||||
public void setCollaborator(AfterThrowingAdviceBindingCollaborator aCollaborator) {
|
||||
this.collaborator = aCollaborator;
|
||||
}
|
||||
|
||||
public void noArgs() {
|
||||
this.collaborator.noArgs();
|
||||
}
|
||||
|
||||
public void oneThrowable(Throwable t) {
|
||||
this.collaborator.oneThrowable(t);
|
||||
}
|
||||
|
||||
public void oneRuntimeException(RuntimeException ex) {
|
||||
this.collaborator.oneRuntimeException(ex);
|
||||
}
|
||||
|
||||
public void noArgsOnThrowableMatch() {
|
||||
this.collaborator.noArgsOnThrowableMatch();
|
||||
}
|
||||
|
||||
public void noArgsOnRuntimeExceptionMatch() {
|
||||
this.collaborator.noArgsOnRuntimeExceptionMatch();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.easymock.MockControl;
|
||||
|
||||
import org.springframework.aop.aspectj.AfterThrowingAdviceBindingTestAspect.AfterThrowingAdviceBindingCollaborator;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* Tests for various parameter binding scenarios with before advice.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AfterThrowingAdviceBindingTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private AfterThrowingAdviceBindingTestAspect afterThrowingAdviceAspect;
|
||||
|
||||
private ITestBean testBean;
|
||||
|
||||
private MockControl mockControl;
|
||||
|
||||
private AfterThrowingAdviceBindingCollaborator mockCollaborator;
|
||||
|
||||
|
||||
public void setAfterAdviceAspect(AfterThrowingAdviceBindingTestAspect anAspect) {
|
||||
this.afterThrowingAdviceAspect = anAspect;
|
||||
}
|
||||
|
||||
public void setTestBean(ITestBean aBean) throws Exception {
|
||||
this.testBean = aBean;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "afterThrowing-advice-tests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
mockControl = MockControl.createNiceControl(AfterThrowingAdviceBindingCollaborator.class);
|
||||
mockCollaborator = (AfterThrowingAdviceBindingCollaborator) mockControl.getMock();
|
||||
afterThrowingAdviceAspect.setCollaborator(mockCollaborator);
|
||||
}
|
||||
|
||||
|
||||
// Simple test to ensure all is well with the XML file.
|
||||
// Note that this implicitly tests that the arg-names binding is working.
|
||||
public void testParse() {
|
||||
}
|
||||
|
||||
public void testSimpleAfterThrowing() {
|
||||
mockCollaborator.noArgs();
|
||||
mockControl.replay();
|
||||
try {
|
||||
this.testBean.exceptional(new Throwable());
|
||||
fail("should throw exception");
|
||||
} catch (Throwable t) {
|
||||
// no-op
|
||||
}
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testAfterThrowingWithBinding() {
|
||||
Throwable t = new Throwable();
|
||||
mockCollaborator.oneThrowable(t);
|
||||
mockControl.replay();
|
||||
try {
|
||||
this.testBean.exceptional(t);
|
||||
fail("should throw exception");
|
||||
} catch (Throwable x) {
|
||||
// no-op
|
||||
}
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testAfterThrowingWithNamedTypeRestriction() {
|
||||
Throwable t = new Throwable();
|
||||
// need a strict mock for this test...
|
||||
mockControl = MockControl.createControl(AfterThrowingAdviceBindingCollaborator.class);
|
||||
mockCollaborator = (AfterThrowingAdviceBindingCollaborator) mockControl.getMock();
|
||||
afterThrowingAdviceAspect.setCollaborator(mockCollaborator);
|
||||
|
||||
mockCollaborator.noArgs();
|
||||
mockCollaborator.oneThrowable(t);
|
||||
mockCollaborator.noArgsOnThrowableMatch();
|
||||
mockControl.replay();
|
||||
try {
|
||||
this.testBean.exceptional(t);
|
||||
fail("should throw exception");
|
||||
} catch (Throwable x) {
|
||||
// no-op
|
||||
}
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testAfterThrowingWithRuntimeExceptionBinding() {
|
||||
RuntimeException ex = new RuntimeException();
|
||||
mockCollaborator.oneRuntimeException(ex);
|
||||
mockControl.replay();
|
||||
try {
|
||||
this.testBean.exceptional(ex);
|
||||
fail("should throw exception");
|
||||
} catch (Throwable x) {
|
||||
// no-op
|
||||
}
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testAfterThrowingWithTypeSpecified() {
|
||||
mockCollaborator.noArgsOnThrowableMatch();
|
||||
mockControl.replay();
|
||||
try {
|
||||
this.testBean.exceptional(new Throwable());
|
||||
fail("should throw exception");
|
||||
} catch (Throwable t) {
|
||||
// no-op
|
||||
}
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testAfterThrowingWithRuntimeTypeSpecified() {
|
||||
mockCollaborator.noArgsOnRuntimeExceptionMatch();
|
||||
mockControl.replay();
|
||||
try {
|
||||
this.testBean.exceptional(new RuntimeException());
|
||||
fail("should throw exception");
|
||||
} catch (Throwable t) {
|
||||
// no-op
|
||||
}
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
|
||||
/**
|
||||
* Aspect used as part of before advice binding tests.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AroundAdviceBindingTestAspect {
|
||||
|
||||
private AroundAdviceBindingCollaborator collaborator = null;
|
||||
|
||||
public void setCollaborator(AroundAdviceBindingCollaborator aCollaborator) {
|
||||
this.collaborator = aCollaborator;
|
||||
}
|
||||
|
||||
// "advice" methods
|
||||
public void oneIntArg(ProceedingJoinPoint pjp, int age) throws Throwable {
|
||||
this.collaborator.oneIntArg(age);
|
||||
pjp.proceed();
|
||||
}
|
||||
|
||||
public int oneObjectArg(ProceedingJoinPoint pjp, Object bean) throws Throwable {
|
||||
this.collaborator.oneObjectArg(bean);
|
||||
return ((Integer) pjp.proceed()).intValue();
|
||||
}
|
||||
|
||||
public void oneIntAndOneObject(ProceedingJoinPoint pjp, int x , Object o) throws Throwable {
|
||||
this.collaborator.oneIntAndOneObject(x,o);
|
||||
pjp.proceed();
|
||||
}
|
||||
|
||||
public int justJoinPoint(ProceedingJoinPoint pjp) throws Throwable {
|
||||
this.collaborator.justJoinPoint(pjp.getSignature().getName());
|
||||
return ((Integer) pjp.proceed()).intValue();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Collaborator interface that makes it easy to test this aspect
|
||||
* is working as expected through mocking.
|
||||
*/
|
||||
public interface AroundAdviceBindingCollaborator {
|
||||
|
||||
void oneIntArg(int x);
|
||||
|
||||
void oneObjectArg(Object o);
|
||||
|
||||
void oneIntAndOneObject(int x, Object o);
|
||||
|
||||
void justJoinPoint(String s);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.easymock.MockControl;
|
||||
|
||||
import org.springframework.aop.aspectj.AroundAdviceBindingTestAspect.AroundAdviceBindingCollaborator;
|
||||
|
||||
/**
|
||||
* Tests for various parameter binding scenarios with before advice.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AroundAdviceBindingTests extends AbstractAdviceBindingTests {
|
||||
|
||||
private MockControl mockControl;
|
||||
|
||||
private AroundAdviceBindingCollaborator mockCollaborator;
|
||||
|
||||
private AroundAdviceBindingTestAspect aroundAdviceAspect;
|
||||
|
||||
|
||||
public void setAroundAdviceAspect(AroundAdviceBindingTestAspect anAspect) {
|
||||
this.aroundAdviceAspect = anAspect;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "around-advice-tests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
super.onSetUp();
|
||||
mockControl = MockControl.createNiceControl(AroundAdviceBindingCollaborator.class);
|
||||
mockCollaborator = (AroundAdviceBindingCollaborator) mockControl.getMock();
|
||||
aroundAdviceAspect.setCollaborator(mockCollaborator);
|
||||
}
|
||||
|
||||
|
||||
public void testOneIntArg() {
|
||||
mockCollaborator.oneIntArg(5);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneObjectArgBoundToTarget() {
|
||||
mockCollaborator.oneObjectArg(this.testBeanTarget);
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneIntAndOneObjectArgs() {
|
||||
mockCollaborator.oneIntAndOneObject(5, this.testBeanProxy);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testJustJoinPoint() {
|
||||
mockCollaborator.justJoinPoint("getAge");
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2002-2008 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class AroundAdviceCircularTests extends AroundAdviceBindingTests {
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "around-advice-circular-tests.xml";
|
||||
}
|
||||
|
||||
public void testBothBeansAreProxies() {
|
||||
Object tb = getApplicationContext().getBean("testBean");
|
||||
assertTrue(AopUtils.isAopProxy(tb));
|
||||
Object tb2 = getApplicationContext().getBean("testBean2");
|
||||
assertTrue(AopUtils.isAopProxy(tb2));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AspectAndAdvicePrecedenceTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private PrecedenceTestAspect highPrecedenceAspect;
|
||||
private PrecedenceTestAspect lowPrecedenceAspect;
|
||||
private SimpleSpringBeforeAdvice lowPrecedenceSpringAdvice;
|
||||
private SimpleSpringBeforeAdvice highPrecedenceSpringAdvice;
|
||||
private ITestBean testBean;
|
||||
|
||||
|
||||
public AspectAndAdvicePrecedenceTests() {
|
||||
setAutowireMode(AUTOWIRE_BY_NAME);
|
||||
}
|
||||
|
||||
public void setHighPrecedenceAspect(PrecedenceTestAspect highPrecedenceAspect) {
|
||||
this.highPrecedenceAspect = highPrecedenceAspect;
|
||||
}
|
||||
|
||||
public void setLowPrecedenceAspect(PrecedenceTestAspect lowPrecedenceAspect) {
|
||||
this.lowPrecedenceAspect = lowPrecedenceAspect;
|
||||
}
|
||||
|
||||
public void setLowPrecedenceSpringAdvice(SimpleSpringBeforeAdvice lowPrecedenceSpringAdvice) {
|
||||
this.lowPrecedenceSpringAdvice = lowPrecedenceSpringAdvice;
|
||||
}
|
||||
|
||||
public void setHighPrecedenceSpringAdvice(SimpleSpringBeforeAdvice highPrecedenceSpringAdvice) {
|
||||
this.highPrecedenceSpringAdvice = highPrecedenceSpringAdvice;
|
||||
}
|
||||
|
||||
public void setTestBean(ITestBean testBean) {
|
||||
this.testBean = testBean;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "advice-precedence-tests.xml";
|
||||
}
|
||||
|
||||
|
||||
// ========== end of test case set up, start of tests proper ===================
|
||||
|
||||
public void testAdviceOrder() {
|
||||
PrecedenceTestAspect.Collaborator collaborator = new PrecedenceVerifyingCollaborator();
|
||||
this.highPrecedenceAspect.setCollaborator(collaborator);
|
||||
this.lowPrecedenceAspect.setCollaborator(collaborator);
|
||||
this.highPrecedenceSpringAdvice.setCollaborator(collaborator);
|
||||
this.lowPrecedenceSpringAdvice.setCollaborator(collaborator);
|
||||
this.testBean.getAge();
|
||||
}
|
||||
|
||||
|
||||
private static class PrecedenceVerifyingCollaborator implements PrecedenceTestAspect.Collaborator {
|
||||
|
||||
private static final String[] EXPECTED = {
|
||||
// this order confirmed by running the same aspects (minus the Spring AOP advisors)
|
||||
// through AspectJ...
|
||||
"beforeAdviceOne(highPrecedenceAspect)", // 1
|
||||
"beforeAdviceTwo(highPrecedenceAspect)", // 2
|
||||
"aroundAdviceOne(highPrecedenceAspect)", // 3, before proceed
|
||||
"aroundAdviceTwo(highPrecedenceAspect)", // 4, before proceed
|
||||
"beforeAdviceOne(highPrecedenceSpringAdvice)", // 5
|
||||
"beforeAdviceOne(lowPrecedenceSpringAdvice)", // 6
|
||||
"beforeAdviceOne(lowPrecedenceAspect)", // 7
|
||||
"beforeAdviceTwo(lowPrecedenceAspect)", // 8
|
||||
"aroundAdviceOne(lowPrecedenceAspect)", // 9, before proceed
|
||||
"aroundAdviceTwo(lowPrecedenceAspect)", // 10, before proceed
|
||||
"aroundAdviceTwo(lowPrecedenceAspect)", // 11, after proceed
|
||||
"aroundAdviceOne(lowPrecedenceAspect)", // 12, after proceed
|
||||
"afterAdviceOne(lowPrecedenceAspect)", // 13
|
||||
"afterAdviceTwo(lowPrecedenceAspect)", // 14
|
||||
"aroundAdviceTwo(highPrecedenceAspect)", // 15, after proceed
|
||||
"aroundAdviceOne(highPrecedenceAspect)", // 16, after proceed
|
||||
"afterAdviceOne(highPrecedenceAspect)", // 17
|
||||
"afterAdviceTwo(highPrecedenceAspect)" // 18
|
||||
};
|
||||
|
||||
private int adviceInvocationNumber = 0;
|
||||
|
||||
private void checkAdvice(String whatJustHappened) {
|
||||
//System.out.println("[" + adviceInvocationNumber + "] " + whatJustHappened + " ==> " + EXPECTED[adviceInvocationNumber]);
|
||||
if (adviceInvocationNumber > (EXPECTED.length - 1)) {
|
||||
fail("Too many advice invocations, expecting " + EXPECTED.length
|
||||
+ " but had " + adviceInvocationNumber);
|
||||
}
|
||||
String expecting = EXPECTED[adviceInvocationNumber++];
|
||||
if (!whatJustHappened.equals(expecting)) {
|
||||
fail("Expecting '" + expecting + "' on advice invocation " + adviceInvocationNumber +
|
||||
" but got '" + whatJustHappened + "'");
|
||||
}
|
||||
}
|
||||
|
||||
public void beforeAdviceOne(String beanName) {
|
||||
checkAdvice("beforeAdviceOne(" + beanName + ")");
|
||||
}
|
||||
|
||||
public void beforeAdviceTwo(String beanName) {
|
||||
checkAdvice("beforeAdviceTwo(" + beanName + ")");
|
||||
}
|
||||
|
||||
public void aroundAdviceOne(String beanName) {
|
||||
checkAdvice("aroundAdviceOne(" + beanName + ")");
|
||||
}
|
||||
|
||||
public void aroundAdviceTwo(String beanName) {
|
||||
checkAdvice("aroundAdviceTwo(" + beanName + ")");
|
||||
}
|
||||
|
||||
public void afterAdviceOne(String beanName) {
|
||||
checkAdvice("afterAdviceOne(" + beanName + ")");
|
||||
}
|
||||
|
||||
public void afterAdviceTwo(String beanName) {
|
||||
checkAdvice("afterAdviceTwo(" + beanName + ")");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,298 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.springframework.aop.aspectj.AspectJAdviceParameterNameDiscoverer.AmbiguousBindingException;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/**
|
||||
* Unit tests for the {@link AspectJAdviceParameterNameDiscoverer} class.
|
||||
* <p/>
|
||||
* <p>See also <code>TigerAspectJAdviceParameterNameDiscovererTests</code> in
|
||||
* the 'tiger' tree for tests relating to annotations.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AspectJAdviceParameterNameDiscovererTests extends TestCase {
|
||||
|
||||
// methods to discover parameter names for
|
||||
public void noArgs() {
|
||||
}
|
||||
|
||||
public void tjp(JoinPoint jp) {
|
||||
}
|
||||
|
||||
public void tjpsp(JoinPoint.StaticPart tjpsp) {
|
||||
}
|
||||
|
||||
public void twoJoinPoints(JoinPoint jp1, JoinPoint jp2) {
|
||||
}
|
||||
|
||||
public void oneThrowable(Exception ex) {
|
||||
}
|
||||
|
||||
public void jpAndOneThrowable(JoinPoint jp, Exception ex) {
|
||||
}
|
||||
|
||||
public void jpAndTwoThrowables(JoinPoint jp, Exception ex, Error err) {
|
||||
}
|
||||
|
||||
public void oneObject(Object x) {
|
||||
}
|
||||
|
||||
public void twoObjects(Object x, Object y) {
|
||||
}
|
||||
|
||||
public void onePrimitive(int x) {
|
||||
}
|
||||
|
||||
public void oneObjectOnePrimitive(Object x, int y) {
|
||||
}
|
||||
|
||||
public void oneThrowableOnePrimitive(Throwable x, int y) {
|
||||
}
|
||||
|
||||
public void theBigOne(JoinPoint jp, Throwable x, int y, Object foo) {
|
||||
}
|
||||
|
||||
|
||||
public void testNoArgs() {
|
||||
assertParameterNames(getMethod("noArgs"), "execution(* *(..))", new String[0]);
|
||||
}
|
||||
|
||||
public void testJoinPointOnly() {
|
||||
assertParameterNames(getMethod("tjp"), "execution(* *(..))", new String[]{"thisJoinPoint"});
|
||||
}
|
||||
|
||||
public void testJoinPointStaticPartOnly() {
|
||||
assertParameterNames(getMethod("tjpsp"), "execution(* *(..))", new String[]{"thisJoinPointStaticPart"});
|
||||
}
|
||||
|
||||
public void testTwoJoinPoints() {
|
||||
assertException(getMethod("twoJoinPoints"), "foo()", IllegalStateException.class, "Failed to bind all argument names: 1 argument(s) could not be bound");
|
||||
}
|
||||
|
||||
public void testOneThrowable() {
|
||||
assertParameterNames(getMethod("oneThrowable"), "foo()", null, "ex", new String[]{"ex"});
|
||||
}
|
||||
|
||||
public void testOneJPAndOneThrowable() {
|
||||
assertParameterNames(getMethod("jpAndOneThrowable"), "foo()", null, "ex", new String[]{"thisJoinPoint", "ex"});
|
||||
}
|
||||
|
||||
public void testOneJPAndTwoThrowables() {
|
||||
assertException(getMethod("jpAndTwoThrowables"), "foo()", null, "ex", AmbiguousBindingException.class,
|
||||
"Binding of throwing parameter 'ex' is ambiguous: could be bound to argument 1 or argument 2");
|
||||
}
|
||||
|
||||
public void testThrowableNoCandidates() {
|
||||
assertException(getMethod("noArgs"), "foo()", null, "ex", IllegalStateException.class,
|
||||
"Not enough arguments in method to satisfy binding of returning and throwing variables");
|
||||
}
|
||||
|
||||
public void testReturning() {
|
||||
assertParameterNames(getMethod("oneObject"), "foo()", "obj", null, new String[]{"obj"});
|
||||
}
|
||||
|
||||
public void testAmbiguousReturning() {
|
||||
assertException(getMethod("twoObjects"), "foo()", "obj", null, AmbiguousBindingException.class,
|
||||
"Binding of returning parameter 'obj' is ambiguous, there are 2 candidates.");
|
||||
}
|
||||
|
||||
public void testReturningNoCandidates() {
|
||||
assertException(getMethod("noArgs"), "foo()", "obj", null, IllegalStateException.class,
|
||||
"Not enough arguments in method to satisfy binding of returning and throwing variables");
|
||||
}
|
||||
|
||||
public void testThisBindingOneCandidate() {
|
||||
assertParameterNames(getMethod("oneObject"), "this(x)", new String[]{"x"});
|
||||
}
|
||||
|
||||
public void testThisBindingWithAlternateTokenizations() {
|
||||
assertParameterNames(getMethod("oneObject"), "this( x )", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "this( x)", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "this (x )", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "this(x )", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "foo() && this(x)", new String[]{"x"});
|
||||
}
|
||||
|
||||
public void testThisBindingTwoCandidates() {
|
||||
assertException(getMethod("oneObject"), "this(x) || this(y)", AmbiguousBindingException.class,
|
||||
"Found 2 candidate this(), target() or args() variables but only one unbound argument slot");
|
||||
}
|
||||
|
||||
public void testThisBindingWithBadPointcutExpressions() {
|
||||
assertException(getMethod("oneObject"), "this(", IllegalStateException.class,
|
||||
"Failed to bind all argument names: 1 argument(s) could not be bound");
|
||||
assertException(getMethod("oneObject"), "this(x && foo()", IllegalStateException.class,
|
||||
"Failed to bind all argument names: 1 argument(s) could not be bound");
|
||||
}
|
||||
|
||||
public void testTargetBindingOneCandidate() {
|
||||
assertParameterNames(getMethod("oneObject"), "target(x)", new String[]{"x"});
|
||||
}
|
||||
|
||||
public void testTargetBindingWithAlternateTokenizations() {
|
||||
assertParameterNames(getMethod("oneObject"), "target( x )", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "target( x)", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "target (x )", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "target(x )", new String[]{"x"});
|
||||
assertParameterNames(getMethod("oneObject"), "foo() && target(x)", new String[]{"x"});
|
||||
}
|
||||
|
||||
public void testTargetBindingTwoCandidates() {
|
||||
assertException(getMethod("oneObject"), "target(x) || target(y)", AmbiguousBindingException.class,
|
||||
"Found 2 candidate this(), target() or args() variables but only one unbound argument slot");
|
||||
}
|
||||
|
||||
public void testTargetBindingWithBadPointcutExpressions() {
|
||||
assertException(getMethod("oneObject"), "target(", IllegalStateException.class,
|
||||
"Failed to bind all argument names: 1 argument(s) could not be bound");
|
||||
assertException(getMethod("oneObject"), "target(x && foo()", IllegalStateException.class,
|
||||
"Failed to bind all argument names: 1 argument(s) could not be bound");
|
||||
}
|
||||
|
||||
public void testArgsBindingOneObject() {
|
||||
assertParameterNames(getMethod("oneObject"), "args(x)", new String[]{"x"});
|
||||
}
|
||||
|
||||
public void testArgsBindingOneObjectTwoCandidates() {
|
||||
assertException(getMethod("oneObject"), "args(x,y)", AmbiguousBindingException.class,
|
||||
"Found 2 candidate this(), target() or args() variables but only one unbound argument slot");
|
||||
}
|
||||
|
||||
public void testAmbiguousArgsBinding() {
|
||||
assertException(getMethod("twoObjects"), "args(x,y)", AmbiguousBindingException.class,
|
||||
"Still 2 unbound args at this(),target(),args() binding stage, with no way to determine between them");
|
||||
}
|
||||
|
||||
public void testArgsOnePrimitive() {
|
||||
assertParameterNames(getMethod("onePrimitive"), "args(count)", new String[]{"count"});
|
||||
}
|
||||
|
||||
public void testArgsOnePrimitiveOneObject() {
|
||||
assertException(getMethod("oneObjectOnePrimitive"), "args(count,obj)", AmbiguousBindingException.class,
|
||||
"Found 2 candidate variable names but only one candidate binding slot when matching primitive args");
|
||||
}
|
||||
|
||||
public void testThisAndPrimitive() {
|
||||
assertParameterNames(getMethod("oneObjectOnePrimitive"), "args(count) && this(obj)", new String[]{"obj", "count"});
|
||||
}
|
||||
|
||||
public void testTargetAndPrimitive() {
|
||||
assertParameterNames(getMethod("oneObjectOnePrimitive"), "args(count) && target(obj)", new String[]{"obj", "count"});
|
||||
}
|
||||
|
||||
public void testThrowingAndPrimitive() {
|
||||
assertParameterNames(getMethod("oneThrowableOnePrimitive"), "args(count)", null, "ex", new String[]{"ex", "count"});
|
||||
}
|
||||
|
||||
public void testAllTogetherNow() {
|
||||
assertParameterNames(getMethod("theBigOne"), "this(foo) && args(x)", null, "ex", new String[]{"thisJoinPoint", "ex", "x", "foo"});
|
||||
}
|
||||
|
||||
public void testReferenceBinding() {
|
||||
assertParameterNames(getMethod("onePrimitive"),"somepc(foo)",new String[] {"foo"});
|
||||
}
|
||||
|
||||
public void testReferenceBindingWithAlternateTokenizations() {
|
||||
assertParameterNames(getMethod("onePrimitive"),"call(bar *) && somepc(foo)",new String[] {"foo"});
|
||||
assertParameterNames(getMethod("onePrimitive"),"somepc ( foo )",new String[] {"foo"});
|
||||
assertParameterNames(getMethod("onePrimitive"),"somepc( foo)",new String[] {"foo"});
|
||||
}
|
||||
|
||||
|
||||
protected Method getMethod(String name) {
|
||||
// assumes no overloading of test methods...
|
||||
Method[] candidates = this.getClass().getMethods();
|
||||
for (int i = 0; i < candidates.length; i++) {
|
||||
if (candidates[i].getName().equals(name)) {
|
||||
return candidates[i];
|
||||
}
|
||||
}
|
||||
fail("Bad test specification, no method '" + name + "' found in test class");
|
||||
return null;
|
||||
}
|
||||
|
||||
protected void assertParameterNames(Method m, String pointcut, String[] parameterNames) {
|
||||
assertParameterNames(m, pointcut, null, null, parameterNames);
|
||||
}
|
||||
|
||||
protected void assertParameterNames(Method m, String pointcut, String returning, String throwing, String[] parameterNames) {
|
||||
assertEquals("bad test specification, must have same number of parameter names as method arguments",
|
||||
m.getParameterTypes().length, parameterNames.length);
|
||||
|
||||
AspectJAdviceParameterNameDiscoverer discoverer = new AspectJAdviceParameterNameDiscoverer(pointcut);
|
||||
discoverer.setRaiseExceptions(true);
|
||||
discoverer.setReturningName(returning);
|
||||
discoverer.setThrowingName(throwing);
|
||||
String[] discoveredNames = discoverer.getParameterNames(m);
|
||||
|
||||
String formattedExpectedNames = format(parameterNames);
|
||||
String formattedActualNames = format(discoveredNames);
|
||||
|
||||
assertEquals("Expecting " + parameterNames.length + " parameter names in return set '" +
|
||||
formattedExpectedNames + "', but found " + discoveredNames.length +
|
||||
" '" + formattedActualNames + "'",
|
||||
parameterNames.length, discoveredNames.length);
|
||||
|
||||
for (int i = 0; i < discoveredNames.length; i++) {
|
||||
assertNotNull("Parameter names must never be null", discoveredNames[i]);
|
||||
assertEquals("Expecting parameter " + i + " to be named '" +
|
||||
parameterNames[i] + "' but was '" + discoveredNames[i] + "'",
|
||||
parameterNames[i], discoveredNames[i]);
|
||||
}
|
||||
}
|
||||
|
||||
protected void assertException(Method m, String pointcut, Class exceptionType, String message) {
|
||||
assertException(m, pointcut, null, null, exceptionType, message);
|
||||
}
|
||||
|
||||
protected void assertException(Method m, String pointcut, String returning, String throwing, Class exceptionType, String message) {
|
||||
AspectJAdviceParameterNameDiscoverer discoverer = new AspectJAdviceParameterNameDiscoverer(pointcut);
|
||||
discoverer.setRaiseExceptions(true);
|
||||
discoverer.setReturningName(returning);
|
||||
discoverer.setThrowingName(throwing);
|
||||
|
||||
try {
|
||||
discoverer.getParameterNames(m);
|
||||
fail("Expecting " + exceptionType.getName() + " with message '" + message + "'");
|
||||
} catch (RuntimeException expected) {
|
||||
assertEquals("Expecting exception of type " + exceptionType.getName(),
|
||||
exceptionType, expected.getClass());
|
||||
assertEquals("Exception message does not match expected", message, expected.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static String format(String[] names) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append("(");
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
sb.append(names[i]);
|
||||
if ((i + 1) < names.length) {
|
||||
sb.append(",");
|
||||
}
|
||||
}
|
||||
sb.append(")");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* @author Rob Harrop
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class AspectJExpressionPointcutAdvisorTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private ITestBean testBean;
|
||||
|
||||
private CallCountingInterceptor interceptor;
|
||||
|
||||
|
||||
public void setTestBean(ITestBean testBean) {
|
||||
this.testBean = testBean;
|
||||
}
|
||||
|
||||
public void setInterceptor(CallCountingInterceptor interceptor) {
|
||||
this.interceptor = interceptor;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "aspectj.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
interceptor.reset();
|
||||
}
|
||||
|
||||
|
||||
public void testPointcutting() throws Exception {
|
||||
assertEquals("Count should be 0", 0, interceptor.getCount());
|
||||
testBean.getSpouses();
|
||||
assertEquals("Count should be 1", 1, interceptor.getCount());
|
||||
testBean.getSpouse();
|
||||
assertEquals("Count should be 1", 1, interceptor.getCount());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,332 @@
|
||||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.aspectj.weaver.tools.PointcutExpression;
|
||||
import org.aspectj.weaver.tools.PointcutPrimitive;
|
||||
import org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException;
|
||||
import org.springframework.aop.ClassFilter;
|
||||
import org.springframework.aop.MethodMatcher;
|
||||
import org.springframework.aop.Pointcut;
|
||||
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.aop.support.DefaultPointcutAdvisor;
|
||||
import org.springframework.beans.IOther;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
|
||||
/**
|
||||
* @author Rob Harrop
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
public class AspectJExpressionPointcutTests extends TestCase {
|
||||
|
||||
public static final String MATCH_ALL_METHODS = "execution(* *(..))";
|
||||
|
||||
private Method getAge;
|
||||
|
||||
private Method setAge;
|
||||
|
||||
private Method setSomeNumber;
|
||||
|
||||
private Method isPostProcessed;
|
||||
|
||||
public void testMatchExplicit() {
|
||||
String expression = "execution(int org.springframework.beans.TestBean.getAge())";
|
||||
|
||||
Pointcut pointcut = getPointcut(expression);
|
||||
ClassFilter classFilter = pointcut.getClassFilter();
|
||||
MethodMatcher methodMatcher = pointcut.getMethodMatcher();
|
||||
|
||||
assertMatchesTestBeanClass(classFilter);
|
||||
|
||||
// not currently testable in a reliable fashion
|
||||
//assertDoesNotMatchStringClass(classFilter);
|
||||
|
||||
assertFalse("Should not be a runtime match", methodMatcher.isRuntime());
|
||||
assertMatchesGetAge(methodMatcher);
|
||||
assertFalse("Expression should match setAge() method", methodMatcher.matches(setAge, TestBean.class));
|
||||
}
|
||||
|
||||
|
||||
public void setUp() throws NoSuchMethodException {
|
||||
getAge = TestBean.class.getMethod("getAge", null);
|
||||
setAge = TestBean.class.getMethod("setAge", new Class[]{int.class});
|
||||
setSomeNumber = TestBean.class.getMethod("setSomeNumber", new Class[]{Number.class});
|
||||
isPostProcessed = TestBean.class.getMethod("isPostProcessed", (Class[]) null);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void testMatchWithTypePattern() throws Exception {
|
||||
String expression = "execution(* *..TestBean.*Age(..))";
|
||||
|
||||
Pointcut pointcut = getPointcut(expression);
|
||||
ClassFilter classFilter = pointcut.getClassFilter();
|
||||
MethodMatcher methodMatcher = pointcut.getMethodMatcher();
|
||||
|
||||
assertMatchesTestBeanClass(classFilter);
|
||||
|
||||
// not currently testable in a reliable fashion
|
||||
//assertDoesNotMatchStringClass(classFilter);
|
||||
|
||||
assertFalse("Should not be a runtime match", methodMatcher.isRuntime());
|
||||
assertMatchesGetAge(methodMatcher);
|
||||
assertTrue("Expression should match setAge(int) method", methodMatcher.matches(setAge, TestBean.class));
|
||||
}
|
||||
|
||||
|
||||
public void testThis() throws SecurityException, NoSuchMethodException{
|
||||
testThisOrTarget("this");
|
||||
}
|
||||
|
||||
public void testTarget() throws SecurityException, NoSuchMethodException {
|
||||
testThisOrTarget("target");
|
||||
}
|
||||
|
||||
public static class OtherIOther implements IOther {
|
||||
|
||||
public void absquatulate() {
|
||||
// Empty
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This and target are equivalent. Really instanceof pointcuts.
|
||||
* @throws Exception
|
||||
* @param which this or target
|
||||
* @throws NoSuchMethodException
|
||||
* @throws SecurityException
|
||||
*/
|
||||
private void testThisOrTarget(String which) throws SecurityException, NoSuchMethodException {
|
||||
String matchesTestBean = which + "(org.springframework.beans.TestBean)";
|
||||
String matchesIOther = which + "(org.springframework.beans.IOther)";
|
||||
AspectJExpressionPointcut testBeanPc = new AspectJExpressionPointcut();
|
||||
testBeanPc.setExpression(matchesTestBean);
|
||||
|
||||
AspectJExpressionPointcut iOtherPc = new AspectJExpressionPointcut();
|
||||
iOtherPc.setExpression(matchesIOther);
|
||||
|
||||
assertTrue(testBeanPc.matches(TestBean.class));
|
||||
assertTrue(testBeanPc.matches(getAge, TestBean.class));
|
||||
assertTrue(iOtherPc.matches(OtherIOther.class.getMethod("absquatulate", null),
|
||||
OtherIOther.class));
|
||||
|
||||
assertFalse(testBeanPc.matches(OtherIOther.class.getMethod("absquatulate", null),
|
||||
OtherIOther.class));
|
||||
}
|
||||
|
||||
public void testWithinRootPackage() throws SecurityException, NoSuchMethodException {
|
||||
testWithinPackage(false);
|
||||
}
|
||||
|
||||
public void testWithinRootAndSubpackages() throws SecurityException, NoSuchMethodException {
|
||||
testWithinPackage(true);
|
||||
}
|
||||
|
||||
private void testWithinPackage(boolean matchSubpackages) throws SecurityException, NoSuchMethodException {
|
||||
String withinBeansPackage = "within(org.springframework.beans.";
|
||||
// Subpackages are matched by **
|
||||
if (matchSubpackages) {
|
||||
withinBeansPackage += ".";
|
||||
}
|
||||
withinBeansPackage = withinBeansPackage + "*)";
|
||||
AspectJExpressionPointcut withinBeansPc = new AspectJExpressionPointcut();
|
||||
withinBeansPc.setExpression(withinBeansPackage);
|
||||
|
||||
assertTrue(withinBeansPc.matches(TestBean.class));
|
||||
assertTrue(withinBeansPc.matches(getAge, TestBean.class));
|
||||
assertEquals(matchSubpackages, withinBeansPc.matches(BeanFactory.class));
|
||||
assertEquals(matchSubpackages, withinBeansPc.matches(
|
||||
DefaultListableBeanFactory.class.getMethod("getBeanDefinitionCount", null),
|
||||
DefaultListableBeanFactory.class));
|
||||
assertFalse(withinBeansPc.matches(String.class));
|
||||
assertFalse(withinBeansPc.matches(OtherIOther.class.getMethod("absquatulate", null),
|
||||
OtherIOther.class));
|
||||
}
|
||||
|
||||
public void testFriendlyErrorOnNoLocationClassMatching() {
|
||||
AspectJExpressionPointcut pc = new AspectJExpressionPointcut();
|
||||
try {
|
||||
pc.matches(ITestBean.class);
|
||||
fail();
|
||||
}
|
||||
catch (IllegalStateException ex) {
|
||||
assertTrue(ex.getMessage().indexOf("expression") != -1);
|
||||
}
|
||||
}
|
||||
|
||||
public void testFriendlyErrorOnNoLocation2ArgMatching() {
|
||||
AspectJExpressionPointcut pc = new AspectJExpressionPointcut();
|
||||
try {
|
||||
pc.matches(getAge, ITestBean.class);
|
||||
fail();
|
||||
}
|
||||
catch (IllegalStateException ex) {
|
||||
assertTrue(ex.getMessage().indexOf("expression") != -1);
|
||||
}
|
||||
}
|
||||
|
||||
public void testFriendlyErrorOnNoLocation3ArgMatching() {
|
||||
AspectJExpressionPointcut pc = new AspectJExpressionPointcut();
|
||||
try {
|
||||
pc.matches(getAge, ITestBean.class, (Object[]) null);
|
||||
fail();
|
||||
}
|
||||
catch (IllegalStateException ex) {
|
||||
assertTrue(ex.getMessage().indexOf("expression") != -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void testMatchWithArgs() throws Exception {
|
||||
String expression = "execution(void org.springframework.beans.TestBean.setSomeNumber(Number)) && args(Double)";
|
||||
|
||||
Pointcut pointcut = getPointcut(expression);
|
||||
ClassFilter classFilter = pointcut.getClassFilter();
|
||||
MethodMatcher methodMatcher = pointcut.getMethodMatcher();
|
||||
|
||||
assertMatchesTestBeanClass(classFilter);
|
||||
|
||||
// not currently testable in a reliable fashion
|
||||
//assertDoesNotMatchStringClass(classFilter);
|
||||
|
||||
assertTrue("Should match with setSomeNumber with Double input",
|
||||
methodMatcher.matches(setSomeNumber, TestBean.class, new Object[]{new Double(12)}));
|
||||
assertFalse("Should not match setSomeNumber with Integer input",
|
||||
methodMatcher.matches(setSomeNumber, TestBean.class, new Object[]{new Integer(11)}));
|
||||
assertFalse("Should not match getAge", methodMatcher.matches(getAge, TestBean.class, null));
|
||||
assertTrue("Should be a runtime match", methodMatcher.isRuntime());
|
||||
}
|
||||
|
||||
public void testSimpleAdvice() {
|
||||
String expression = "execution(int org.springframework.beans.TestBean.getAge())";
|
||||
|
||||
CallCountingInterceptor interceptor = new CallCountingInterceptor();
|
||||
|
||||
TestBean testBean = getAdvisedProxy(expression, interceptor);
|
||||
|
||||
assertEquals("Calls should be 0", 0, interceptor.getCount());
|
||||
|
||||
testBean.getAge();
|
||||
|
||||
assertEquals("Calls should be 1", 1, interceptor.getCount());
|
||||
|
||||
testBean.setAge(90);
|
||||
|
||||
assertEquals("Calls should still be 1", 1, interceptor.getCount());
|
||||
}
|
||||
|
||||
public void testDynamicMatchingProxy() {
|
||||
String expression = "execution(void org.springframework.beans.TestBean.setSomeNumber(Number)) && args(Double)";
|
||||
|
||||
CallCountingInterceptor interceptor = new CallCountingInterceptor();
|
||||
|
||||
TestBean testBean = getAdvisedProxy(expression, interceptor);
|
||||
|
||||
assertEquals("Calls should be 0", 0, interceptor.getCount());
|
||||
|
||||
testBean.setSomeNumber(new Double(30));
|
||||
|
||||
assertEquals("Calls should be 1", 1, interceptor.getCount());
|
||||
|
||||
testBean.setSomeNumber(new Integer(90));
|
||||
|
||||
assertEquals("Calls should be 1", 1, interceptor.getCount());
|
||||
}
|
||||
|
||||
public void testInvalidExpression() {
|
||||
String expression = "execution(void org.springframework.beans.TestBean.setSomeNumber(Number) && args(Double)";
|
||||
|
||||
try {
|
||||
getPointcut(expression).getClassFilter(); // call to getClassFilter forces resolution
|
||||
fail("Invalid expression should throw IllegalArgumentException");
|
||||
}
|
||||
catch (IllegalArgumentException ex) {
|
||||
assertTrue(true);
|
||||
System.out.println(ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private TestBean getAdvisedProxy(String pointcutExpression, CallCountingInterceptor interceptor) {
|
||||
TestBean target = new TestBean();
|
||||
|
||||
Pointcut pointcut = getPointcut(pointcutExpression);
|
||||
|
||||
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
|
||||
advisor.setAdvice(interceptor);
|
||||
advisor.setPointcut(pointcut);
|
||||
|
||||
ProxyFactory pf = new ProxyFactory();
|
||||
pf.setTarget(target);
|
||||
pf.addAdvisor(advisor);
|
||||
|
||||
return (TestBean) pf.getProxy();
|
||||
}
|
||||
|
||||
private void assertMatchesGetAge(MethodMatcher methodMatcher) {
|
||||
assertTrue("Expression should match getAge() method", methodMatcher.matches(getAge, TestBean.class));
|
||||
}
|
||||
|
||||
private void assertMatchesTestBeanClass(ClassFilter classFilter) {
|
||||
assertTrue("Expression should match TestBean class", classFilter.matches(TestBean.class));
|
||||
}
|
||||
|
||||
private void assertDoesNotMatchStringClass(ClassFilter classFilter) {
|
||||
assertFalse("Expression should not match String class", classFilter.matches(String.class));
|
||||
}
|
||||
|
||||
public void testWithUnsupportedPointcutPrimitive() throws Exception {
|
||||
String expression = "call(int org.springframework.beans.TestBean.getAge())";
|
||||
|
||||
try {
|
||||
getPointcut(expression).getClassFilter(); // call to getClassFilter forces resolution...
|
||||
fail("Should not support call pointcuts");
|
||||
}
|
||||
catch (UnsupportedPointcutPrimitiveException ex) {
|
||||
assertEquals("Should not support call pointcut", PointcutPrimitive.CALL, ex.getUnsupportedPrimitive());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void testAndSubstitution() {
|
||||
Pointcut pc = getPointcut("execution(* *(..)) and args(String)");
|
||||
PointcutExpression expr =
|
||||
((AspectJExpressionPointcut) pc).getPointcutExpression();
|
||||
assertEquals("execution(* *(..)) && args(String)",expr.getPointcutExpression());
|
||||
}
|
||||
|
||||
public void testMultipleAndSubstitutions() {
|
||||
Pointcut pc = getPointcut("execution(* *(..)) and args(String) and this(Object)");
|
||||
PointcutExpression expr =
|
||||
((AspectJExpressionPointcut) pc).getPointcutExpression();
|
||||
assertEquals("execution(* *(..)) && args(String) && this(Object)",expr.getPointcutExpression());
|
||||
}
|
||||
|
||||
private Pointcut getPointcut(String expression) {
|
||||
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
|
||||
pointcut.setExpression(expression);
|
||||
return pointcut;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Created on 13-Feb-2006 by Adrian Colyer
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
/**
|
||||
* Used by before-advice-tests.xml
|
||||
* @author Adrian Colyer
|
||||
* @since 2.0
|
||||
*/
|
||||
public class AuthenticationLogger {
|
||||
|
||||
public void logAuthenticationAttempt(String username) {
|
||||
System.out.println("User [" + username + "] attempting to authenticate");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class SecurityManager {
|
||||
public boolean authenticate(String username, String password) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Created on 15 Nov 2006 by Adrian Colyer
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.beans.factory.BeanNameAware;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
* @since 2.0
|
||||
*/
|
||||
public class BeanNameAwareMixin implements BeanNameAware {
|
||||
|
||||
private String beanName;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String)
|
||||
*/
|
||||
public void setBeanName(String name) {
|
||||
this.beanName = name;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.TestBean;
|
||||
|
||||
/**
|
||||
* Tests for matching of bean() pointcut designator.
|
||||
*
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public class BeanNamePointcutMatchingTests extends TestCase {
|
||||
|
||||
public void testMatchingPointcuts() {
|
||||
assertMatch("someName", "bean(someName)");
|
||||
|
||||
// Spring bean names are less restrictive compared to AspectJ names (methods, types etc.)
|
||||
// MVC Controller-kind
|
||||
assertMatch("someName/someOtherName", "bean(someName/someOtherName)");
|
||||
assertMatch("someName/foo/someOtherName", "bean(someName/*/someOtherName)");
|
||||
assertMatch("someName/foo/bar/someOtherName", "bean(someName/*/someOtherName)");
|
||||
assertMatch("someName/*/**", "bean(someName/*)");
|
||||
// JMX-kind
|
||||
assertMatch("service:name=traceService", "bean(service:name=traceService)");
|
||||
assertMatch("service:name=traceService", "bean(service:name=*)");
|
||||
assertMatch("service:name=traceService", "bean(*:name=traceService)");
|
||||
|
||||
// Wildcards
|
||||
assertMatch("someName", "bean(*someName)");
|
||||
assertMatch("someName", "bean(*Name)");
|
||||
assertMatch("someName", "bean(*)");
|
||||
assertMatch("someName", "bean(someName*)");
|
||||
assertMatch("someName", "bean(some*)");
|
||||
assertMatch("someName", "bean(some*Name)");
|
||||
assertMatch("someName", "bean(*some*Name*)");
|
||||
assertMatch("someName", "bean(*s*N*)");
|
||||
|
||||
// Or, and, not expressions
|
||||
assertMatch("someName", "bean(someName) || bean(someOtherName)");
|
||||
assertMatch("someOtherName", "bean(someName) || bean(someOtherName)");
|
||||
|
||||
assertMatch("someName", "!bean(someOtherName)");
|
||||
|
||||
assertMatch("someName", "bean(someName) || !bean(someOtherName)");
|
||||
assertMatch("someName", "bean(someName) && !bean(someOtherName)");
|
||||
}
|
||||
|
||||
public void testNonMatchingPointcuts() {
|
||||
assertMisMatch("someName", "bean(someNamex)");
|
||||
assertMisMatch("someName", "bean(someX*Name)");
|
||||
|
||||
// And, not expressions
|
||||
assertMisMatch("someName", "bean(someName) && bean(someOtherName)");
|
||||
assertMisMatch("someName", "!bean(someName)");
|
||||
assertMisMatch("someName", "!bean(someName) && bean(someOtherName)");
|
||||
assertMisMatch("someName", "!bean(someName) || bean(someOtherName)");
|
||||
}
|
||||
|
||||
private void assertMatch(String beanName, String pcExpression) {
|
||||
assertTrue("Unexpected mismatch for bean \"" + beanName + "\" for pcExpression \"" + pcExpression + "\"",
|
||||
matches(beanName, pcExpression));
|
||||
}
|
||||
|
||||
private void assertMisMatch(String beanName, String pcExpression) {
|
||||
assertFalse("Unexpected match for bean \"" + beanName + "\" for pcExpression \"" + pcExpression + "\"",
|
||||
matches(beanName, pcExpression));
|
||||
}
|
||||
|
||||
private static boolean matches(final String beanName, String pcExpression) {
|
||||
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut() {
|
||||
protected String getCurrentProxiedBeanName() {
|
||||
return beanName;
|
||||
}
|
||||
};
|
||||
pointcut.setExpression(pcExpression);
|
||||
return pointcut.matches(TestBean.class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright 2002-2008 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.aop.MethodBeforeAdvice;
|
||||
import org.springframework.aop.framework.Advised;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* Test for correct application of the bean() PCD for XML-based AspectJ aspects.
|
||||
*
|
||||
* @author Ramnivas Laddad
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class BeanNamePointcutTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
protected ITestBean testBean1;
|
||||
protected ITestBean testBean2;
|
||||
protected ITestBean testBeanContainingNestedBean;
|
||||
protected Map testFactoryBean1;
|
||||
protected Map testFactoryBean2;
|
||||
protected Counter counterAspect;
|
||||
|
||||
protected ITestBean interceptThis;
|
||||
protected ITestBean dontInterceptThis;
|
||||
protected TestInterceptor testInterceptor;
|
||||
|
||||
|
||||
public BeanNamePointcutTests() {
|
||||
setPopulateProtectedVariables(true);
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "bean-name-pointcut-tests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
this.counterAspect.reset();
|
||||
super.onSetUp();
|
||||
}
|
||||
|
||||
|
||||
// We don't need to test all combination of pointcuts due to BeanNamePointcutMatchingTests
|
||||
|
||||
public void testMatchingBeanName() {
|
||||
assertTrue("Matching bean must be advised (proxied)", this.testBean1 instanceof Advised);
|
||||
// Call two methods to test for SPR-3953-like condition
|
||||
this.testBean1.setAge(20);
|
||||
this.testBean1.setName("");
|
||||
assertEquals("Advice not executed: must have been", 2, this.counterAspect.getCount());
|
||||
}
|
||||
|
||||
public void testNonMatchingBeanName() {
|
||||
assertFalse("Non-matching bean must *not* be advised (proxied)", this.testBean2 instanceof Advised);
|
||||
this.testBean2.setAge(20);
|
||||
assertEquals("Advice must *not* have been executed", 0, this.counterAspect.getCount());
|
||||
}
|
||||
|
||||
public void testNonMatchingNestedBeanName() {
|
||||
assertFalse("Non-matching bean must *not* be advised (proxied)", this.testBeanContainingNestedBean.getDoctor() instanceof Advised);
|
||||
}
|
||||
|
||||
public void testMatchingFactoryBeanObject() {
|
||||
assertTrue("Matching bean must be advised (proxied)", this.testFactoryBean1 instanceof Advised);
|
||||
assertEquals("myValue", this.testFactoryBean1.get("myKey"));
|
||||
assertEquals("myValue", this.testFactoryBean1.get("myKey"));
|
||||
assertEquals("Advice not executed: must have been", 2, this.counterAspect.getCount());
|
||||
FactoryBean fb = (FactoryBean) getApplicationContext().getBean("&testFactoryBean1");
|
||||
assertTrue("FactoryBean itself must *not* be advised", !(fb instanceof Advised));
|
||||
}
|
||||
|
||||
public void testMatchingFactoryBeanItself() {
|
||||
assertTrue("Matching bean must *not* be advised (proxied)", !(this.testFactoryBean2 instanceof Advised));
|
||||
FactoryBean fb = (FactoryBean) getApplicationContext().getBean("&testFactoryBean2");
|
||||
assertTrue("FactoryBean itself must be advised", fb instanceof Advised);
|
||||
assertTrue(Map.class.isAssignableFrom(fb.getObjectType()));
|
||||
assertTrue(Map.class.isAssignableFrom(fb.getObjectType()));
|
||||
assertEquals("Advice not executed: must have been", 2, this.counterAspect.getCount());
|
||||
}
|
||||
|
||||
public void testPointcutAdvisorCombination() {
|
||||
assertTrue("Matching bean must be advised (proxied)", this.interceptThis instanceof Advised);
|
||||
assertFalse("Non-matching bean must *not* be advised (proxied)", this.dontInterceptThis instanceof Advised);
|
||||
interceptThis.setAge(20);
|
||||
assertEquals(1, testInterceptor.interceptionCount);
|
||||
dontInterceptThis.setAge(20);
|
||||
assertEquals(1, testInterceptor.interceptionCount);
|
||||
}
|
||||
|
||||
|
||||
public static class TestInterceptor implements MethodBeforeAdvice {
|
||||
|
||||
private int interceptionCount;
|
||||
|
||||
public void before(Method method, Object[] args, Object target) throws Throwable {
|
||||
interceptionCount++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.easymock.MockControl;
|
||||
|
||||
import org.springframework.aop.aspectj.AdviceBindingTestAspect.AdviceBindingCollaborator;
|
||||
|
||||
/**
|
||||
* Tests for various parameter binding scenarios with before advice.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
public class BeforeAdviceBindingTests extends AbstractAdviceBindingTests {
|
||||
|
||||
private AdviceBindingTestAspect beforeAdviceAspect;
|
||||
|
||||
private MockControl mockControl;
|
||||
|
||||
private AdviceBindingCollaborator mockCollaborator;
|
||||
|
||||
|
||||
public void setBeforeAdviceAspect(AdviceBindingTestAspect anAspect) {
|
||||
this.beforeAdviceAspect = anAspect;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "before-advice-tests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
super.onSetUp();
|
||||
mockControl = MockControl.createNiceControl(AdviceBindingCollaborator.class);
|
||||
mockCollaborator = (AdviceBindingCollaborator) mockControl.getMock();
|
||||
beforeAdviceAspect.setCollaborator(mockCollaborator);
|
||||
}
|
||||
|
||||
|
||||
public void testOneIntArg() {
|
||||
mockCollaborator.oneIntArg(5);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneObjectArgBoundToProxyUsingThis() {
|
||||
mockCollaborator.oneObjectArg(this.testBeanProxy);
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testOneIntAndOneObjectArgs() {
|
||||
mockCollaborator.oneIntAndOneObject(5,this.testBeanTarget);
|
||||
mockControl.replay();
|
||||
testBeanProxy.setAge(5);
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testNeedsJoinPoint() {
|
||||
mockCollaborator.needsJoinPoint("getAge");
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
public void testNeedsJoinPointStaticPart() {
|
||||
mockCollaborator.needsJoinPointStaticPart("getAge");
|
||||
mockControl.replay();
|
||||
testBeanProxy.getAge();
|
||||
mockControl.verify();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
import org.aopalliance.intercept.MethodInvocation;
|
||||
|
||||
/**
|
||||
* @author robh
|
||||
*/
|
||||
class CallCountingInterceptor implements MethodInterceptor {
|
||||
|
||||
private int count;
|
||||
|
||||
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
|
||||
count++;
|
||||
return methodInvocation.proceed();
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
this.count = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
/**
|
||||
* A simple counter for use in simple tests (for example, how many times an advice was executed)
|
||||
*
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public class Counter implements ICounter {
|
||||
|
||||
private int count;
|
||||
|
||||
public Counter() {
|
||||
}
|
||||
|
||||
public void increment() {
|
||||
count++;
|
||||
}
|
||||
|
||||
public void decrement() {
|
||||
count--;
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
public void setCount(int counter) {
|
||||
this.count = counter;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
this.count = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.springframework.beans.factory.BeanNameAware;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class DeclarationOrderIndependenceTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private TopsyTurvyAspect aspect;
|
||||
|
||||
private TopsyTurvyTarget target;
|
||||
|
||||
|
||||
public DeclarationOrderIndependenceTests() {
|
||||
setAutowireMode(AUTOWIRE_BY_NAME);
|
||||
}
|
||||
|
||||
public void setTopsyTurvyAspect(TopsyTurvyAspect aspect) {
|
||||
this.aspect = aspect;
|
||||
}
|
||||
|
||||
public void setTopsyTurvyTarget(TopsyTurvyTarget target) {
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "topsy-turvy-aspect.xml";
|
||||
}
|
||||
|
||||
|
||||
public void testTargetIsSerializable() {
|
||||
assertTrue("target bean is serializable",this.target instanceof Serializable);
|
||||
}
|
||||
|
||||
public void testTargetIsBeanNameAware() {
|
||||
assertTrue("target bean is bean name aware",this.target instanceof BeanNameAware);
|
||||
}
|
||||
|
||||
public void testBeforeAdviceFiringOk() {
|
||||
AspectCollaborator collab = new AspectCollaborator();
|
||||
this.aspect.setCollaborator(collab);
|
||||
this.target.doSomething();
|
||||
assertTrue("before advice fired",collab.beforeFired);
|
||||
}
|
||||
|
||||
public void testAroundAdviceFiringOk() {
|
||||
AspectCollaborator collab = new AspectCollaborator();
|
||||
this.aspect.setCollaborator(collab);
|
||||
this.target.getX();
|
||||
assertTrue("around advice fired",collab.aroundFired);
|
||||
}
|
||||
|
||||
public void testAfterReturningFiringOk() {
|
||||
AspectCollaborator collab = new AspectCollaborator();
|
||||
this.aspect.setCollaborator(collab);
|
||||
this.target.getX();
|
||||
assertTrue("after returning advice fired",collab.afterReturningFired);
|
||||
}
|
||||
|
||||
private static class AspectCollaborator implements TopsyTurvyAspect.Collaborator {
|
||||
|
||||
public boolean afterReturningFired = false;
|
||||
public boolean aroundFired = false;
|
||||
public boolean beforeFired = false;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.aop.aspectj.TopsyTurvyAspect.Collaborator#afterReturningAdviceFired()
|
||||
*/
|
||||
public void afterReturningAdviceFired() {
|
||||
this.afterReturningFired = true;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.aop.aspectj.TopsyTurvyAspect.Collaborator#aroundAdviceFired()
|
||||
*/
|
||||
public void aroundAdviceFired() {
|
||||
this.aroundFired = true;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.aop.aspectj.TopsyTurvyAspect.Collaborator#beforeAdviceFired()
|
||||
*/
|
||||
public void beforeAdviceFired() {
|
||||
this.beforeFired = true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright 2002-2008 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public class DeclareParentsDelegateRefTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
protected NoMethodsBean noMethodsBean;
|
||||
|
||||
protected CounterImpl counter;
|
||||
|
||||
|
||||
public DeclareParentsDelegateRefTests() {
|
||||
setPopulateProtectedVariables(true);
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
counter.reset();
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "declare-parents-delegate-ref-tests.xml";
|
||||
}
|
||||
|
||||
|
||||
public void testIntroductionWasMade() {
|
||||
assertTrue("Introduction must have been made", noMethodsBean instanceof Counter);
|
||||
}
|
||||
|
||||
public void testIntroductionDelegation() {
|
||||
((Counter)noMethodsBean).increment();
|
||||
assertEquals("Delegate's counter should be updated", 1, counter.count);
|
||||
}
|
||||
|
||||
public static interface NoMethodsBean {
|
||||
}
|
||||
|
||||
public static class NoMethodsBeanImpl implements NoMethodsBean {
|
||||
}
|
||||
|
||||
public static interface Counter {
|
||||
public void increment();
|
||||
}
|
||||
|
||||
|
||||
public static class CounterImpl implements Counter {
|
||||
|
||||
int count;
|
||||
|
||||
public void increment() {
|
||||
count++;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.aop.framework.Lockable;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
|
||||
/**
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
public class DeclareParentsTests extends AbstractAdviceBindingTests {
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "declare-parents-tests.xml";
|
||||
}
|
||||
|
||||
public void testIntroductionWasMade() {
|
||||
assertTrue("Introduction must have been made", testBeanProxy instanceof Lockable);
|
||||
}
|
||||
|
||||
// TODO if you change type pattern from org.springframework.beans..*
|
||||
// to org.springframework..* it also matches introduction.
|
||||
// Perhaps generated advisor bean definition could be made to depend
|
||||
// on the introduction, in which case this would not be a problem.
|
||||
public void testLockingWorks() {
|
||||
Object introductionObject = applicationContext.getBean("introduction");
|
||||
assertFalse("Introduction should not be proxied", AopUtils.isAopProxy(introductionObject));
|
||||
|
||||
Lockable lockable = (Lockable) testBeanProxy;
|
||||
assertFalse(lockable.locked());
|
||||
|
||||
// Invoke a non-advised method
|
||||
testBeanProxy.getAge();
|
||||
|
||||
testBeanProxy.setName("");
|
||||
lockable.lock();
|
||||
try {
|
||||
testBeanProxy.setName(" ");
|
||||
fail("Should be locked");
|
||||
}
|
||||
catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
/**
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public interface ICounter {
|
||||
|
||||
void increment();
|
||||
|
||||
void decrement();
|
||||
|
||||
int getCount();
|
||||
|
||||
void setCount(int counter);
|
||||
|
||||
void reset();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* Tests to check if the first implicit join point argument is correctly processed.
|
||||
* See SPR-3723 for more details.
|
||||
*
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public class ImplicitJPArgumentMatchingTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
protected TestBean testBean;
|
||||
|
||||
public ImplicitJPArgumentMatchingTests() {
|
||||
setPopulateProtectedVariables(true);
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "implicit-jp-argument-matching-tests.xml";
|
||||
}
|
||||
|
||||
public void testAspect() {
|
||||
// nothing to really test; it is enough if we don't get error while creating app context
|
||||
testBean.setCountry("US");
|
||||
}
|
||||
|
||||
public static class CounterAspect {
|
||||
public void increment(ProceedingJoinPoint pjp, Object bean, Object argument) throws Throwable {
|
||||
pjp.proceed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.JoinPoint.StaticPart;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.aspectj.lang.reflect.SourceLocation;
|
||||
|
||||
import org.springframework.aop.MethodBeforeAdvice;
|
||||
import org.springframework.aop.framework.AopContext;
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.aop.interceptor.ExposeInvocationInterceptor;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
|
||||
/**
|
||||
* @author Rod Johnson
|
||||
* @since 2.0
|
||||
*/
|
||||
public class MethodInvocationProceedingJoinPointTests extends TestCase {
|
||||
|
||||
public void testingBindingWithJoinPoint() {
|
||||
try {
|
||||
AbstractAspectJAdvice.currentJoinPoint();
|
||||
fail("Needs to be bound by interceptor action");
|
||||
}
|
||||
catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
public void testingBindingWithProceedingJoinPoint() {
|
||||
try {
|
||||
AbstractAspectJAdvice.currentJoinPoint();
|
||||
fail("Needs to be bound by interceptor action");
|
||||
}
|
||||
catch (IllegalStateException ex) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
public void testCanGetMethodSignatureFromJoinPoint() {
|
||||
final Object raw = new TestBean();
|
||||
// Will be set by advice during a method call
|
||||
final int newAge = 23;
|
||||
|
||||
ProxyFactory pf = new ProxyFactory(raw);
|
||||
pf.setExposeProxy(true);
|
||||
pf.addAdvisor(ExposeInvocationInterceptor.ADVISOR);
|
||||
pf.addAdvice(new MethodBeforeAdvice() {
|
||||
private int depth;
|
||||
|
||||
public void before(Method method, Object[] args, Object target) throws Throwable {
|
||||
JoinPoint jp = AbstractAspectJAdvice.currentJoinPoint();
|
||||
assertTrue("Method named in toString", jp.toString().indexOf(method.getName()) != -1);
|
||||
// Ensure that these don't cause problems
|
||||
jp.toShortString();
|
||||
jp.toLongString();
|
||||
|
||||
assertSame(target, AbstractAspectJAdvice.currentJoinPoint().getTarget());
|
||||
assertFalse(AopUtils.isAopProxy(AbstractAspectJAdvice.currentJoinPoint().getTarget()));
|
||||
|
||||
ITestBean thisProxy = (ITestBean) AbstractAspectJAdvice.currentJoinPoint().getThis();
|
||||
assertTrue(AopUtils.isAopProxy(AbstractAspectJAdvice.currentJoinPoint().getThis()));
|
||||
|
||||
assertNotSame(target, thisProxy);
|
||||
|
||||
// Check getting again doesn't cause a problem
|
||||
assertSame(thisProxy, AbstractAspectJAdvice.currentJoinPoint().getThis());
|
||||
|
||||
// Try reentrant call--will go through this advice.
|
||||
// Be sure to increment depth to avoid infinite recursion
|
||||
if (depth++ == 0) {
|
||||
// Check that toString doesn't cause a problem
|
||||
thisProxy.toString();
|
||||
// Change age, so this will be returned by invocation
|
||||
thisProxy.setAge(newAge);
|
||||
assertEquals(newAge, thisProxy.getAge());
|
||||
}
|
||||
|
||||
assertSame(AopContext.currentProxy(), thisProxy);
|
||||
assertSame(target, raw);
|
||||
|
||||
assertSame(method.getName(), AbstractAspectJAdvice.currentJoinPoint().getSignature().getName());
|
||||
assertEquals(method.getModifiers(), AbstractAspectJAdvice.currentJoinPoint().getSignature().getModifiers());
|
||||
|
||||
MethodSignature msig = (MethodSignature) AbstractAspectJAdvice.currentJoinPoint().getSignature();
|
||||
assertSame("Return same MethodSignature repeatedly", msig, AbstractAspectJAdvice.currentJoinPoint().getSignature());
|
||||
assertSame("Return same JoinPoint repeatedly", AbstractAspectJAdvice.currentJoinPoint(), AbstractAspectJAdvice.currentJoinPoint());
|
||||
assertEquals(method.getDeclaringClass(), msig.getDeclaringType());
|
||||
assertTrue(Arrays.equals(method.getParameterTypes(), msig.getParameterTypes()));
|
||||
assertEquals(method.getReturnType(), msig.getReturnType());
|
||||
assertTrue(Arrays.equals(method.getExceptionTypes(), msig.getExceptionTypes()));
|
||||
try {
|
||||
msig.getParameterNames();
|
||||
fail("Can't determine parameter names");
|
||||
}
|
||||
catch (UnsupportedOperationException ex) {
|
||||
// Expected
|
||||
}
|
||||
msig.toLongString();
|
||||
msig.toShortString();
|
||||
}
|
||||
});
|
||||
ITestBean itb = (ITestBean) pf.getProxy();
|
||||
// Any call will do
|
||||
assertEquals("Advice reentrantly set age", newAge, itb.getAge());
|
||||
}
|
||||
|
||||
public void testCanGetSourceLocationFromJoinPoint() {
|
||||
final Object raw = new TestBean();
|
||||
ProxyFactory pf = new ProxyFactory(raw);
|
||||
pf.addAdvisor(ExposeInvocationInterceptor.ADVISOR);
|
||||
pf.addAdvice(new MethodBeforeAdvice() {
|
||||
public void before(Method method, Object[] args, Object target) throws Throwable {
|
||||
SourceLocation sloc = AbstractAspectJAdvice.currentJoinPoint().getSourceLocation();
|
||||
assertEquals("Same source location must be returned on subsequent requests", sloc, AbstractAspectJAdvice.currentJoinPoint().getSourceLocation());
|
||||
assertEquals(TestBean.class, sloc.getWithinType());
|
||||
try {
|
||||
sloc.getLine();
|
||||
fail("Can't get line number");
|
||||
}
|
||||
catch (UnsupportedOperationException ex) {
|
||||
// Expected
|
||||
}
|
||||
|
||||
try {
|
||||
sloc.getFileName();
|
||||
fail("Can't get file name");
|
||||
}
|
||||
catch (UnsupportedOperationException ex) {
|
||||
// Expected
|
||||
}
|
||||
}
|
||||
});
|
||||
ITestBean itb = (ITestBean) pf.getProxy();
|
||||
// Any call will do
|
||||
itb.getAge();
|
||||
}
|
||||
|
||||
public void testCanGetStaticPartFromJoinPoint() {
|
||||
final Object raw = new TestBean();
|
||||
ProxyFactory pf = new ProxyFactory(raw);
|
||||
pf.addAdvisor(ExposeInvocationInterceptor.ADVISOR);
|
||||
pf.addAdvice(new MethodBeforeAdvice() {
|
||||
public void before(Method method, Object[] args, Object target) throws Throwable {
|
||||
StaticPart staticPart = AbstractAspectJAdvice.currentJoinPoint().getStaticPart();
|
||||
assertEquals("Same static part must be returned on subsequent requests", staticPart, AbstractAspectJAdvice.currentJoinPoint().getStaticPart());
|
||||
assertEquals(ProceedingJoinPoint.METHOD_EXECUTION, staticPart.getKind());
|
||||
assertSame(AbstractAspectJAdvice.currentJoinPoint().getSignature(), staticPart.getSignature());
|
||||
assertEquals(AbstractAspectJAdvice.currentJoinPoint().getSourceLocation(), staticPart.getSourceLocation());
|
||||
}
|
||||
});
|
||||
ITestBean itb = (ITestBean) pf.getProxy();
|
||||
// Any call will do
|
||||
itb.getAge();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.aop.framework.Lockable;
|
||||
|
||||
/**
|
||||
* @author Rod Johnson
|
||||
*/
|
||||
public class NonAnnotatedMakeLockable {
|
||||
|
||||
public void checkNotLocked(Lockable mixin) {
|
||||
if (mixin.locked()) {
|
||||
throw new IllegalStateException("locked");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
|
||||
/**
|
||||
* Aspect used as part of overloaded advice tests.
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class OverloadedAdviceTestAspect {
|
||||
|
||||
public void myBeforeAdvice(String name) {
|
||||
// no-op
|
||||
}
|
||||
|
||||
public void myBeforeAdvice(int age) {
|
||||
// no-op
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.factory.BeanCreationException;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
|
||||
/**
|
||||
* Tests for overloaded advice.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class OverloadedAdviceTests extends TestCase {
|
||||
|
||||
public void testExceptionOnConfigParsingWithMismatchedAdviceMethod() {
|
||||
try {
|
||||
new ClassPathXmlApplicationContext("org/springframework/aop/aspectj/overloaded-advice-tests.xml");
|
||||
}
|
||||
catch (BeanCreationException ex) {
|
||||
Throwable cause = ex.getRootCause();
|
||||
assertTrue("Should be IllegalArgumentException", cause instanceof IllegalArgumentException);
|
||||
assertTrue("invalidAbsoluteTypeName should be detected by AJ",
|
||||
cause.getMessage().indexOf("invalidAbsoluteTypeName") != -1);
|
||||
}
|
||||
}
|
||||
|
||||
public void testExceptionOnConfigParsingWithAmbiguousAdviceMethod() {
|
||||
try {
|
||||
new ClassPathXmlApplicationContext("org/springframework/aop/aspectj/ambiguous-advice-tests.xml");
|
||||
}
|
||||
catch (BeanCreationException ex) {
|
||||
Throwable cause = ex.getRootCause();
|
||||
assertTrue("Should be IllegalArgumentException", cause instanceof IllegalArgumentException);
|
||||
assertTrue("Cannot resolve method 'myBeforeAdvice' to a unique method",
|
||||
cause.getMessage().indexOf("Cannot resolve method 'myBeforeAdvice' to a unique method") != -1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
|
||||
import org.springframework.beans.factory.BeanNameAware;
|
||||
import org.springframework.core.Ordered;
|
||||
|
||||
/**
|
||||
* Used in advice precedence tests (surprise!)
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class PrecedenceTestAspect implements BeanNameAware, Ordered {
|
||||
|
||||
private String name;
|
||||
|
||||
private int order = Ordered.LOWEST_PRECEDENCE;
|
||||
|
||||
private Collaborator collaborator;
|
||||
|
||||
|
||||
public void setBeanName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setOrder(int order) {
|
||||
this.order = order;
|
||||
}
|
||||
|
||||
public int getOrder() {
|
||||
return order;
|
||||
}
|
||||
|
||||
public void setCollaborator(Collaborator collaborator) {
|
||||
this.collaborator = collaborator;
|
||||
}
|
||||
|
||||
public void beforeAdviceOne() {
|
||||
this.collaborator.beforeAdviceOne(this.name);
|
||||
}
|
||||
|
||||
public void beforeAdviceTwo() {
|
||||
this.collaborator.beforeAdviceTwo(this.name);
|
||||
}
|
||||
|
||||
public int aroundAdviceOne(ProceedingJoinPoint pjp) {
|
||||
int ret = -1;
|
||||
this.collaborator.aroundAdviceOne(this.name);
|
||||
try {
|
||||
ret = ((Integer)pjp.proceed()).intValue();
|
||||
}
|
||||
catch(Throwable t) { throw new RuntimeException(t); }
|
||||
this.collaborator.aroundAdviceOne(this.name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public int aroundAdviceTwo(ProceedingJoinPoint pjp) {
|
||||
int ret = -1;
|
||||
this.collaborator.aroundAdviceTwo(this.name);
|
||||
try {
|
||||
ret = ((Integer)pjp.proceed()).intValue();
|
||||
}
|
||||
catch(Throwable t) {throw new RuntimeException(t);}
|
||||
this.collaborator.aroundAdviceTwo(this.name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void afterAdviceOne() {
|
||||
this.collaborator.afterAdviceOne(this.name);
|
||||
}
|
||||
|
||||
public void afterAdviceTwo() {
|
||||
this.collaborator.afterAdviceTwo(this.name);
|
||||
}
|
||||
|
||||
|
||||
public interface Collaborator {
|
||||
|
||||
void beforeAdviceOne(String beanName);
|
||||
void beforeAdviceTwo(String beanName);
|
||||
void aroundAdviceOne(String beanName);
|
||||
void aroundAdviceTwo(String beanName);
|
||||
void afterAdviceOne(String beanName);
|
||||
void afterAdviceTwo(String beanName);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
/**
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
|
||||
import org.springframework.core.JdkVersion;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* Test for SPR-3522. Arguments changed on a call to proceed should be
|
||||
* visible to advice further down the invocation chain.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class ProceedTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private SimpleBean testBean;
|
||||
|
||||
private ProceedTestingAspect testAspect;
|
||||
|
||||
private ProceedTestingAspect secondTestAspect;
|
||||
|
||||
|
||||
public ProceedTests() {
|
||||
setAutowireMode(AUTOWIRE_BY_NAME);
|
||||
}
|
||||
|
||||
protected String[] getConfigLocations() {
|
||||
return new String[] {"org/springframework/aop/aspectj/proceedTests.xml"};
|
||||
}
|
||||
|
||||
public void setFirstTestAspect(ProceedTestingAspect anAspect) {
|
||||
this.testAspect = anAspect;
|
||||
}
|
||||
|
||||
public void setSecondTestAspect(ProceedTestingAspect anAspect) {
|
||||
this.secondTestAspect = anAspect;
|
||||
}
|
||||
|
||||
public void setTestBean(SimpleBean aBean) {
|
||||
this.testBean = aBean;
|
||||
}
|
||||
|
||||
|
||||
public void testSimpleProceedWithChangedArgs() {
|
||||
this.testBean.setName("abc");
|
||||
assertEquals("Name changed in around advice", "ABC", this.testBean.getName());
|
||||
}
|
||||
|
||||
public void testGetArgsIsDefensive() {
|
||||
this.testBean.setAge(5);
|
||||
assertEquals("getArgs is defensive", 5, this.testBean.getAge());
|
||||
}
|
||||
|
||||
public void testProceedWithArgsInSameAspect() {
|
||||
if (!JdkVersion.isAtLeastJava15()) {
|
||||
// Doesn't work on JDK 1.4 for some reason...
|
||||
return;
|
||||
}
|
||||
|
||||
this.testBean.setMyFloat(1.0F);
|
||||
assertTrue("value changed in around advice", this.testBean.getMyFloat() > 1.9F);
|
||||
assertTrue("changed value visible to next advice in chain", this.testAspect.getLastBeforeFloatValue() > 1.9F);
|
||||
}
|
||||
|
||||
public void testProceedWithArgsAcrossAspects() {
|
||||
this.testBean.setSex("male");
|
||||
assertEquals("value changed in around advice","MALE", this.testBean.getSex());
|
||||
assertEquals("changed value visible to next before advice in chain","MALE", this.secondTestAspect.getLastBeforeStringValue());
|
||||
assertEquals("changed value visible to next around advice in chain","MALE", this.secondTestAspect.getLastAroundStringValue());
|
||||
}
|
||||
|
||||
|
||||
public interface SimpleBean {
|
||||
|
||||
public void setName(String name);
|
||||
public String getName();
|
||||
public void setAge(int age);
|
||||
public int getAge();
|
||||
public void setMyFloat(float f);
|
||||
public float getMyFloat();
|
||||
public void setSex(String sex);
|
||||
public String getSex();
|
||||
}
|
||||
|
||||
|
||||
public static class SimpleBeanImpl implements SimpleBean {
|
||||
|
||||
private int age;
|
||||
private float aFloat;
|
||||
private String name;
|
||||
private String sex;
|
||||
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
|
||||
public float getMyFloat() {
|
||||
return aFloat;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getSex() {
|
||||
return sex;
|
||||
}
|
||||
|
||||
public void setAge(int age) {
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
public void setMyFloat(float f) {
|
||||
this.aFloat = f;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setSex(String sex) {
|
||||
this.sex = sex;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class ProceedTestingAspect implements Ordered {
|
||||
|
||||
private String lastBeforeStringValue;
|
||||
private String lastAroundStringValue;
|
||||
private float lastBeforeFloatValue;
|
||||
private int order;
|
||||
|
||||
public void setOrder(int order) { this.order = order; }
|
||||
public int getOrder() { return this.order; }
|
||||
|
||||
public Object capitalize(ProceedingJoinPoint pjp, String value) throws Throwable {
|
||||
return pjp.proceed(new Object[] {value.toUpperCase()});
|
||||
}
|
||||
|
||||
public Object doubleOrQuits(ProceedingJoinPoint pjp) throws Throwable {
|
||||
int value = ((Integer) pjp.getArgs()[0]).intValue();
|
||||
pjp.getArgs()[0] = new Integer(value * 2);
|
||||
return pjp.proceed();
|
||||
}
|
||||
|
||||
public Object addOne(ProceedingJoinPoint pjp, Float value) throws Throwable {
|
||||
float fv = value.floatValue();
|
||||
return pjp.proceed(new Object[] {new Float(fv + 1.0F)});
|
||||
}
|
||||
|
||||
public void captureStringArgument(JoinPoint tjp, String arg) {
|
||||
if (!tjp.getArgs()[0].equals(arg)) {
|
||||
throw new IllegalStateException(
|
||||
"argument is '" + arg + "', " +
|
||||
"but args array has '" + tjp.getArgs()[0] + "'"
|
||||
);
|
||||
}
|
||||
this.lastBeforeStringValue = arg;
|
||||
}
|
||||
|
||||
public Object captureStringArgumentInAround(ProceedingJoinPoint pjp, String arg) throws Throwable {
|
||||
if (!pjp.getArgs()[0].equals(arg)) {
|
||||
throw new IllegalStateException(
|
||||
"argument is '" + arg + "', " +
|
||||
"but args array has '" + pjp.getArgs()[0] + "'");
|
||||
}
|
||||
this.lastAroundStringValue = arg;
|
||||
return pjp.proceed();
|
||||
}
|
||||
|
||||
public void captureFloatArgument(JoinPoint tjp, float arg) {
|
||||
float tjpArg = ((Float) tjp.getArgs()[0]).floatValue();
|
||||
if (Math.abs(tjpArg - arg) > 0.000001) {
|
||||
throw new IllegalStateException(
|
||||
"argument is '" + arg + "', " +
|
||||
"but args array has '" + tjpArg + "'"
|
||||
);
|
||||
}
|
||||
this.lastBeforeFloatValue = arg;
|
||||
}
|
||||
|
||||
public String getLastBeforeStringValue() {
|
||||
return this.lastBeforeStringValue;
|
||||
}
|
||||
|
||||
public String getLastAroundStringValue() {
|
||||
return this.lastAroundStringValue;
|
||||
}
|
||||
|
||||
public float getLastBeforeFloatValue() {
|
||||
return this.lastBeforeFloatValue;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Created on 15 Nov 2006 by Adrian Colyer
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
* @since 2.0
|
||||
*/
|
||||
public class SerializableMixin implements Serializable {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* See SPR-1682.
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class SharedPointcutWithArgsMismatch extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private ToBeAdvised toBeAdvised;
|
||||
|
||||
|
||||
public void setToBeAdvised(ToBeAdvised tba) {
|
||||
this.toBeAdvised = tba;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "args-mismatch.xml";
|
||||
}
|
||||
|
||||
|
||||
public void testMismatchedArgBinding() {
|
||||
this.toBeAdvised.foo("Hello");
|
||||
}
|
||||
|
||||
|
||||
public static class ToBeAdvised {
|
||||
|
||||
public void foo(String s) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class MyAspect {
|
||||
|
||||
public void doBefore(int x) {
|
||||
System.out.println(x);
|
||||
}
|
||||
|
||||
public void doBefore(String x) {
|
||||
System.out.println(x);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Created on 14-Feb-2006 by Adrian Colyer
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.springframework.aop.MethodBeforeAdvice;
|
||||
import org.springframework.beans.factory.BeanNameAware;
|
||||
|
||||
/**
|
||||
* Used as part of aspect precedence tests
|
||||
*
|
||||
* @author Adrian Colyer
|
||||
* @since 2.0
|
||||
*/
|
||||
public class SimpleSpringBeforeAdvice implements MethodBeforeAdvice, BeanNameAware {
|
||||
|
||||
private PrecedenceTestAspect.Collaborator collaborator;
|
||||
private String name;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.aop.MethodBeforeAdvice#before(java.lang.reflect.Method, java.lang.Object[], java.lang.Object)
|
||||
*/
|
||||
public void before(Method method, Object[] args, Object target)
|
||||
throws Throwable {
|
||||
this.collaborator.beforeAdviceOne(this.name);
|
||||
}
|
||||
|
||||
public void setCollaborator(PrecedenceTestAspect.Collaborator collaborator) {
|
||||
this.collaborator = collaborator;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String)
|
||||
*/
|
||||
public void setBeanName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
// strange looking interfaces are just to set up certain test conditions...
|
||||
interface NonSerializableFoo { void foo(); }
|
||||
interface SerializableFoo extends Serializable { void foo(); }
|
||||
|
||||
class SubtypeMatchingTestClassA implements NonSerializableFoo {
|
||||
|
||||
public void foo() {}
|
||||
|
||||
}
|
||||
|
||||
class SubtypeMatchingTestClassB implements SerializableFoo {
|
||||
|
||||
public void foo() {}
|
||||
|
||||
}
|
||||
|
||||
interface Bar { void bar(Object o); }
|
||||
|
||||
class SubtypeMatchingTestClassC implements Bar {
|
||||
|
||||
public void bar(Object o) {}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.aop.framework.Advised;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class SubtypeSensitiveMatchingTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
private NonSerializableFoo nonSerializableBean;
|
||||
|
||||
private SerializableFoo serializableBean;
|
||||
|
||||
private Bar bar;
|
||||
|
||||
|
||||
public void setNonSerializableFoo(NonSerializableFoo aBean) {
|
||||
this.nonSerializableBean = aBean;
|
||||
}
|
||||
|
||||
public void setSerializableFoo(SerializableFoo aBean) {
|
||||
this.serializableBean = aBean;
|
||||
}
|
||||
|
||||
public void setBar(Bar aBean) {
|
||||
this.bar = aBean;
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "subtype-sensitive-matching.xml";
|
||||
}
|
||||
|
||||
|
||||
public void testBeansAreProxiedOnStaticMatch() {
|
||||
assertTrue("bean with serializable type should be proxied",
|
||||
this.serializableBean instanceof Advised);
|
||||
}
|
||||
|
||||
public void testBeansThatDoNotMatchBasedSolelyOnRuntimeTypeAreNotProxied() {
|
||||
assertFalse("bean with non-serializable type should not be proxied",
|
||||
this.nonSerializableBean instanceof Advised);
|
||||
}
|
||||
|
||||
public void testBeansThatDoNotMatchBasedOnOtherTestAreProxied() {
|
||||
assertTrue("bean with args check should be proxied",
|
||||
this.bar instanceof Advised);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aopalliance.intercept.MethodInterceptor;
|
||||
import org.aopalliance.intercept.MethodInvocation;
|
||||
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* Tests for target selection matching (see SPR-3783).
|
||||
* Thanks to Tomasz Blachowicz for the bug report!
|
||||
*
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public class TargetPointcutSelectionTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
|
||||
protected TestInterface testImpl1;
|
||||
protected TestInterface testImpl2;
|
||||
protected TestAspect testAspectForTestImpl1;
|
||||
protected TestAspect testAspectForAbstractTestImpl;
|
||||
protected TestInterceptor testInterceptor;
|
||||
|
||||
|
||||
public TargetPointcutSelectionTests() {
|
||||
setPopulateProtectedVariables(true);
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "targetPointcutSelectionTests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
testAspectForTestImpl1.count = 0;
|
||||
testAspectForAbstractTestImpl.count = 0;
|
||||
testInterceptor.count = 0;
|
||||
super.onSetUp();
|
||||
}
|
||||
|
||||
|
||||
public void testTargetSelectionForMatchedType() {
|
||||
testImpl1.interfaceMethod();
|
||||
assertEquals("Should have been advised by POJO advice for impl", 1, testAspectForTestImpl1.count);
|
||||
assertEquals("Should have been advised by POJO advice for base type", 1, testAspectForAbstractTestImpl.count);
|
||||
assertEquals("Should have been advised by advisor", 1, testInterceptor.count);
|
||||
}
|
||||
|
||||
public void testTargetNonSelectionForMismatchedType() {
|
||||
testImpl2.interfaceMethod();
|
||||
assertEquals("Shouldn't have been advised by POJO advice for impl", 0, testAspectForTestImpl1.count);
|
||||
assertEquals("Should have been advised by POJO advice for base type", 1, testAspectForAbstractTestImpl.count);
|
||||
assertEquals("Shouldn't have been advised by advisor", 0, testInterceptor.count);
|
||||
}
|
||||
|
||||
|
||||
public static interface TestInterface {
|
||||
|
||||
public void interfaceMethod();
|
||||
}
|
||||
|
||||
|
||||
// Reproducing bug requires that the class specified in target() pointcut doesn't
|
||||
// include the advised method's implementation (instead a base class should include it)
|
||||
public static abstract class AbstractTestImpl implements TestInterface {
|
||||
|
||||
public void interfaceMethod() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class TestImpl1 extends AbstractTestImpl {
|
||||
}
|
||||
|
||||
|
||||
public static class TestImpl2 extends AbstractTestImpl {
|
||||
}
|
||||
|
||||
|
||||
public static class TestAspect {
|
||||
|
||||
public int count;
|
||||
|
||||
public void increment() {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class TestInterceptor extends TestAspect implements MethodInterceptor {
|
||||
|
||||
public Object invoke(MethodInvocation mi) throws Throwable {
|
||||
increment();
|
||||
return mi.proceed();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public class ThisAndTargetSelectionOnlyPointcutsTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
protected TestInterface testBean;
|
||||
|
||||
protected Counter thisAsClassCounter;
|
||||
protected Counter thisAsInterfaceCounter;
|
||||
protected Counter targetAsClassCounter;
|
||||
protected Counter targetAsInterfaceCounter;
|
||||
protected Counter thisAsClassAndTargetAsClassCounter;
|
||||
protected Counter thisAsInterfaceAndTargetAsInterfaceCounter;
|
||||
protected Counter thisAsInterfaceAndTargetAsClassCounter;
|
||||
|
||||
public ThisAndTargetSelectionOnlyPointcutsTests() {
|
||||
setPopulateProtectedVariables(true);
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
super.onSetUp();
|
||||
thisAsClassCounter.reset();
|
||||
thisAsInterfaceCounter.reset();
|
||||
targetAsClassCounter.reset();
|
||||
targetAsInterfaceCounter.reset();
|
||||
|
||||
thisAsClassAndTargetAsClassCounter.reset();
|
||||
thisAsInterfaceAndTargetAsInterfaceCounter.reset();
|
||||
thisAsInterfaceAndTargetAsClassCounter.reset();
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "this-and-target-selectionOnly-pointcuts-tests.xml";
|
||||
}
|
||||
|
||||
public void testThisAsClassDoesNotMatch() {
|
||||
testBean.doIt();
|
||||
assertEquals(0, thisAsClassCounter.getCount());
|
||||
}
|
||||
|
||||
public void testThisAsInterfaceMatch() {
|
||||
testBean.doIt();
|
||||
assertEquals(1, thisAsInterfaceCounter.getCount());
|
||||
}
|
||||
|
||||
public void testTargetAsClassDoesMatch() {
|
||||
testBean.doIt();
|
||||
assertEquals(1, targetAsClassCounter.getCount());
|
||||
}
|
||||
|
||||
public void testTargetAsInterfaceMatch() {
|
||||
testBean.doIt();
|
||||
assertEquals(1, targetAsInterfaceCounter.getCount());
|
||||
}
|
||||
|
||||
public void testThisAsClassAndTargetAsClassCounterNotMatch() {
|
||||
testBean.doIt();
|
||||
assertEquals(0, thisAsClassAndTargetAsClassCounter.getCount());
|
||||
}
|
||||
|
||||
public void testThisAsInterfaceAndTargetAsInterfaceCounterMatch() {
|
||||
testBean.doIt();
|
||||
assertEquals(1, thisAsInterfaceAndTargetAsInterfaceCounter.getCount());
|
||||
}
|
||||
|
||||
public void testThisAsInterfaceAndTargetAsClassCounterMatch() {
|
||||
testBean.doIt();
|
||||
assertEquals(1, thisAsInterfaceAndTargetAsInterfaceCounter.getCount());
|
||||
}
|
||||
|
||||
public static interface TestInterface {
|
||||
public void doIt();
|
||||
}
|
||||
|
||||
public static class TestImpl implements TestInterface {
|
||||
public void doIt() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Created on 15 Nov 2006 by Adrian Colyer
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
* @since 2.0
|
||||
*/
|
||||
public class TopsyTurvyAspect {
|
||||
|
||||
interface Collaborator {
|
||||
void beforeAdviceFired();
|
||||
void afterReturningAdviceFired();
|
||||
void aroundAdviceFired();
|
||||
}
|
||||
|
||||
private Collaborator collaborator;
|
||||
|
||||
public void setCollaborator(Collaborator collaborator) {
|
||||
this.collaborator = collaborator;
|
||||
}
|
||||
|
||||
public void before() {
|
||||
this.collaborator.beforeAdviceFired();
|
||||
}
|
||||
|
||||
public void afterReturning() {
|
||||
this.collaborator.afterReturningAdviceFired();
|
||||
}
|
||||
|
||||
public Object around(ProceedingJoinPoint pjp) throws Throwable {
|
||||
Object ret = pjp.proceed();
|
||||
this.collaborator.aroundAdviceFired();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Created on 15 Nov 2006 by Adrian Colyer
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
* @since 2.0
|
||||
*/
|
||||
public interface TopsyTurvyTarget {
|
||||
|
||||
public abstract void doSomething();
|
||||
|
||||
public abstract int getX();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* Created on 15 Nov 2006 by Adrian Colyer
|
||||
*/
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
* @since 2.0
|
||||
*/
|
||||
public class TopsyTurvyTargetImpl implements TopsyTurvyTarget {
|
||||
|
||||
private int x = 5;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.aop.aspectj.TopsyTurvyTarget#doSomething()
|
||||
*/
|
||||
public void doSomething() {
|
||||
this.x = 10;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.aop.aspectj.TopsyTurvyTarget#getX()
|
||||
*/
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.springframework.aop.framework.autoproxy.CountingTestBean;
|
||||
import org.springframework.beans.IOther;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
import org.springframework.test.AssertThrows;
|
||||
|
||||
/**
|
||||
* Unit tests for the {@link TypePatternClassFilter} class.
|
||||
*
|
||||
* @author Rod Johnson
|
||||
* @author Rick Evans
|
||||
*/
|
||||
public final class TypePatternClassFilterTests extends TestCase {
|
||||
|
||||
public void testInvalidPattern() {
|
||||
try {
|
||||
new TypePatternClassFilter("-");
|
||||
fail("Pattern must be recognized as invalid.");
|
||||
}
|
||||
catch (IllegalArgumentException expected) {
|
||||
}
|
||||
}
|
||||
|
||||
public void testValidPatternMatching() {
|
||||
TypePatternClassFilter tpcf = new TypePatternClassFilter("org.springframework.beans.*");
|
||||
assertTrue("Must match: in package", tpcf.matches(TestBean.class));
|
||||
assertTrue("Must match: in package", tpcf.matches(ITestBean.class));
|
||||
assertTrue("Must match: in package", tpcf.matches(IOther.class));
|
||||
assertFalse("Must be excluded: in wrong package", tpcf.matches(CountingTestBean.class));
|
||||
assertFalse("Must be excluded: in wrong package", tpcf.matches(BeanFactory.class));
|
||||
assertFalse("Must be excluded: in wrong package", tpcf.matches(DefaultListableBeanFactory.class));
|
||||
}
|
||||
|
||||
public void testSubclassMatching() {
|
||||
TypePatternClassFilter tpcf = new TypePatternClassFilter("org.springframework.beans.ITestBean+");
|
||||
assertTrue("Must match: in package", tpcf.matches(TestBean.class));
|
||||
assertTrue("Must match: in package", tpcf.matches(ITestBean.class));
|
||||
assertTrue("Must match: in package", tpcf.matches(CountingTestBean.class));
|
||||
assertFalse("Must be excluded: not subclass", tpcf.matches(IOther.class));
|
||||
assertFalse("Must be excluded: not subclass", tpcf.matches(DefaultListableBeanFactory.class));
|
||||
}
|
||||
|
||||
public void testAndOrNotReplacement() {
|
||||
TypePatternClassFilter tpcf = new TypePatternClassFilter("java.lang.Object or java.lang.String");
|
||||
assertFalse("matches Number",tpcf.matches(Number.class));
|
||||
assertTrue("matches Object",tpcf.matches(Object.class));
|
||||
assertTrue("matchesString",tpcf.matches(String.class));
|
||||
tpcf = new TypePatternClassFilter("java.lang.Number+ and java.lang.Float");
|
||||
assertTrue("matches Float",tpcf.matches(Float.class));
|
||||
assertFalse("matches Double",tpcf.matches(Double.class));
|
||||
tpcf = new TypePatternClassFilter("java.lang.Number+ and not java.lang.Float");
|
||||
assertFalse("matches Float",tpcf.matches(Float.class));
|
||||
assertTrue("matches Double",tpcf.matches(Double.class));
|
||||
}
|
||||
|
||||
public void testSetTypePatternWithNullArgument() throws Exception {
|
||||
new AssertThrows(IllegalArgumentException.class) {
|
||||
public void test() throws Exception {
|
||||
new TypePatternClassFilter(null);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
|
||||
public void testInvocationOfMatchesMethodBlowsUpWhenNoTypePatternHasBeenSet() throws Exception {
|
||||
new AssertThrows(IllegalStateException.class) {
|
||||
public void test() throws Exception {
|
||||
new TypePatternClassFilter().matches(String.class);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
|
||||
<aop:advisor id="lowPrecedenceAdvisor"
|
||||
advice-ref="lowPrecedenceSpringAdvice"
|
||||
pointcut="execution(* getAge(..))"
|
||||
order="900"/>
|
||||
|
||||
<aop:advisor id="highPrecedenceAdvisor"
|
||||
advice-ref="highPrecedenceSpringAdvice"
|
||||
pointcut="execution(* getAge(..))"
|
||||
order="90"/>
|
||||
|
||||
<aop:aspect ref="lowPrecedenceAspect" order="1000">
|
||||
|
||||
<aop:before
|
||||
method="beforeAdviceOne"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:before
|
||||
method="beforeAdviceTwo"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:around
|
||||
method="aroundAdviceOne"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:around
|
||||
method="aroundAdviceTwo"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:after-returning
|
||||
method="afterAdviceOne"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:after-returning
|
||||
method="afterAdviceTwo"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="highPrecedenceAspect">
|
||||
|
||||
<aop:before
|
||||
method="beforeAdviceOne"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:before
|
||||
method="beforeAdviceTwo"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:around
|
||||
method="aroundAdviceOne"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:around
|
||||
method="aroundAdviceTwo"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:after-returning
|
||||
method="afterAdviceOne"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
<aop:after-returning
|
||||
method="afterAdviceTwo"
|
||||
pointcut="execution(* getAge())"/>
|
||||
|
||||
</aop:aspect>
|
||||
|
||||
</aop:config>
|
||||
|
||||
<bean id="highPrecedenceSpringAdvice" class="org.springframework.aop.aspectj.SimpleSpringBeforeAdvice"/>
|
||||
|
||||
<bean id="lowPrecedenceSpringAdvice" class="org.springframework.aop.aspectj.SimpleSpringBeforeAdvice"/>
|
||||
|
||||
<bean id="highPrecedenceAspect" class="org.springframework.aop.aspectj.PrecedenceTestAspect">
|
||||
<property name="order" value="10"/>
|
||||
</bean>
|
||||
|
||||
<bean id="lowPrecedenceAspect" class="org.springframework.aop.aspectj.PrecedenceTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="afterAdviceBindingTests" ref="testAspect">
|
||||
<aop:after method="oneIntArg" pointcut="execution(* setAge(int)) and args(age)"/>
|
||||
<aop:after method="oneObjectArg" pointcut="execution(* getAge()) and this(bean)"/>
|
||||
<aop:after method="oneObjectArg" pointcut="execution(* getDoctor()) and target(bean)"/>
|
||||
<aop:after method="oneIntAndOneObject"
|
||||
pointcut="execution(* setAge(..)) and args(age) and this(bean)" arg-names="age,bean"/>
|
||||
<aop:after method="needsJoinPoint" pointcut="execution(* getAge())"/>
|
||||
<aop:after method="needsJoinPointStaticPart" pointcut="execution(* getAge())"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.AdviceBindingTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="afterReturningAdviceBindingTests" ref="testAspect">
|
||||
<aop:after-returning method="oneIntArg" pointcut="execution(* setAge(int)) and args(age)"/>
|
||||
<aop:after-returning method="oneObjectArg" pointcut="execution(* getAge()) and this(bean)"/>
|
||||
<aop:after-returning method="oneIntAndOneObject"
|
||||
pointcut="execution(* setAge(..)) and args(age) and this(bean)" arg-names="age,bean"/>
|
||||
<aop:after-returning method="needsJoinPoint" pointcut="execution(* getAge())"/>
|
||||
<aop:after-returning method="needsJoinPointStaticPart" pointcut="execution(* getAge())"/>
|
||||
<!-- additional tests using the returning attribute -->
|
||||
<aop:after-returning method="oneString" returning="name" pointcut="execution(* getName())"/>
|
||||
<aop:after-returning method="oneObjectArg" returning="bean" pointcut="execution(* returnsThis())"/>
|
||||
<aop:after-returning method="oneTestBeanArg" returning="bean" pointcut="execution(* returnsThis())"/>
|
||||
<aop:after-returning method="testBeanArrayArg" returning="beans"
|
||||
pointcut="execution(org.springframework.beans.ITestBean[] *(..))"/>
|
||||
<aop:after-returning method="oneString" returning="name" pointcut="execution(* getSpouse())"/>
|
||||
<aop:after-returning method="objectMatchNoArgs" returning="java.lang.Object"
|
||||
pointcut="execution(* returnsThis())"/>
|
||||
<aop:after-returning method="stringMatchNoArgs" returning="java.lang.String"
|
||||
pointcut="execution(* getSpouse())"/>
|
||||
<aop:after-returning method="oneInt" returning="result" pointcut="execution(* haveBirthday())"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.AfterReturningAdviceBindingTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="afterThrowingAdviceBindingTests" ref="testAspect">
|
||||
<aop:after-throwing
|
||||
method="noArgs"
|
||||
pointcut="execution(* exceptional(..))"
|
||||
/>
|
||||
<aop:after-throwing
|
||||
method="oneThrowable"
|
||||
throwing="t"
|
||||
pointcut="execution(* exceptional(..))"
|
||||
/>
|
||||
<aop:after-throwing
|
||||
method="oneRuntimeException"
|
||||
throwing="ex"
|
||||
pointcut="execution(* exceptional(..))"
|
||||
/>
|
||||
<aop:after-throwing
|
||||
method="noArgsOnThrowableMatch"
|
||||
throwing="java.lang.Throwable"
|
||||
pointcut="execution(* exceptional(..))"
|
||||
/>
|
||||
<aop:after-throwing
|
||||
method="noArgsOnRuntimeExceptionMatch"
|
||||
throwing="java.lang.RuntimeException"
|
||||
pointcut="execution(* exceptional(..))"
|
||||
/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.AfterThrowingAdviceBindingTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="ambiguousAdviceTest" ref="testAspect">
|
||||
<aop:pointcut id="setter" expression="execution(* setName(..)) and args(name)"/>
|
||||
<aop:before pointcut-ref="setter" method="myBeforeAdvice"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.OverloadedAdviceTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="beforeAdviceBindingTests" ref="testAspect">
|
||||
<aop:pointcut id="foo" expression="execution(* foo(..)) and args(x)"/>
|
||||
<aop:before pointcut-ref="foo" method="doBefore(int)"/>
|
||||
<aop:before pointcut-ref="foo" method="doBefore(java.lang.String)"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="someBean" class="org.springframework.aop.aspectj.SharedPointcutWithArgsMismatch$ToBeAdvised"/>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.SharedPointcutWithArgsMismatch$MyAspect"/>
|
||||
</beans>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="beforeAdviceBindingTests" ref="testAspect">
|
||||
<aop:around method="oneIntArg" pointcut="execution(* setAge(int)) and args(age)" />
|
||||
<aop:around method="oneObjectArg" pointcut="execution(* getAge()) and target(bean)"/>
|
||||
<aop:around method="oneIntAndOneObject"
|
||||
pointcut="execution(* setAge(..)) and args(age) and this(bean)" arg-names="thisJoinPoint,age,bean"/>
|
||||
<aop:around method="justJoinPoint" pointcut="execution(* getAge())"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.AroundAdviceBindingTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean">
|
||||
<property name="spouse" ref="testBean2"/>
|
||||
</bean>
|
||||
|
||||
<bean id="testBean2" class="org.springframework.beans.TestBean" autowire-candidate="false">
|
||||
<property name="spouse" ref="testBean"/>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="beforeAdviceBindingTests" ref="testAspect">
|
||||
<aop:around method="oneIntArg" pointcut="execution(* setAge(int)) and args(age)" />
|
||||
<aop:around method="oneObjectArg" pointcut="execution(* getAge()) and target(bean)"/>
|
||||
<aop:around method="oneIntAndOneObject"
|
||||
pointcut="execution(* setAge(..)) and args(age) and this(bean)" arg-names="thisJoinPoint,age,bean"/>
|
||||
<aop:around method="justJoinPoint" pointcut="execution(* getAge())"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.AroundAdviceBindingTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
|
||||
|
||||
<beans>
|
||||
|
||||
<bean id="proxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
|
||||
<property name="expression"
|
||||
value="execution(org.springframework.beans.ITestBean[] org.springframework.beans.ITestBean.*(..))"/>
|
||||
<property name="advice" ref="interceptor"/>
|
||||
</bean>
|
||||
|
||||
<bean id="interceptor" class="org.springframework.aop.aspectj.CallCountingInterceptor"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj.autoproxy;
|
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.springframework.aop.framework.Advised;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
|
||||
|
||||
/**
|
||||
* Test for ensuring the aspects aren't advised. See SPR-3893 for more details.
|
||||
*
|
||||
* @author Ramnivas Laddad
|
||||
*/
|
||||
public class AspectImplementingInterfaceTests extends AbstractDependencyInjectionSpringContextTests {
|
||||
protected ITestBean testBean;
|
||||
protected AnInterface interfaceExtendingAspect;
|
||||
|
||||
public AspectImplementingInterfaceTests() {
|
||||
setPopulateProtectedVariables(true);
|
||||
}
|
||||
|
||||
protected String getConfigPath() {
|
||||
return "aspect-implementing-interface-tests.xml";
|
||||
}
|
||||
|
||||
protected void onSetUp() throws Exception {
|
||||
super.onSetUp();
|
||||
}
|
||||
|
||||
public void testProxyCreation() {
|
||||
assertTrue(testBean instanceof Advised);
|
||||
assertFalse(interfaceExtendingAspect instanceof Advised);
|
||||
}
|
||||
|
||||
public static interface AnInterface {
|
||||
public void interfaceMethod();
|
||||
}
|
||||
|
||||
public static class InterfaceExtendingAspect implements AnInterface {
|
||||
public void increment(ProceedingJoinPoint pjp) throws Throwable {
|
||||
pjp.proceed();
|
||||
}
|
||||
|
||||
public void interfaceMethod() {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.aspectj.autoproxy;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.aop.Advisor;
|
||||
import org.springframework.aop.AfterReturningAdvice;
|
||||
import org.springframework.aop.BeforeAdvice;
|
||||
import org.springframework.aop.aspectj.AbstractAspectJAdvice;
|
||||
import org.springframework.aop.aspectj.AspectJAfterAdvice;
|
||||
import org.springframework.aop.aspectj.AspectJAfterReturningAdvice;
|
||||
import org.springframework.aop.aspectj.AspectJAfterThrowingAdvice;
|
||||
import org.springframework.aop.aspectj.AspectJAroundAdvice;
|
||||
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
|
||||
import org.springframework.aop.aspectj.AspectJMethodBeforeAdvice;
|
||||
import org.springframework.aop.aspectj.AspectJPointcutAdvisor;
|
||||
import org.springframework.aop.support.DefaultPointcutAdvisor;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AspectJPrecedenceComparatorTests extends TestCase {
|
||||
|
||||
/*
|
||||
* Specification for the comparator (as defined in the
|
||||
* AspectJPrecedenceComparator class)
|
||||
*
|
||||
* <p>
|
||||
* Orders AspectJ advice/advisors by invocation order.
|
||||
* </p>
|
||||
* <p>
|
||||
* Given two pieces of advice, <code>a</code> and <code>b</code>:
|
||||
* </p>
|
||||
* <ul>
|
||||
* <li>if <code>a</code> and <code>b</code> are defined in different
|
||||
* aspects, then the advice in the aspect with the lowest order
|
||||
* value has the highest precedence</li>
|
||||
* <li>if <code>a</code> and <code>b</code> are defined in the same
|
||||
* aspect, then if one of <code>a</code> or <code>b</code> is a form of
|
||||
* after advice, then the advice declared last in the aspect has the
|
||||
* highest precedence. If neither <code>a</code> nor <code>b</code> is a
|
||||
* form of after advice, then the advice declared first in the aspect has
|
||||
* the highest precedence.</li>
|
||||
* </ul>
|
||||
*/
|
||||
|
||||
private static final int HIGH_PRECEDENCE_ADVISOR_ORDER = 100;
|
||||
private static final int LOW_PRECEDENCE_ADVISOR_ORDER = 200;
|
||||
private static final int EARLY_ADVICE_DECLARATION_ORDER = 5;
|
||||
private static final int LATE_ADVICE_DECLARATION_ORDER = 10;
|
||||
|
||||
|
||||
private AspectJPrecedenceComparator comparator;
|
||||
|
||||
private Method anyOldMethod;
|
||||
|
||||
private AspectJExpressionPointcut anyOldPointcut;
|
||||
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
this.comparator = new AspectJPrecedenceComparator();
|
||||
this.anyOldMethod = getClass().getMethods()[0];
|
||||
this.anyOldPointcut = new AspectJExpressionPointcut();
|
||||
this.anyOldPointcut.setExpression("execution(* *(..))");
|
||||
}
|
||||
|
||||
|
||||
public void testSameAspectNoAfterAdvice() {
|
||||
Advisor advisor1 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
assertEquals("advisor1 sorted before advisor2", -1, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
advisor2 = createAspectJAroundAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
assertEquals("advisor2 sorted before advisor1", 1, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testSameAspectAfterAdvice() {
|
||||
Advisor advisor1 = createAspectJAfterAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJAroundAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
assertEquals("advisor2 sorted before advisor1", 1, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createAspectJAfterReturningAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
advisor2 = createAspectJAfterThrowingAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
assertEquals("advisor1 sorted before advisor2", -1, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testSameAspectOneOfEach() {
|
||||
Advisor advisor1 = createAspectJAfterAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
assertEquals("advisor1 and advisor2 not comparable", 0, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testSameAdvisorPrecedenceDifferentAspectNoAfterAdvice() {
|
||||
Advisor advisor1 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("nothing to say about order here", 0, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
advisor2 = createAspectJAroundAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("nothing to say about order here", 0, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testSameAdvisorPrecedenceDifferentAspectAfterAdvice() {
|
||||
Advisor advisor1 = createAspectJAfterAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJAroundAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("nothing to say about order here", 0, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createAspectJAfterReturningAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
advisor2 = createAspectJAfterThrowingAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("nothing to say about order here", 0, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testHigherAdvisorPrecedenceNoAfterAdvice() {
|
||||
Advisor advisor1 = createSpringAOPBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER);
|
||||
Advisor advisor2 = createAspectJBeforeAdvice(LOW_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor1 sorted before advisor2", -1, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
advisor2 = createAspectJAroundAdvice(LOW_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor1 sorted before advisor2", -1, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testHigherAdvisorPrecedenceAfterAdvice() {
|
||||
Advisor advisor1 = createAspectJAfterAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJAroundAdvice(LOW_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor1 sorted before advisor2", -1, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createAspectJAfterReturningAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
advisor2 = createAspectJAfterThrowingAdvice(LOW_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor2 sorted after advisor1", -1, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testLowerAdvisorPrecedenceNoAfterAdvice() {
|
||||
Advisor advisor1 = createAspectJBeforeAdvice(LOW_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJBeforeAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor1 sorted after advisor2", 1, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createAspectJBeforeAdvice(LOW_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
advisor2 = createAspectJAroundAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor1 sorted after advisor2", 1, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
public void testLowerAdvisorPrecedenceAfterAdvice() {
|
||||
Advisor advisor1 = createAspectJAfterAdvice(LOW_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someAspect");
|
||||
Advisor advisor2 = createAspectJAroundAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, LATE_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor1 sorted after advisor2", 1, this.comparator.compare(advisor1, advisor2));
|
||||
|
||||
advisor1 = createSpringAOPAfterAdvice(LOW_PRECEDENCE_ADVISOR_ORDER);
|
||||
advisor2 = createAspectJAfterThrowingAdvice(HIGH_PRECEDENCE_ADVISOR_ORDER, EARLY_ADVICE_DECLARATION_ORDER, "someOtherAspect");
|
||||
assertEquals("advisor1 sorted after advisor2", 1, this.comparator.compare(advisor1, advisor2));
|
||||
}
|
||||
|
||||
|
||||
private Advisor createAspectJBeforeAdvice(int advisorOrder, int adviceDeclarationOrder, String aspectName) {
|
||||
AspectJMethodBeforeAdvice advice = new AspectJMethodBeforeAdvice(this.anyOldMethod, this.anyOldPointcut, null);
|
||||
return createAspectJAdvice(advisorOrder, adviceDeclarationOrder, aspectName, advice);
|
||||
}
|
||||
|
||||
private Advisor createAspectJAroundAdvice(int advisorOrder, int adviceDeclarationOrder, String aspectName) {
|
||||
AspectJAroundAdvice advice = new AspectJAroundAdvice(this.anyOldMethod, this.anyOldPointcut, null);
|
||||
return createAspectJAdvice(advisorOrder, adviceDeclarationOrder, aspectName, advice);
|
||||
}
|
||||
|
||||
private Advisor createAspectJAfterAdvice(int advisorOrder, int adviceDeclarationOrder, String aspectName) {
|
||||
AspectJAfterAdvice advice = new AspectJAfterAdvice(this.anyOldMethod, this.anyOldPointcut, null);
|
||||
return createAspectJAdvice(advisorOrder, adviceDeclarationOrder, aspectName, advice);
|
||||
}
|
||||
|
||||
private Advisor createAspectJAfterReturningAdvice(int advisorOrder, int adviceDeclarationOrder, String aspectName) {
|
||||
AspectJAfterReturningAdvice advice = new AspectJAfterReturningAdvice(this.anyOldMethod, this.anyOldPointcut, null);
|
||||
return createAspectJAdvice(advisorOrder, adviceDeclarationOrder, aspectName, advice);
|
||||
}
|
||||
|
||||
private Advisor createAspectJAfterThrowingAdvice(int advisorOrder, int adviceDeclarationOrder, String aspectName) {
|
||||
AspectJAfterThrowingAdvice advice = new AspectJAfterThrowingAdvice(this.anyOldMethod, this.anyOldPointcut, null);
|
||||
return createAspectJAdvice(advisorOrder, adviceDeclarationOrder, aspectName, advice);
|
||||
}
|
||||
|
||||
private Advisor createAspectJAdvice(int advisorOrder, int adviceDeclarationOrder, String aspectName, AbstractAspectJAdvice advice) {
|
||||
advice.setDeclarationOrder(adviceDeclarationOrder);
|
||||
advice.setAspectName(aspectName);
|
||||
AspectJPointcutAdvisor advisor = new AspectJPointcutAdvisor(advice);
|
||||
advisor.setOrder(advisorOrder);
|
||||
return advisor;
|
||||
}
|
||||
|
||||
private Advisor createSpringAOPAfterAdvice(int order) {
|
||||
AfterReturningAdvice advice = new AfterReturningAdvice() {
|
||||
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
|
||||
}
|
||||
};
|
||||
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(this.anyOldPointcut, advice);
|
||||
advisor.setOrder(order);
|
||||
return advisor;
|
||||
}
|
||||
|
||||
private Advisor createSpringAOPBeforeAdvice(int order) {
|
||||
BeforeAdvice advice = new BeforeAdvice() {
|
||||
};
|
||||
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(this.anyOldPointcut, advice);
|
||||
advisor.setOrder(order);
|
||||
return advisor;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect ref="interfaceExtendingAspect">
|
||||
<aop:pointcut id="anyOperation"
|
||||
expression="execution(* *(..))"/>
|
||||
<aop:around pointcut-ref="anyOperation" method="increment"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean" />
|
||||
|
||||
<bean id="interfaceExtendingAspect"
|
||||
class="org.springframework.aop.aspectj.autoproxy.AspectImplementingInterfaceTests$InterfaceExtendingAspect"/>
|
||||
</beans>
|
||||
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="beanNameMatchingTest" ref="counterAspect">
|
||||
<aop:pointcut id="bean1Operation" expression="execution(* set*(..)) and bean(myBean) and !bean(foo)"/>
|
||||
<aop:before pointcut-ref="bean1Operation" method="increment()"/>
|
||||
|
||||
<aop:pointcut id="nestedBeanOperation" expression="execution(* getCompany(..)) and bean(testBean*)"/>
|
||||
<aop:before pointcut-ref="nestedBeanOperation" method="increment()"/>
|
||||
|
||||
<aop:pointcut id="factoryBean1Operation" expression="bean(testFactoryBean1)"/>
|
||||
<aop:before pointcut-ref="factoryBean1Operation" method="increment()"/>
|
||||
|
||||
<aop:pointcut id="factoryBean2Operation" expression="bean(&testFactoryBean2)"/>
|
||||
<aop:before pointcut-ref="factoryBean2Operation" method="increment()"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testBean1" name="myBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="testBean2" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="testBeanContainingNestedBean" class="org.springframework.beans.TestBean">
|
||||
<property name="doctor">
|
||||
<bean class="org.springframework.beans.NestedTestBean"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="testFactoryBean1" class="org.springframework.beans.factory.config.MapFactoryBean">
|
||||
<property name="sourceMap">
|
||||
<map>
|
||||
<entry key="myKey" value="myValue"/>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="testFactoryBean2" class="org.springframework.beans.factory.config.MapFactoryBean">
|
||||
<property name="sourceMap">
|
||||
<map>
|
||||
<entry key="myKey" value="myValue"/>
|
||||
</map>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="counterAspect" class="org.springframework.aop.aspectj.Counter"/>
|
||||
|
||||
<aop:config>
|
||||
<aop:advisor pointcut="bean(*This) and !bean(dont*)" advice-ref="testInterceptor"/>
|
||||
</aop:config>
|
||||
|
||||
<bean id="interceptThis" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="dontInterceptThis" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="testInterceptor" class="org.springframework.aop.aspectj.BeanNamePointcutTests$TestInterceptor"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="beforeAdviceBindingTests" ref="testAspect">
|
||||
<aop:before method="oneIntArg" pointcut="execution(* setAge(int)) and args(age)"/>
|
||||
<aop:before method="oneObjectArg" pointcut="execution(* getAge()) and this(bean)"/>
|
||||
<aop:before method="oneIntAndOneObject"
|
||||
pointcut="execution(* setAge(..)) and args(age) and target(bean)" arg-names="age,bean"/>
|
||||
<aop:before method="needsJoinPoint" pointcut="execution(* getAge())"/>
|
||||
<aop:before method="needsJoinPointStaticPart" pointcut="execution(* getAge())"/>
|
||||
</aop:aspect>
|
||||
|
||||
<!-- variation with external pointcut reference -->
|
||||
<aop:aspect ref="authenticationLogger">
|
||||
<aop:pointcut id="authenticationMethodWithString"
|
||||
expression="execution(boolean *..SecurityManager.authenticate(..)) and args(username,java.lang.String)"/>
|
||||
<aop:before pointcut-ref="authenticationMethodWithString"
|
||||
method="logAuthenticationAttempt(java.lang.String)"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.AdviceBindingTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="authenticationLogger" class="org.springframework.aop.aspectj.AuthenticationLogger"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="testAspect">
|
||||
<aop:declare-parents
|
||||
types-matching="org.springframework.aop.aspectj.DeclareParentsDelegateRefTests.NoMethodsBean+"
|
||||
implement-interface="org.springframework.aop.aspectj.DeclareParentsDelegateRefTests$Counter"
|
||||
delegate-ref="counter"
|
||||
/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="noMethodsBean" class="org.springframework.aop.aspectj.DeclareParentsDelegateRefTests$NoMethodsBeanImpl"/>
|
||||
|
||||
<bean id="counter" class="org.springframework.aop.aspectj.DeclareParentsDelegateRefTests$CounterImpl"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="beforeAdviceBindingTests" ref="introduction">
|
||||
<aop:declare-parents
|
||||
types-matching="org.springframework.beans..*"
|
||||
implement-interface="org.springframework.aop.framework.Lockable"
|
||||
default-impl="org.springframework.aop.framework.DefaultLockable"
|
||||
/>
|
||||
<aop:before
|
||||
method="checkNotLocked"
|
||||
pointcut="execution(* set*(*)) and this(mixin)"
|
||||
arg-names="mixin"
|
||||
/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="introduction" class="org.springframework.aop.aspectj.NonAnnotatedMakeLockable"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config proxy-target-class="true">
|
||||
<aop:aspect ref="counterAspect">
|
||||
<aop:pointcut id="anyOperation"
|
||||
expression="execution(* org.springframework.beans.TestBean.*(..)) and this(bean) and args(argument)"/>
|
||||
<aop:around pointcut-ref="anyOperation" method="increment" arg-names="bean,argument"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean">
|
||||
<property name="name" value="aTestBean"/>
|
||||
</bean>
|
||||
|
||||
<bean id="counterAspect"
|
||||
class="org.springframework.aop.aspectj.ImplicitJPArgumentMatchingTests$CounterAspect"/>
|
||||
</beans>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="overloadedAdviceTest" ref="testAspect">
|
||||
<aop:pointcut id="setter" expression="execution(* setName(..)) and args(name)"/>
|
||||
<aop:before pointcut-ref="setter" method="myBeforeAdvice(java.lang.String)"/>
|
||||
<aop:before pointcut-ref="setter" method="myBeforeAdvice(int)"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testAspect" class="org.springframework.aop.aspectj.OverloadedAdviceTestAspect"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="aspectOne" ref="firstTestAspect">
|
||||
<aop:around pointcut="execution(* setName(..)) and args(value)" method="capitalize"/>
|
||||
<aop:around pointcut="execution(* setAge(..))" method="doubleOrQuits"/>
|
||||
<aop:around pointcut="execution(* setMyFloat(..)) and args(value)" method="addOne"/>
|
||||
<aop:before pointcut="execution(* setMyFloat(..)) and args(arg)" method="captureFloatArgument"/>
|
||||
<aop:around pointcut="execution(* setSex(..)) and args(value)" method="capitalize"/>
|
||||
</aop:aspect>
|
||||
<aop:aspect id="aspectTwo" ref="secondTestAspect">
|
||||
<aop:before pointcut="execution(* setSex(..)) and args(arg)" method="captureStringArgument"/>
|
||||
<aop:around pointcut="execution(* setSex(..)) and args(arg)" method="captureStringArgumentInAround"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="testBean" class="org.springframework.aop.aspectj.ProceedTests$SimpleBeanImpl"/>
|
||||
|
||||
<bean id="firstTestAspect" class="org.springframework.aop.aspectj.ProceedTests$ProceedTestingAspect">
|
||||
<property name="order" value="1"/>
|
||||
</bean>
|
||||
|
||||
<bean id="secondTestAspect" class="org.springframework.aop.aspectj.ProceedTests$ProceedTestingAspect">
|
||||
<property name="order" value="2"/>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="thisMatcher" ref="testAspect">
|
||||
<aop:before pointcut="execution(* *(..)) and this(java.io.Serializable)" method="toString"/>
|
||||
</aop:aspect>
|
||||
<aop:aspect id="targetMatcher" ref="testAspect">
|
||||
<aop:before pointcut="execution(* *(..)) and target(java.io.Serializable)" method="toString"/>
|
||||
</aop:aspect>
|
||||
<aop:aspect id="argsMatcher" ref="testAspect">
|
||||
<aop:before pointcut="execution(* bar(..)) and args(java.io.Serializable)" method="toString"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<!-- should not be proxied -->
|
||||
<bean id="testClassA" class="org.springframework.aop.aspectj.SubtypeMatchingTestClassA"/>
|
||||
|
||||
<!-- should be proxied -->
|
||||
<bean id="testClassB" class="org.springframework.aop.aspectj.SubtypeMatchingTestClassB"/>
|
||||
|
||||
<!-- should be proxied -->
|
||||
<bean id="testClassC" class="org.springframework.aop.aspectj.SubtypeMatchingTestClassC"/>
|
||||
|
||||
<bean id="testAspect" class="java.lang.Object"/>
|
||||
</beans>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
|
||||
<aop:advisor pointcut="target(org.springframework.aop.aspectj.TargetPointcutSelectionTests$TestImpl1)"
|
||||
advice-ref="testInterceptor"/>
|
||||
|
||||
<aop:aspect ref="testAspectForTestImpl1">
|
||||
<aop:before pointcut="target(org.springframework.aop.aspectj.TargetPointcutSelectionTests$TestImpl1)"
|
||||
method="increment"/>
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="testAspectForAbstractTestImpl">
|
||||
<aop:before pointcut="target(org.springframework.aop.aspectj.TargetPointcutSelectionTests$AbstractTestImpl)"
|
||||
method="increment"/>
|
||||
</aop:aspect>
|
||||
|
||||
</aop:config>
|
||||
|
||||
<bean id="testImpl1" class="org.springframework.aop.aspectj.TargetPointcutSelectionTests$TestImpl1"/>
|
||||
|
||||
<bean id="testImpl2" class="org.springframework.aop.aspectj.TargetPointcutSelectionTests$TestImpl2"/>
|
||||
|
||||
<bean id="testAspectForTestImpl1" class="org.springframework.aop.aspectj.TargetPointcutSelectionTests$TestAspect"/>
|
||||
|
||||
<bean id="testAspectForAbstractTestImpl" class="org.springframework.aop.aspectj.TargetPointcutSelectionTests$TestAspect"/>
|
||||
|
||||
<bean id="testInterceptor" class="org.springframework.aop.aspectj.TargetPointcutSelectionTests$TestInterceptor"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect ref="thisAsClassCounter">
|
||||
<aop:before method="increment"
|
||||
pointcut="this(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestImpl)" />
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="thisAsInterfaceCounter">
|
||||
<aop:before method="increment"
|
||||
pointcut="this(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestInterface)" />
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="targetAsClassCounter">
|
||||
<aop:before method="increment"
|
||||
pointcut="target(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestImpl)" />
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="targetAsInterfaceCounter">
|
||||
<aop:before method="increment"
|
||||
pointcut="target(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestInterface)" />
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="thisAsClassAndTargetAsClassCounter">
|
||||
<aop:before method="increment"
|
||||
pointcut="this(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestImpl) and target(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestImpl)" />
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="thisAsInterfaceAndTargetAsInterfaceCounter">
|
||||
<aop:before method="increment"
|
||||
pointcut="this(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestInterface) and target(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestInterface)" />
|
||||
</aop:aspect>
|
||||
|
||||
<aop:aspect ref="thisAsInterfaceAndTargetAsClassCounter">
|
||||
<aop:before method="increment"
|
||||
pointcut="this(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestInterface) and target(org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests.TestImpl)" />
|
||||
</aop:aspect>
|
||||
|
||||
</aop:config>
|
||||
|
||||
<bean id="thisAsClassCounter"
|
||||
class="org.springframework.aop.aspectj.Counter" />
|
||||
<bean id="thisAsInterfaceCounter"
|
||||
class="org.springframework.aop.aspectj.Counter" />
|
||||
<bean id="targetAsClassCounter"
|
||||
class="org.springframework.aop.aspectj.Counter" />
|
||||
<bean id="targetAsInterfaceCounter"
|
||||
class="org.springframework.aop.aspectj.Counter" />
|
||||
<bean id="thisAsClassAndTargetAsClassCounter"
|
||||
class="org.springframework.aop.aspectj.Counter" />
|
||||
<bean id="thisAsInterfaceAndTargetAsInterfaceCounter"
|
||||
class="org.springframework.aop.aspectj.Counter" />
|
||||
<bean id="thisAsInterfaceAndTargetAsClassCounter"
|
||||
class="org.springframework.aop.aspectj.Counter" />
|
||||
|
||||
<bean id="testBean" class="org.springframework.aop.aspectj.ThisAndTargetSelectionOnlyPointcutsTests$TestImpl" />
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<bean id="topsyTurvyAspect" class="org.springframework.aop.aspectj.TopsyTurvyAspect"/>
|
||||
|
||||
<bean id="topsyTurvyTarget" class="org.springframework.aop.aspectj.TopsyTurvyTargetImpl"/>
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="myAspect" ref="topsyTurvyAspect">
|
||||
<aop:before pointcut-ref="pc1"
|
||||
method="before"/>
|
||||
<aop:declare-parents
|
||||
types-matching="*..TopsyTurvyTarget+"
|
||||
implement-interface="java.io.Serializable"
|
||||
default-impl="org.springframework.aop.aspectj.SerializableMixin"/>
|
||||
<aop:after-returning pointcut-ref="pc2" method="afterReturning"/>
|
||||
<aop:pointcut id="pc1" expression="execution(* *..do*(..))"/>
|
||||
<aop:around pointcut-ref="pc2"
|
||||
method="around"/>
|
||||
<aop:pointcut id="pc2" expression="execution(* *..TopsyTurvyTarget+.get*(..))"/>
|
||||
<aop:declare-parents
|
||||
types-matching="*..TopsyTurvyTarget+"
|
||||
implement-interface="org.springframework.beans.factory.BeanNameAware"
|
||||
default-impl="org.springframework.aop.aspectj.BeanNameAwareMixin"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.factory.BeanCreationException;
|
||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AopNamespaceAdviceTypeTests extends TestCase {
|
||||
|
||||
private ApplicationContext context;
|
||||
|
||||
protected String getOKConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerAdviceTypeOKTests.xml";
|
||||
}
|
||||
|
||||
protected String getErrorConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerAdviceTypeErrorTests.xml";
|
||||
}
|
||||
|
||||
public void testParsingOfAdviceTypes() {
|
||||
this.context = new ClassPathXmlApplicationContext(getOKConfigLocation());
|
||||
}
|
||||
|
||||
public void testParsingOfAdviceTypesWithError() {
|
||||
try {
|
||||
this.context = new ClassPathXmlApplicationContext(getErrorConfigLocation());
|
||||
fail("Expected BeanDefinitionStoreException");
|
||||
}
|
||||
catch (BeanDefinitionStoreException ex) {
|
||||
assertTrue(ex.contains(SAXParseException.class));
|
||||
}
|
||||
}
|
||||
|
||||
protected ITestBean getTestBean() {
|
||||
return (ITestBean) this.context.getBean("testBean");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.factory.BeanCreationException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AopNamespaceHandlerArgNamesTests extends TestCase {
|
||||
|
||||
private ApplicationContext context;
|
||||
|
||||
protected String getOKConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerArgNamesOKTests.xml";
|
||||
}
|
||||
|
||||
protected String getErrorConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerArgNamesErrorTests.xml";
|
||||
}
|
||||
|
||||
public void testArgNamesOK() {
|
||||
this.context = new ClassPathXmlApplicationContext(getOKConfigLocation());
|
||||
}
|
||||
|
||||
public void testArgNamesError() {
|
||||
try {
|
||||
this.context = new ClassPathXmlApplicationContext(getErrorConfigLocation());
|
||||
fail("Expected BeanCreationException");
|
||||
}
|
||||
catch (BeanCreationException ex) {
|
||||
assertTrue(ex.contains(IllegalArgumentException.class));
|
||||
}
|
||||
}
|
||||
|
||||
protected ITestBean getTestBean() {
|
||||
return (ITestBean) this.context.getBean("testBean");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanReference;
|
||||
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
||||
import org.springframework.beans.factory.parsing.CollectingReaderEventListener;
|
||||
import org.springframework.beans.factory.parsing.ComponentDefinition;
|
||||
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
|
||||
/**
|
||||
* @author Rob Harrop
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class AopNamespaceHandlerEventTests extends TestCase {
|
||||
|
||||
private CollectingReaderEventListener eventListener = new CollectingReaderEventListener();
|
||||
|
||||
private XmlBeanDefinitionReader reader;
|
||||
|
||||
private DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
|
||||
|
||||
|
||||
protected void setUp() throws Exception {
|
||||
this.reader = new XmlBeanDefinitionReader(this.beanFactory);
|
||||
this.reader.setEventListener(this.eventListener);
|
||||
}
|
||||
|
||||
public void testPointcutEvents() throws Exception {
|
||||
loadBeansFrom("aopNamespaceHandlerPointcutEventTests.xml");
|
||||
ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
|
||||
assertEquals("Incorrect number of events fired", 1, componentDefinitions.length);
|
||||
assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
|
||||
|
||||
CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
|
||||
assertEquals("aop:config", compositeDef.getName());
|
||||
|
||||
ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
|
||||
assertEquals("Incorrect number of inner components", 2, nestedComponentDefs.length);
|
||||
PointcutComponentDefinition pcd = null;
|
||||
for (int i = 0; i < nestedComponentDefs.length; i++) {
|
||||
ComponentDefinition componentDefinition = nestedComponentDefs[i];
|
||||
if (componentDefinition instanceof PointcutComponentDefinition) {
|
||||
pcd = (PointcutComponentDefinition) componentDefinition;
|
||||
break;
|
||||
}
|
||||
}
|
||||
assertNotNull("PointcutComponentDefinition not found", pcd);
|
||||
assertEquals("Incorrect number of BeanDefinitions", 1, pcd.getBeanDefinitions().length);
|
||||
}
|
||||
|
||||
public void testAdvisorEventsWithPointcutRef() throws Exception {
|
||||
loadBeansFrom("aopNamespaceHandlerAdvisorWithPointcutRefEventTests.xml");
|
||||
ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
|
||||
assertEquals("Incorrect number of events fired", 2, componentDefinitions.length);
|
||||
|
||||
assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
|
||||
CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
|
||||
assertEquals("aop:config", compositeDef.getName());
|
||||
|
||||
ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
|
||||
assertEquals("Incorrect number of inner components", 3, nestedComponentDefs.length);
|
||||
AdvisorComponentDefinition acd = null;
|
||||
for (int i = 0; i < nestedComponentDefs.length; i++) {
|
||||
ComponentDefinition componentDefinition = nestedComponentDefs[i];
|
||||
if (componentDefinition instanceof AdvisorComponentDefinition) {
|
||||
acd = (AdvisorComponentDefinition) componentDefinition;
|
||||
break;
|
||||
}
|
||||
}
|
||||
assertNotNull("AdvisorComponentDefinition not found", acd);
|
||||
assertEquals(1, acd.getBeanDefinitions().length);
|
||||
assertEquals(2, acd.getBeanReferences().length);
|
||||
|
||||
assertTrue("No advice bean found", componentDefinitions[1] instanceof BeanComponentDefinition);
|
||||
BeanComponentDefinition adviceDef = (BeanComponentDefinition) componentDefinitions[1];
|
||||
assertEquals("countingAdvice", adviceDef.getBeanName());
|
||||
}
|
||||
|
||||
public void testAdvisorEventsWithDirectPointcut() throws Exception {
|
||||
loadBeansFrom("aopNamespaceHandlerAdvisorWithDirectPointcutEventTests.xml");
|
||||
ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
|
||||
assertEquals("Incorrect number of events fired", 2, componentDefinitions.length);
|
||||
|
||||
assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
|
||||
CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
|
||||
assertEquals("aop:config", compositeDef.getName());
|
||||
|
||||
ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
|
||||
assertEquals("Incorrect number of inner components", 2, nestedComponentDefs.length);
|
||||
AdvisorComponentDefinition acd = null;
|
||||
for (int i = 0; i < nestedComponentDefs.length; i++) {
|
||||
ComponentDefinition componentDefinition = nestedComponentDefs[i];
|
||||
if (componentDefinition instanceof AdvisorComponentDefinition) {
|
||||
acd = (AdvisorComponentDefinition) componentDefinition;
|
||||
break;
|
||||
}
|
||||
}
|
||||
assertNotNull("AdvisorComponentDefinition not found", acd);
|
||||
assertEquals(2, acd.getBeanDefinitions().length);
|
||||
assertEquals(1, acd.getBeanReferences().length);
|
||||
|
||||
assertTrue("No advice bean found", componentDefinitions[1] instanceof BeanComponentDefinition);
|
||||
BeanComponentDefinition adviceDef = (BeanComponentDefinition) componentDefinitions[1];
|
||||
assertEquals("countingAdvice", adviceDef.getBeanName());
|
||||
}
|
||||
|
||||
public void testAspectEvent() throws Exception {
|
||||
loadBeansFrom("aopNamespaceHandlerAspectEventTests.xml");
|
||||
ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
|
||||
assertEquals("Incorrect number of events fired", 5, componentDefinitions.length);
|
||||
|
||||
assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
|
||||
CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
|
||||
assertEquals("aop:config", compositeDef.getName());
|
||||
|
||||
ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
|
||||
assertEquals("Incorrect number of inner components", 2, nestedComponentDefs.length);
|
||||
AspectComponentDefinition acd = null;
|
||||
for (int i = 0; i < nestedComponentDefs.length; i++) {
|
||||
ComponentDefinition componentDefinition = nestedComponentDefs[i];
|
||||
if (componentDefinition instanceof AspectComponentDefinition) {
|
||||
acd = (AspectComponentDefinition) componentDefinition;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
assertNotNull("AspectComponentDefinition not found", acd);
|
||||
BeanDefinition[] beanDefinitions = acd.getBeanDefinitions();
|
||||
assertEquals(5, beanDefinitions.length);
|
||||
BeanReference[] beanReferences = acd.getBeanReferences();
|
||||
assertEquals(6, beanReferences.length);
|
||||
|
||||
Set expectedReferences = new HashSet();
|
||||
expectedReferences.add("pc");
|
||||
expectedReferences.add("countingAdvice");
|
||||
for (int i = 0; i < beanReferences.length; i++) {
|
||||
BeanReference beanReference = beanReferences[i];
|
||||
expectedReferences.remove(beanReference.getBeanName());
|
||||
}
|
||||
assertEquals("Incorrect references found", 0, expectedReferences.size());
|
||||
|
||||
for (int i = 1; i < componentDefinitions.length; i++) {
|
||||
assertTrue(componentDefinitions[i] instanceof BeanComponentDefinition);
|
||||
}
|
||||
|
||||
ComponentDefinition[] nestedComponentDefs2 = acd.getNestedComponents();
|
||||
assertEquals("Inner PointcutComponentDefinition not found", 1, nestedComponentDefs2.length);
|
||||
assertTrue(nestedComponentDefs2[0] instanceof PointcutComponentDefinition);
|
||||
PointcutComponentDefinition pcd = (PointcutComponentDefinition) nestedComponentDefs2[0];
|
||||
assertEquals("Incorrect number of BeanDefinitions", 1, pcd.getBeanDefinitions().length);
|
||||
}
|
||||
|
||||
private void loadBeansFrom(String path) {
|
||||
this.reader.loadBeanDefinitions(new ClassPathResource(path, getClass()));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
||||
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
|
||||
import org.springframework.beans.factory.xml.XmlBeanFactory;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
*/
|
||||
public class AopNamespaceHandlerPointcutErrorTests extends TestCase {
|
||||
|
||||
public void testDuplicatePointcutConfig() {
|
||||
try {
|
||||
new XmlBeanFactory(new ClassPathResource(
|
||||
"org/springframework/aop/config/aopNamespaceHandlerPointcutDuplicationTests.xml"));
|
||||
fail("parsing should have caused a BeanDefinitionStoreException");
|
||||
}
|
||||
catch (BeanDefinitionStoreException ex) {
|
||||
assertTrue(ex.contains(BeanDefinitionParsingException.class));
|
||||
}
|
||||
}
|
||||
|
||||
public void testMissingPointcutConfig() {
|
||||
try {
|
||||
new XmlBeanFactory(new ClassPathResource(
|
||||
"org/springframework/aop/config/aopNamespaceHandlerPointcutMissingTests.xml"));
|
||||
fail("parsing should have caused a BeanDefinitionStoreException");
|
||||
}
|
||||
catch (BeanDefinitionStoreException ex) {
|
||||
assertTrue(ex.contains(BeanDefinitionParsingException.class));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
import org.springframework.beans.ITestBean;
|
||||
|
||||
/**
|
||||
* @author Rob Harrop
|
||||
*/
|
||||
public class AopNamespaceHandlerProxyTargetClassTests extends AopNamespaceHandlerTests {
|
||||
|
||||
public void testIsClassProxy() {
|
||||
ITestBean bean = getTestBean();
|
||||
assertTrue("Should be a CGLIB proxy", AopUtils.isCglibProxy(bean));
|
||||
}
|
||||
|
||||
protected String getConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerProxyTargetClassTests.xml";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AopNamespaceHandlerReturningTests extends TestCase {
|
||||
|
||||
private ApplicationContext context;
|
||||
|
||||
protected String getOKConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerReturningOKTests.xml";
|
||||
}
|
||||
|
||||
protected String getErrorConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerReturningErrorTests.xml";
|
||||
}
|
||||
|
||||
public void testReturningOnReturningAdvice() {
|
||||
this.context = new ClassPathXmlApplicationContext(getOKConfigLocation());
|
||||
}
|
||||
|
||||
public void testParseReturningOnOtherAdviceType() {
|
||||
try {
|
||||
this.context = new ClassPathXmlApplicationContext(getErrorConfigLocation());
|
||||
fail("Expected BeanDefinitionStoreException");
|
||||
}
|
||||
catch (BeanDefinitionStoreException ex) {
|
||||
assertTrue(ex.contains(SAXParseException.class));
|
||||
}
|
||||
}
|
||||
|
||||
protected ITestBean getTestBean() {
|
||||
return (ITestBean) this.context.getBean("testBean");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.aop.framework.Advised;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.TestBean;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.MockHttpSession;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
import org.springframework.web.context.support.XmlWebApplicationContext;
|
||||
|
||||
/**
|
||||
* @author Rob Harrop
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class AopNamespaceHandlerScopeTests extends TestCase {
|
||||
|
||||
private ApplicationContext context;
|
||||
|
||||
public void setUp() {
|
||||
XmlWebApplicationContext wac = new XmlWebApplicationContext();
|
||||
wac.setConfigLocations(new String[] {"classpath:org/springframework/aop/config/aopNamespaceHandlerScopeTests.xml"});
|
||||
wac.refresh();
|
||||
this.context = wac;
|
||||
}
|
||||
|
||||
public void testRequestScoping() throws Exception {
|
||||
MockHttpServletRequest oldRequest = new MockHttpServletRequest();
|
||||
MockHttpServletRequest newRequest = new MockHttpServletRequest();
|
||||
|
||||
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(oldRequest));
|
||||
|
||||
ITestBean scoped = (ITestBean) this.context.getBean("requestScoped");
|
||||
assertTrue("Should be AOP proxy", AopUtils.isAopProxy(scoped));
|
||||
assertTrue("Should be target class proxy", scoped instanceof TestBean);
|
||||
|
||||
ITestBean testBean = (ITestBean) this.context.getBean("testBean");
|
||||
assertTrue("Should be AOP proxy", AopUtils.isAopProxy(testBean));
|
||||
assertFalse("Regular bean should be JDK proxy", testBean instanceof TestBean);
|
||||
|
||||
String rob = "Rob Harrop";
|
||||
String bram = "Bram Smeets";
|
||||
|
||||
assertEquals(rob, scoped.getName());
|
||||
scoped.setName(bram);
|
||||
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(newRequest));
|
||||
assertEquals(rob, scoped.getName());
|
||||
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(oldRequest));
|
||||
assertEquals(bram, scoped.getName());
|
||||
|
||||
assertTrue("Should have advisors", ((Advised) scoped).getAdvisors().length > 0);
|
||||
}
|
||||
|
||||
public void testSessionScoping() throws Exception {
|
||||
MockHttpSession oldSession = new MockHttpSession();
|
||||
MockHttpSession newSession = new MockHttpSession();
|
||||
|
||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||
request.setSession(oldSession);
|
||||
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
|
||||
|
||||
ITestBean scoped = (ITestBean) this.context.getBean("sessionScoped");
|
||||
assertTrue("Should be AOP proxy", AopUtils.isAopProxy(scoped));
|
||||
assertFalse("Should not be target class proxy", scoped instanceof TestBean);
|
||||
|
||||
ITestBean scopedAlias = (ITestBean) this.context.getBean("sessionScopedAlias");
|
||||
assertSame(scoped, scopedAlias);
|
||||
|
||||
ITestBean testBean = (ITestBean) this.context.getBean("testBean");
|
||||
assertTrue("Should be AOP proxy", AopUtils.isAopProxy(testBean));
|
||||
assertFalse("Regular bean should be JDK proxy", testBean instanceof TestBean);
|
||||
|
||||
String rob = "Rob Harrop";
|
||||
String bram = "Bram Smeets";
|
||||
|
||||
assertEquals(rob, scoped.getName());
|
||||
scoped.setName(bram);
|
||||
request.setSession(newSession);
|
||||
assertEquals(rob, scoped.getName());
|
||||
request.setSession(oldSession);
|
||||
assertEquals(bram, scoped.getName());
|
||||
|
||||
assertTrue("Should have advisors", ((Advised) scoped).getAdvisors().length > 0);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.springframework.aop.Advisor;
|
||||
import org.springframework.aop.framework.Advised;
|
||||
import org.springframework.aop.framework.CountingBeforeAdvice;
|
||||
import org.springframework.aop.support.AopUtils;
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
|
||||
/**
|
||||
* @author Rob Harrop
|
||||
*/
|
||||
public class AopNamespaceHandlerTests extends TestCase {
|
||||
|
||||
private ApplicationContext context;
|
||||
|
||||
public void setUp() {
|
||||
this.context = new ClassPathXmlApplicationContext(getConfigLocation());
|
||||
}
|
||||
|
||||
protected String getConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerTests.xml";
|
||||
}
|
||||
|
||||
public void testIsProxy() throws Exception {
|
||||
ITestBean bean = getTestBean();
|
||||
|
||||
assertTrue("Bean is not a proxy", AopUtils.isAopProxy(bean));
|
||||
|
||||
// check the advice details
|
||||
Advised advised = (Advised) bean;
|
||||
Advisor[] advisors = advised.getAdvisors();
|
||||
|
||||
assertTrue("Advisors should not be empty", advisors.length > 0);
|
||||
}
|
||||
|
||||
public void testAdviceInvokedCorrectly() throws Exception {
|
||||
CountingBeforeAdvice getAgeCounter = (CountingBeforeAdvice) this.context.getBean("getAgeCounter");
|
||||
CountingBeforeAdvice getNameCounter = (CountingBeforeAdvice) this.context.getBean("getNameCounter");
|
||||
|
||||
ITestBean bean = getTestBean();
|
||||
|
||||
assertEquals("Incorrect initial getAge count", 0, getAgeCounter.getCalls("getAge"));
|
||||
assertEquals("Incorrect initial getName count", 0, getNameCounter.getCalls("getName"));
|
||||
|
||||
bean.getAge();
|
||||
|
||||
assertEquals("Incorrect getAge count on getAge counter", 1, getAgeCounter.getCalls("getAge"));
|
||||
assertEquals("Incorrect getAge count on getName counter", 0, getNameCounter.getCalls("getAge"));
|
||||
|
||||
bean.getName();
|
||||
|
||||
assertEquals("Incorrect getName count on getName counter", 1, getNameCounter.getCalls("getName"));
|
||||
assertEquals("Incorrect getName count on getAge counter", 0, getAgeCounter.getCalls("getName"));
|
||||
}
|
||||
|
||||
public void testAspectApplied() throws Exception {
|
||||
ITestBean testBean = getTestBean();
|
||||
|
||||
CountingAspectJAdvice advice = (CountingAspectJAdvice) this.context.getBean("countingAdvice");
|
||||
|
||||
assertEquals("Incorrect before count", 0, advice.getBeforeCount());
|
||||
assertEquals("Incorrect after count", 0, advice.getAfterCount());
|
||||
|
||||
testBean.setName("Sally");
|
||||
|
||||
assertEquals("Incorrect before count", 1, advice.getBeforeCount());
|
||||
assertEquals("Incorrect after count", 1, advice.getAfterCount());
|
||||
|
||||
testBean.getName();
|
||||
|
||||
assertEquals("Incorrect before count", 1, advice.getBeforeCount());
|
||||
assertEquals("Incorrect after count", 1, advice.getAfterCount());
|
||||
}
|
||||
|
||||
protected ITestBean getTestBean() {
|
||||
return (ITestBean) this.context.getBean("testBean");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.beans.ITestBean;
|
||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
/**
|
||||
* @author Adrian Colyer
|
||||
*/
|
||||
public class AopNamespaceHandlerThrowingTests extends TestCase {
|
||||
|
||||
private ApplicationContext context;
|
||||
|
||||
protected String getOKConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerThrowingOKTests.xml";
|
||||
}
|
||||
|
||||
protected String getErrorConfigLocation() {
|
||||
return "org/springframework/aop/config/aopNamespaceHandlerThrowingErrorTests.xml";
|
||||
}
|
||||
|
||||
public void testThrowingOnThrowingAdvice() {
|
||||
this.context = new ClassPathXmlApplicationContext(getOKConfigLocation());
|
||||
}
|
||||
|
||||
public void testParseThrowingOnOtherAdviceType() {
|
||||
try {
|
||||
this.context = new ClassPathXmlApplicationContext(getErrorConfigLocation());
|
||||
fail("Expected BeanDefinitionStoreException");
|
||||
}
|
||||
catch (BeanDefinitionStoreException ex) {
|
||||
assertTrue(ex.contains(SAXParseException.class));
|
||||
}
|
||||
}
|
||||
|
||||
protected ITestBean getTestBean() {
|
||||
return (ITestBean) this.context.getBean("testBean");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright 2002-2005 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.springframework.beans.ITestBean;
|
||||
|
||||
/**
|
||||
* @author Rob Harrop
|
||||
*/
|
||||
public class CountingAspectJAdvice {
|
||||
|
||||
private int beforeCount;
|
||||
|
||||
private int afterCount;
|
||||
|
||||
private int aroundCount;
|
||||
|
||||
public void myBeforeAdvice() throws Throwable {
|
||||
this.beforeCount++;
|
||||
}
|
||||
|
||||
public void myAfterAdvice() throws Throwable {
|
||||
this.afterCount++;
|
||||
}
|
||||
|
||||
public void myAroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
|
||||
this.aroundCount++;
|
||||
pjp.proceed();
|
||||
}
|
||||
|
||||
public void myAfterReturningAdvice(int age) {
|
||||
this.afterCount++;
|
||||
}
|
||||
|
||||
public void myAfterThrowingAdvice(RuntimeException ex) {
|
||||
this.afterCount++;
|
||||
}
|
||||
|
||||
public void mySetAgeAdvice(int newAge, ITestBean bean) {
|
||||
// no-op
|
||||
}
|
||||
|
||||
public int getBeforeCount() {
|
||||
return this.beforeCount;
|
||||
}
|
||||
|
||||
public int getAfterCount() {
|
||||
return this.afterCount;
|
||||
}
|
||||
|
||||
public int getAroundCount() {
|
||||
return this.aroundCount;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,183 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.easymock.MockControl;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.mock.easymock.AbstractScalarMockTemplate;
|
||||
import org.springframework.test.AssertThrows;
|
||||
|
||||
/**
|
||||
* @author Rick Evans
|
||||
*/
|
||||
public final class MethodLocatingFactoryBeanTests extends TestCase {
|
||||
|
||||
private static final String BEAN_NAME = "string";
|
||||
|
||||
|
||||
public void testIsSingleton() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
assertTrue(factory.isSingleton());
|
||||
}
|
||||
|
||||
public void testGetObjectType() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
assertEquals(Method.class, factory.getObjectType());
|
||||
}
|
||||
|
||||
public void testWithNullTargetBeanName() throws Exception {
|
||||
new BeanFactoryScalarMockTemplate() {
|
||||
public void doTestInternal(final BeanFactory beanFactory) throws Exception {
|
||||
new AssertThrows(IllegalArgumentException.class) {
|
||||
public void test() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
factory.setMethodName("toString()");
|
||||
factory.setBeanFactory(beanFactory);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
}.test();
|
||||
}
|
||||
|
||||
public void testWithEmptyTargetBeanName() throws Exception {
|
||||
new BeanFactoryScalarMockTemplate() {
|
||||
public void doTestInternal(final BeanFactory beanFactory) throws Exception {
|
||||
new AssertThrows(IllegalArgumentException.class) {
|
||||
public void test() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
factory.setTargetBeanName("");
|
||||
factory.setMethodName("toString()");
|
||||
factory.setBeanFactory(beanFactory);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
}.test();
|
||||
}
|
||||
|
||||
public void testWithNullTargetMethodName() throws Exception {
|
||||
new BeanFactoryScalarMockTemplate() {
|
||||
public void doTestInternal(final BeanFactory beanFactory) throws Exception {
|
||||
new AssertThrows(IllegalArgumentException.class) {
|
||||
public void test() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
factory.setTargetBeanName(BEAN_NAME);
|
||||
factory.setBeanFactory(beanFactory);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
}.test();
|
||||
}
|
||||
|
||||
public void testWithEmptyTargetMethodName() throws Exception {
|
||||
new BeanFactoryScalarMockTemplate() {
|
||||
public void doTestInternal(final BeanFactory beanFactory) throws Exception {
|
||||
new AssertThrows(IllegalArgumentException.class) {
|
||||
public void test() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
factory.setTargetBeanName(BEAN_NAME);
|
||||
factory.setMethodName("");
|
||||
factory.setBeanFactory(beanFactory);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
}.test();
|
||||
}
|
||||
|
||||
public void testWhenTargetBeanClassCannotBeResolved() throws Exception {
|
||||
new BeanFactoryScalarMockTemplate() {
|
||||
protected void setupBeanFactoryExpectations(MockControl mockControl, BeanFactory beanFactory) throws Exception {
|
||||
beanFactory.getType(BEAN_NAME);
|
||||
mockControl.setReturnValue(null);
|
||||
}
|
||||
protected void doTestInternal(final BeanFactory beanFactory) throws Exception {
|
||||
new AssertThrows(IllegalArgumentException.class) {
|
||||
public void test() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
factory.setTargetBeanName(BEAN_NAME);
|
||||
factory.setMethodName("toString()");
|
||||
factory.setBeanFactory(beanFactory);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
}.test();
|
||||
}
|
||||
|
||||
public void testSunnyDayPath() throws Exception {
|
||||
new BeanFactoryScalarMockTemplate() {
|
||||
protected void setupBeanFactoryExpectations(MockControl mockControl, BeanFactory beanFactory) throws Exception {
|
||||
beanFactory.getType(BEAN_NAME);
|
||||
mockControl.setReturnValue(String.class);
|
||||
}
|
||||
protected void doTestInternal(final BeanFactory beanFactory) throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
factory.setTargetBeanName(BEAN_NAME);
|
||||
factory.setMethodName("toString()");
|
||||
factory.setBeanFactory(beanFactory);
|
||||
Object result = factory.getObject();
|
||||
assertNotNull(result);
|
||||
assertTrue(result instanceof Method);
|
||||
Method method = (Method) result;
|
||||
assertEquals("Bingo", method.invoke("Bingo", new Object[]{}));
|
||||
}
|
||||
}.test();
|
||||
}
|
||||
|
||||
public void testWhereMethodCannotBeResolved() throws Exception {
|
||||
new BeanFactoryScalarMockTemplate() {
|
||||
protected void setupBeanFactoryExpectations(MockControl mockControl, BeanFactory beanFactory) throws Exception {
|
||||
beanFactory.getType(BEAN_NAME);
|
||||
mockControl.setReturnValue(String.class);
|
||||
}
|
||||
protected void doTestInternal(final BeanFactory beanFactory) throws Exception {
|
||||
new AssertThrows(IllegalArgumentException.class) {
|
||||
public void test() throws Exception {
|
||||
MethodLocatingFactoryBean factory = new MethodLocatingFactoryBean();
|
||||
factory.setTargetBeanName(BEAN_NAME);
|
||||
factory.setMethodName("loadOfOld()");
|
||||
factory.setBeanFactory(beanFactory);
|
||||
}
|
||||
}.runTest();
|
||||
}
|
||||
}.test();
|
||||
}
|
||||
|
||||
|
||||
private static abstract class BeanFactoryScalarMockTemplate extends AbstractScalarMockTemplate {
|
||||
|
||||
public BeanFactoryScalarMockTemplate() {
|
||||
super(BeanFactory.class);
|
||||
}
|
||||
|
||||
public void setupExpectations(MockControl mockControl, Object mockObject) throws Exception {
|
||||
setupBeanFactoryExpectations(mockControl, (BeanFactory) mockObject);
|
||||
}
|
||||
|
||||
public void doTest(Object mockObject) throws Exception {
|
||||
doTestInternal((BeanFactory) mockObject);
|
||||
}
|
||||
|
||||
protected void setupBeanFactoryExpectations(MockControl mockControl, BeanFactory beanFactory) throws Exception {
|
||||
}
|
||||
|
||||
protected abstract void doTestInternal(final BeanFactory beanFactory) throws Exception;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class PrototypeProxyTests extends TestCase {
|
||||
|
||||
public void testInjectionBeforeWrappingCheckDoesNotKickInForPrototypeProxy() {
|
||||
new ClassPathXmlApplicationContext("prototypeProxy.xml", getClass());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 2002-2006 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.aop.config;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
|
||||
/**
|
||||
* Tests that the <aop:config/> element can be used as a top level element.
|
||||
*
|
||||
* @author Rob Harrop
|
||||
*/
|
||||
public final class TopLevelAopTagTests extends TestCase {
|
||||
|
||||
public void testParse() throws Exception {
|
||||
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
|
||||
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
|
||||
reader.loadBeanDefinitions(new ClassPathResource("topLevelAop.xml", getClass()));
|
||||
|
||||
assertTrue(beanFactory.containsBeanDefinition("testPointcut"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:pointcut id="pc" expression="execution(* getAge())"/>
|
||||
<aop:before pointcut-ref="pc" method="myBeforeAdvice" returning="age" />
|
||||
</aop:aspect>
|
||||
</aop:aspect>
|
||||
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:pointcut id="pc" expression="execution(* getAge())"/>
|
||||
<aop:before pointcut-ref="pc" method="myBeforeAdvice" />
|
||||
<aop:after pointcut-ref="pc" method="myAfterAdvice" />
|
||||
<aop:after-returning pointcut-ref="pc" method="myAfterReturningAdvice" returning="age"/>
|
||||
<aop:after-throwing pointcut-ref="pc" method="myAfterThrowingAdvice" throwing="ex"/>
|
||||
<aop:around pointcut-ref="pc" method="myAroundAdvice"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:advisor advice-ref="countingAdvice" pointcut="within(org.springframework..*)"/>
|
||||
</aop:config>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:pointcut id="pc" expression="within(org.springframework..*)"/>
|
||||
<aop:advisor advice-ref="countingAdvice" pointcut-ref="pc"/>
|
||||
</aop:config>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:before pointcut="execution(* setAge(..)) and args(age) and this(bean)"
|
||||
method="mySetAgeAdvice" arg-names="age bean"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:before pointcut="execution(* setAge(..)) and args(age) and this(bean)"
|
||||
method="mySetAgeAdvice" arg-names="age,bean"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:pointcut id="pc" expression="execution(* getAge())"/>
|
||||
<aop:before pointcut-ref="pc" method="myBeforeAdvice" />
|
||||
<aop:after pointcut-ref="pc" method="myAfterAdvice" />
|
||||
<aop:after-returning pointcut-ref="pc" method="myAfterReturningAdvice" returning="age"/>
|
||||
<aop:after-throwing pointcut-ref="pc" method="myAfterThrowingAdvice" throwing="ex"/>
|
||||
<aop:around pointcut-ref="pc" method="myAroundAdvice"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:pointcut id="pc" expression="execution(* getAge())"/>
|
||||
<aop:before pointcut-ref="pc" pointcut="execution(* getAge())" method="myBeforeAdvice"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:pointcut id="myPointcut" expression="within(org.springframework..*)"/>
|
||||
</aop:config>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:pointcut id="pc" expression="execution(* getAge())"/>
|
||||
<aop:before method="myBeforeAdvice" />
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config proxy-target-class="true">
|
||||
<aop:pointcut id="getNameCalls" expression="execution(* getName(..)) and within(*..ITestBean+)"/>
|
||||
<aop:advisor id="getAgeAdvisor" pointcut="execution(* *..ITestBean.getAge(..))" advice-ref="getAgeCounter"/>
|
||||
<aop:advisor id="getNameAdvisor" pointcut-ref="getNameCalls" advice-ref="getNameCounter"/>
|
||||
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:pointcut id="setCalls" expression="execution(* *..ITestBean.set*(..))"/>
|
||||
<aop:before pointcut="execution(* *..ITestBean.set*(..))" method="myBeforeAdvice"/>
|
||||
<aop:after pointcut-ref="setCalls" method="myAfterAdvice"/>
|
||||
<aop:around pointcut-ref="setCalls" method="myAroundAdvice"/>
|
||||
</aop:aspect>
|
||||
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:after pointcut="execution(int getAge(..))" method="myAfterAdvice" returning="age"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:aspect id="countAgeCalls" ref="countingAdvice">
|
||||
<aop:after-returning pointcut="execution(int getAge(..))" method="myAfterReturningAdvice" returning="age"/>
|
||||
</aop:aspect>
|
||||
</aop:config>
|
||||
|
||||
<bean id="getNameCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="getAgeCounter" class="org.springframework.aop.framework.CountingBeforeAdvice"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="countingAdvice" class="org.springframework.aop.config.CountingAspectJAdvice"/>
|
||||
|
||||
</beans>
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
|
||||
|
||||
<aop:config>
|
||||
<aop:advisor advice-ref="advice" pointcut="execution(* *..ITestBean.*(..))"/>
|
||||
</aop:config>
|
||||
|
||||
<bean id="advice" class="org.springframework.aop.interceptor.DebugInterceptor"/>
|
||||
|
||||
<bean id="testBean" class="org.springframework.beans.TestBean"/>
|
||||
|
||||
<bean id="requestScoped" class="org.springframework.beans.TestBean" scope="request">
|
||||
<aop:scoped-proxy/>
|
||||
<property name="name" value="Rob Harrop"/>
|
||||
</bean>
|
||||
|
||||
<bean id="sessionScoped" name="sessionScopedAlias" class="org.springframework.beans.TestBean" scope="session">
|
||||
<aop:scoped-proxy proxy-target-class="false"/>
|
||||
<property name="name" value="Rob Harrop"/>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user