Browse Source
Had to override the test.do definition in build.xml. Need to consult the spring-build team to add the change to spring-build itself. Since classes in test sources from another project cannot be shared, had to duplicate those classes.pull/23217/head
26 changed files with 2216 additions and 17 deletions
@ -1,15 +1,19 @@
@@ -1,15 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<classpath> |
||||
<classpathentry kind="src" path="src/main/java"/> |
||||
<classpathentry kind="src" path="src/main/resources"/> |
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/> |
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/resources"/> |
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.beans"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.transaction"/> |
||||
<classpathentry kind="var" path="IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-1.1.1.jar" sourcepath="/IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-sources-1.1.1.jar"/> |
||||
<classpathentry kind="con" path="org.eclipse.ajdt.core.ASPECTJRT_CONTAINER"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.core"/> |
||||
<classpathentry kind="var" path="IVY_CACHE/org.aspectj/com.springsource.org.aspectj.weaver/1.6.2.RELEASE/com.springsource.org.aspectj.weaver-1.6.2.RELEASE.jar" sourcepath="/IVY_CACHE/org.aspectj/com.springsource.org.aspectj.weaver/1.6.2.RELEASE/com.springsource.org.aspectj.weaver-sources-1.6.2.RELEASE.jar"/> |
||||
<classpathentry kind="output" path="target/classes"/> |
||||
</classpath> |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<classpath> |
||||
<classpathentry kind="src" path="src/main/java"/> |
||||
<classpathentry kind="src" path="src/main/resources"/> |
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/> |
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/resources"/> |
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.beans"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.transaction"/> |
||||
<classpathentry kind="var" path="IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-1.1.1.jar" sourcepath="/IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-sources-1.1.1.jar"/> |
||||
<classpathentry kind="con" path="org.eclipse.ajdt.core.ASPECTJRT_CONTAINER"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.core"/> |
||||
<classpathentry kind="var" path="IVY_CACHE/org.aspectj/com.springsource.org.aspectj.weaver/1.6.2.RELEASE/com.springsource.org.aspectj.weaver-1.6.2.RELEASE.jar" sourcepath="/IVY_CACHE/org.aspectj/com.springsource.org.aspectj.weaver/1.6.2.RELEASE/com.springsource.org.aspectj.weaver-sources-1.6.2.RELEASE.jar"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.test"/> |
||||
<classpathentry kind="var" path="IVY_CACHE/org.junit/com.springsource.org.junit/4.6.0/com.springsource.org.junit-4.6.0.jar" sourcepath="/IVY_CACHE/org.junit/com.springsource.org.junit/4.6.0/com.springsource.org.junit-sources-4.6.0.jar"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.context"/> |
||||
<classpathentry combineaccessrules="false" kind="src" path="/org.springframework.context.support"/> |
||||
<classpathentry kind="output" path="target/classes"/> |
||||
</classpath> |
||||
|
||||
@ -0,0 +1,32 @@
@@ -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.autoproxy; |
||||
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext; |
||||
|
||||
import junit.framework.TestCase; |
||||
|
||||
/** |
||||
* @author Adrian Colyer |
||||
*/ |
||||
public class AutoProxyWithCodeStyleAspectsTests extends TestCase { |
||||
|
||||
public void testNoAutoproxyingOfAjcCompiledAspects() { |
||||
new ClassPathXmlApplicationContext("org/springframework/aop/aspectj/autoproxy/ajcAutoproxyTests.xml"); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
/* |
||||
* 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.annotation.Aspect; |
||||
|
||||
/** |
||||
* @author Adrian Colyer |
||||
*/ |
||||
@Aspect |
||||
public aspect CodeStyleAspect { |
||||
|
||||
private String foo; |
||||
|
||||
pointcut somePC() : call(* someMethod()); |
||||
|
||||
before() : somePC() { |
||||
System.out.println("match"); |
||||
} |
||||
|
||||
public void setFoo(String foo) { |
||||
this.foo = foo; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
<?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:aspectj-autoproxy/> |
||||
|
||||
<bean id="myAspect" class="org.springframework.aop.aspectj.autoproxy.CodeStyleAspect" |
||||
factory-method="aspectOf"> |
||||
<property name="foo" value="bar"/> |
||||
</bean> |
||||
|
||||
<bean id="otherBean" class="java.lang.Object"/> |
||||
|
||||
</beans> |
||||
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
import org.springframework.core.enums.ShortCodedLabeledEnum; |
||||
|
||||
/** |
||||
* @author Rob Harrop |
||||
*/ |
||||
public class Colour extends ShortCodedLabeledEnum { |
||||
|
||||
public static final Colour RED = new Colour(0, "RED"); |
||||
public static final Colour BLUE = new Colour(1, "BLUE"); |
||||
public static final Colour GREEN = new Colour(2, "GREEN"); |
||||
public static final Colour PURPLE = new Colour(3, "PURPLE"); |
||||
|
||||
private Colour(int code, String label) { |
||||
super(code, label); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
import org.springframework.beans.factory.BeanNameAware; |
||||
import org.springframework.beans.factory.DisposableBean; |
||||
|
||||
/** |
||||
* @author Juergen Hoeller |
||||
* @since 21.08.2003 |
||||
*/ |
||||
public class DerivedTestBean extends TestBean implements Serializable, BeanNameAware, DisposableBean { |
||||
|
||||
private String beanName; |
||||
|
||||
private boolean initialized; |
||||
|
||||
private boolean destroyed; |
||||
|
||||
|
||||
public DerivedTestBean() { |
||||
} |
||||
|
||||
public DerivedTestBean(String[] names) { |
||||
if (names == null || names.length < 2) { |
||||
throw new IllegalArgumentException("Invalid names array"); |
||||
} |
||||
setName(names[0]); |
||||
setBeanName(names[1]); |
||||
} |
||||
|
||||
public static DerivedTestBean create(String[] names) { |
||||
return new DerivedTestBean(names); |
||||
} |
||||
|
||||
|
||||
public void setBeanName(String beanName) { |
||||
if (this.beanName == null || beanName == null) { |
||||
this.beanName = beanName; |
||||
} |
||||
} |
||||
|
||||
public String getBeanName() { |
||||
return beanName; |
||||
} |
||||
|
||||
public void setSpouseRef(String name) { |
||||
setSpouse(new TestBean(name)); |
||||
} |
||||
|
||||
|
||||
public void initialize() { |
||||
this.initialized = true; |
||||
} |
||||
|
||||
public boolean wasInitialized() { |
||||
return initialized; |
||||
} |
||||
|
||||
|
||||
public void destroy() { |
||||
this.destroyed = true; |
||||
} |
||||
|
||||
public boolean wasDestroyed() { |
||||
return destroyed; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
public interface INestedTestBean { |
||||
|
||||
public String getCompany(); |
||||
|
||||
} |
||||
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
public interface IOther { |
||||
|
||||
void absquatulate(); |
||||
|
||||
} |
||||
@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* Interface used for {@link org.springframework.beans.TestBean}. |
||||
* |
||||
* <p>Two methods are the same as on Person, but if this |
||||
* extends person it breaks quite a few tests.. |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
*/ |
||||
public interface ITestBean { |
||||
|
||||
int getAge(); |
||||
|
||||
void setAge(int age); |
||||
|
||||
String getName(); |
||||
|
||||
void setName(String name); |
||||
|
||||
ITestBean getSpouse(); |
||||
|
||||
void setSpouse(ITestBean spouse); |
||||
|
||||
ITestBean[] getSpouses(); |
||||
|
||||
String[] getStringArray(); |
||||
|
||||
void setStringArray(String[] stringArray); |
||||
|
||||
/** |
||||
* Throws a given (non-null) exception. |
||||
*/ |
||||
void exceptional(Throwable t) throws Throwable; |
||||
|
||||
Object returnsThis(); |
||||
|
||||
INestedTestBean getDoctor(); |
||||
|
||||
INestedTestBean getLawyer(); |
||||
|
||||
IndexedTestBean getNestedIndexedBean(); |
||||
|
||||
/** |
||||
* Increment the age by one. |
||||
* @return the previous age |
||||
*/ |
||||
int haveBirthday(); |
||||
|
||||
void unreliableFileOperation() throws IOException; |
||||
|
||||
} |
||||
@ -0,0 +1,145 @@
@@ -0,0 +1,145 @@
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Collection; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.SortedMap; |
||||
import java.util.SortedSet; |
||||
import java.util.TreeSet; |
||||
|
||||
/** |
||||
* @author Juergen Hoeller |
||||
* @since 11.11.2003 |
||||
*/ |
||||
public class IndexedTestBean { |
||||
|
||||
private TestBean[] array; |
||||
|
||||
private Collection collection; |
||||
|
||||
private List list; |
||||
|
||||
private Set set; |
||||
|
||||
private SortedSet sortedSet; |
||||
|
||||
private Map map; |
||||
|
||||
private SortedMap sortedMap; |
||||
|
||||
|
||||
public IndexedTestBean() { |
||||
this(true); |
||||
} |
||||
|
||||
public IndexedTestBean(boolean populate) { |
||||
if (populate) { |
||||
populate(); |
||||
} |
||||
} |
||||
|
||||
public void populate() { |
||||
TestBean tb0 = new TestBean("name0", 0); |
||||
TestBean tb1 = new TestBean("name1", 0); |
||||
TestBean tb2 = new TestBean("name2", 0); |
||||
TestBean tb3 = new TestBean("name3", 0); |
||||
TestBean tb4 = new TestBean("name4", 0); |
||||
TestBean tb5 = new TestBean("name5", 0); |
||||
TestBean tb6 = new TestBean("name6", 0); |
||||
TestBean tb7 = new TestBean("name7", 0); |
||||
TestBean tbX = new TestBean("nameX", 0); |
||||
TestBean tbY = new TestBean("nameY", 0); |
||||
this.array = new TestBean[] {tb0, tb1}; |
||||
this.list = new ArrayList(); |
||||
this.list.add(tb2); |
||||
this.list.add(tb3); |
||||
this.set = new TreeSet(); |
||||
this.set.add(tb6); |
||||
this.set.add(tb7); |
||||
this.map = new HashMap(); |
||||
this.map.put("key1", tb4); |
||||
this.map.put("key2", tb5); |
||||
this.map.put("key.3", tb5); |
||||
List list = new ArrayList(); |
||||
list.add(tbX); |
||||
list.add(tbY); |
||||
this.map.put("key4", list); |
||||
} |
||||
|
||||
|
||||
public TestBean[] getArray() { |
||||
return array; |
||||
} |
||||
|
||||
public void setArray(TestBean[] array) { |
||||
this.array = array; |
||||
} |
||||
|
||||
public Collection getCollection() { |
||||
return collection; |
||||
} |
||||
|
||||
public void setCollection(Collection collection) { |
||||
this.collection = collection; |
||||
} |
||||
|
||||
public List getList() { |
||||
return list; |
||||
} |
||||
|
||||
public void setList(List list) { |
||||
this.list = list; |
||||
} |
||||
|
||||
public Set getSet() { |
||||
return set; |
||||
} |
||||
|
||||
public void setSet(Set set) { |
||||
this.set = set; |
||||
} |
||||
|
||||
public SortedSet getSortedSet() { |
||||
return sortedSet; |
||||
} |
||||
|
||||
public void setSortedSet(SortedSet sortedSet) { |
||||
this.sortedSet = sortedSet; |
||||
} |
||||
|
||||
public Map getMap() { |
||||
return map; |
||||
} |
||||
|
||||
public void setMap(Map map) { |
||||
this.map = map; |
||||
} |
||||
|
||||
public SortedMap getSortedMap() { |
||||
return sortedMap; |
||||
} |
||||
|
||||
public void setSortedMap(SortedMap sortedMap) { |
||||
this.sortedMap = sortedMap; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
/** |
||||
* Simple nested test bean used for testing bean factories, AOP framework etc. |
||||
* |
||||
* @author Trevor D. Cook |
||||
* @since 30.09.2003 |
||||
*/ |
||||
public class NestedTestBean implements INestedTestBean { |
||||
|
||||
private String company = ""; |
||||
|
||||
public NestedTestBean() { |
||||
} |
||||
|
||||
public NestedTestBean(String company) { |
||||
setCompany(company); |
||||
} |
||||
|
||||
public void setCompany(String company) { |
||||
this.company = (company != null ? company : ""); |
||||
} |
||||
|
||||
public String getCompany() { |
||||
return company; |
||||
} |
||||
|
||||
public boolean equals(Object obj) { |
||||
if (!(obj instanceof NestedTestBean)) { |
||||
return false; |
||||
} |
||||
NestedTestBean ntb = (NestedTestBean) obj; |
||||
return this.company.equals(ntb.company); |
||||
} |
||||
|
||||
public int hashCode() { |
||||
return this.company.hashCode(); |
||||
} |
||||
|
||||
public String toString() { |
||||
return "NestedTestBean: " + this.company; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,437 @@
@@ -0,0 +1,437 @@
|
||||
/* |
||||
* 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.beans; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.Collection; |
||||
import java.util.Date; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Properties; |
||||
import java.util.Set; |
||||
|
||||
import org.springframework.beans.factory.BeanFactory; |
||||
import org.springframework.beans.factory.BeanFactoryAware; |
||||
import org.springframework.beans.factory.BeanNameAware; |
||||
import org.springframework.util.ObjectUtils; |
||||
|
||||
/** |
||||
* Simple test bean used for testing bean factories, the AOP framework etc. |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
* @since 15 April 2001 |
||||
*/ |
||||
public class TestBean implements BeanNameAware, BeanFactoryAware, ITestBean, IOther, Comparable { |
||||
|
||||
private String beanName; |
||||
|
||||
private String country; |
||||
|
||||
private BeanFactory beanFactory; |
||||
|
||||
private boolean postProcessed; |
||||
|
||||
private String name; |
||||
|
||||
private String sex; |
||||
|
||||
private int age; |
||||
|
||||
private boolean jedi; |
||||
|
||||
private ITestBean[] spouses; |
||||
|
||||
private String touchy; |
||||
|
||||
private String[] stringArray; |
||||
|
||||
private Integer[] someIntegerArray; |
||||
|
||||
private Date date = new Date(); |
||||
|
||||
private Float myFloat = new Float(0.0); |
||||
|
||||
private Collection friends = new LinkedList(); |
||||
|
||||
private Set someSet = new HashSet(); |
||||
|
||||
private Map someMap = new HashMap(); |
||||
|
||||
private List someList = new ArrayList(); |
||||
|
||||
private Properties someProperties = new Properties(); |
||||
|
||||
private INestedTestBean doctor = new NestedTestBean(); |
||||
|
||||
private INestedTestBean lawyer = new NestedTestBean(); |
||||
|
||||
private IndexedTestBean nestedIndexedBean; |
||||
|
||||
private boolean destroyed; |
||||
|
||||
private Number someNumber; |
||||
|
||||
private Colour favouriteColour; |
||||
|
||||
private Boolean someBoolean; |
||||
|
||||
private List otherColours; |
||||
|
||||
private List pets; |
||||
|
||||
|
||||
public TestBean() { |
||||
} |
||||
|
||||
public TestBean(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public TestBean(ITestBean spouse) { |
||||
this.spouses = new ITestBean[] {spouse}; |
||||
} |
||||
|
||||
public TestBean(String name, int age) { |
||||
this.name = name; |
||||
this.age = age; |
||||
} |
||||
|
||||
public TestBean(ITestBean spouse, Properties someProperties) { |
||||
this.spouses = new ITestBean[] {spouse}; |
||||
this.someProperties = someProperties; |
||||
} |
||||
|
||||
public TestBean(List someList) { |
||||
this.someList = someList; |
||||
} |
||||
|
||||
public TestBean(Set someSet) { |
||||
this.someSet = someSet; |
||||
} |
||||
|
||||
public TestBean(Map someMap) { |
||||
this.someMap = someMap; |
||||
} |
||||
|
||||
public TestBean(Properties someProperties) { |
||||
this.someProperties = someProperties; |
||||
} |
||||
|
||||
|
||||
public void setBeanName(String beanName) { |
||||
this.beanName = beanName; |
||||
} |
||||
|
||||
public String getBeanName() { |
||||
return beanName; |
||||
} |
||||
|
||||
public void setBeanFactory(BeanFactory beanFactory) { |
||||
this.beanFactory = beanFactory; |
||||
} |
||||
|
||||
public BeanFactory getBeanFactory() { |
||||
return beanFactory; |
||||
} |
||||
|
||||
public void setPostProcessed(boolean postProcessed) { |
||||
this.postProcessed = postProcessed; |
||||
} |
||||
|
||||
public boolean isPostProcessed() { |
||||
return postProcessed; |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getSex() { |
||||
return sex; |
||||
} |
||||
|
||||
public void setSex(String sex) { |
||||
this.sex = sex; |
||||
if (this.name == null) { |
||||
this.name = sex; |
||||
} |
||||
} |
||||
|
||||
public int getAge() { |
||||
return age; |
||||
} |
||||
|
||||
public void setAge(int age) { |
||||
this.age = age; |
||||
} |
||||
|
||||
public boolean isJedi() { |
||||
return jedi; |
||||
} |
||||
|
||||
public void setJedi(boolean jedi) { |
||||
this.jedi = jedi; |
||||
} |
||||
|
||||
public ITestBean getSpouse() { |
||||
return (spouses != null ? spouses[0] : null); |
||||
} |
||||
|
||||
public void setSpouse(ITestBean spouse) { |
||||
this.spouses = new ITestBean[] {spouse}; |
||||
} |
||||
|
||||
public ITestBean[] getSpouses() { |
||||
return spouses; |
||||
} |
||||
|
||||
public String getTouchy() { |
||||
return touchy; |
||||
} |
||||
|
||||
public void setTouchy(String touchy) throws Exception { |
||||
if (touchy.indexOf('.') != -1) { |
||||
throw new Exception("Can't contain a ."); |
||||
} |
||||
if (touchy.indexOf(',') != -1) { |
||||
throw new NumberFormatException("Number format exception: contains a ,"); |
||||
} |
||||
this.touchy = touchy; |
||||
} |
||||
|
||||
public String getCountry() { |
||||
return country; |
||||
} |
||||
|
||||
public void setCountry(String country) { |
||||
this.country = country; |
||||
} |
||||
|
||||
public String[] getStringArray() { |
||||
return stringArray; |
||||
} |
||||
|
||||
public void setStringArray(String[] stringArray) { |
||||
this.stringArray = stringArray; |
||||
} |
||||
|
||||
public Integer[] getSomeIntegerArray() { |
||||
return someIntegerArray; |
||||
} |
||||
|
||||
public void setSomeIntegerArray(Integer[] someIntegerArray) { |
||||
this.someIntegerArray = someIntegerArray; |
||||
} |
||||
|
||||
public Date getDate() { |
||||
return date; |
||||
} |
||||
|
||||
public void setDate(Date date) { |
||||
this.date = date; |
||||
} |
||||
|
||||
public Float getMyFloat() { |
||||
return myFloat; |
||||
} |
||||
|
||||
public void setMyFloat(Float myFloat) { |
||||
this.myFloat = myFloat; |
||||
} |
||||
|
||||
public Collection getFriends() { |
||||
return friends; |
||||
} |
||||
|
||||
public void setFriends(Collection friends) { |
||||
this.friends = friends; |
||||
} |
||||
|
||||
public Set getSomeSet() { |
||||
return someSet; |
||||
} |
||||
|
||||
public void setSomeSet(Set someSet) { |
||||
this.someSet = someSet; |
||||
} |
||||
|
||||
public Map getSomeMap() { |
||||
return someMap; |
||||
} |
||||
|
||||
public void setSomeMap(Map someMap) { |
||||
this.someMap = someMap; |
||||
} |
||||
|
||||
public List getSomeList() { |
||||
return someList; |
||||
} |
||||
|
||||
public void setSomeList(List someList) { |
||||
this.someList = someList; |
||||
} |
||||
|
||||
public Properties getSomeProperties() { |
||||
return someProperties; |
||||
} |
||||
|
||||
public void setSomeProperties(Properties someProperties) { |
||||
this.someProperties = someProperties; |
||||
} |
||||
|
||||
public INestedTestBean getDoctor() { |
||||
return doctor; |
||||
} |
||||
|
||||
public void setDoctor(INestedTestBean doctor) { |
||||
this.doctor = doctor; |
||||
} |
||||
|
||||
public INestedTestBean getLawyer() { |
||||
return lawyer; |
||||
} |
||||
|
||||
public void setLawyer(INestedTestBean lawyer) { |
||||
this.lawyer = lawyer; |
||||
} |
||||
|
||||
public Number getSomeNumber() { |
||||
return someNumber; |
||||
} |
||||
|
||||
public void setSomeNumber(Number someNumber) { |
||||
this.someNumber = someNumber; |
||||
} |
||||
|
||||
public Colour getFavouriteColour() { |
||||
return favouriteColour; |
||||
} |
||||
|
||||
public void setFavouriteColour(Colour favouriteColour) { |
||||
this.favouriteColour = favouriteColour; |
||||
} |
||||
|
||||
public Boolean getSomeBoolean() { |
||||
return someBoolean; |
||||
} |
||||
|
||||
public void setSomeBoolean(Boolean someBoolean) { |
||||
this.someBoolean = someBoolean; |
||||
} |
||||
|
||||
public IndexedTestBean getNestedIndexedBean() { |
||||
return nestedIndexedBean; |
||||
} |
||||
|
||||
public void setNestedIndexedBean(IndexedTestBean nestedIndexedBean) { |
||||
this.nestedIndexedBean = nestedIndexedBean; |
||||
} |
||||
|
||||
public List getOtherColours() { |
||||
return otherColours; |
||||
} |
||||
|
||||
public void setOtherColours(List otherColours) { |
||||
this.otherColours = otherColours; |
||||
} |
||||
|
||||
public List getPets() { |
||||
return pets; |
||||
} |
||||
|
||||
public void setPets(List pets) { |
||||
this.pets = pets; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @see org.springframework.beans.ITestBean#exceptional(Throwable) |
||||
*/ |
||||
public void exceptional(Throwable t) throws Throwable { |
||||
if (t != null) { |
||||
throw t; |
||||
} |
||||
} |
||||
|
||||
public void unreliableFileOperation() throws IOException { |
||||
throw new IOException(); |
||||
} |
||||
/** |
||||
* @see org.springframework.beans.ITestBean#returnsThis() |
||||
*/ |
||||
public Object returnsThis() { |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* @see org.springframework.beans.IOther#absquatulate() |
||||
*/ |
||||
public void absquatulate() { |
||||
} |
||||
|
||||
public int haveBirthday() { |
||||
return age++; |
||||
} |
||||
|
||||
|
||||
public void destroy() { |
||||
this.destroyed = true; |
||||
} |
||||
|
||||
public boolean wasDestroyed() { |
||||
return destroyed; |
||||
} |
||||
|
||||
|
||||
public boolean equals(Object other) { |
||||
if (this == other) { |
||||
return true; |
||||
} |
||||
if (other == null || !(other instanceof TestBean)) { |
||||
return false; |
||||
} |
||||
TestBean tb2 = (TestBean) other; |
||||
return (ObjectUtils.nullSafeEquals(this.name, tb2.name) && this.age == tb2.age); |
||||
} |
||||
|
||||
public int hashCode() { |
||||
return this.age; |
||||
} |
||||
|
||||
public int compareTo(Object other) { |
||||
if (this.name != null && other instanceof TestBean) { |
||||
return this.name.compareTo(((TestBean) other).getName()); |
||||
} |
||||
else { |
||||
return 1; |
||||
} |
||||
} |
||||
|
||||
public String toString() { |
||||
return this.name; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,622 @@
@@ -0,0 +1,622 @@
|
||||
/* |
||||
* 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.beans.factory.aspectj; |
||||
|
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.ObjectInputStream; |
||||
import java.io.ObjectOutputStream; |
||||
import java.io.ObjectStreamException; |
||||
import java.io.Serializable; |
||||
|
||||
import junit.framework.TestCase; |
||||
import org.aspectj.lang.annotation.Aspect; |
||||
import org.aspectj.lang.annotation.Pointcut; |
||||
|
||||
import org.springframework.beans.TestBean; |
||||
import org.springframework.beans.factory.FactoryBean; |
||||
import org.springframework.beans.factory.UnsatisfiedDependencyException; |
||||
import org.springframework.beans.factory.annotation.Autowire; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.beans.factory.annotation.Configurable; |
||||
import org.springframework.context.support.ClassPathXmlApplicationContext; |
||||
import org.springframework.mail.MailSender; |
||||
import org.springframework.mail.javamail.JavaMailSenderImpl; |
||||
|
||||
/** |
||||
* @author Adrian Colyer |
||||
* @author Rod Johnson |
||||
* @author Ramnivas Laddad |
||||
* @author Juergen Hoeller |
||||
*/ |
||||
public class BeanConfigurerTests extends TestCase { |
||||
|
||||
private ClassPathXmlApplicationContext context; |
||||
|
||||
@Override |
||||
protected void setUp() throws Exception { |
||||
this.context = |
||||
new ClassPathXmlApplicationContext("org/springframework/beans/factory/aspectj/beanConfigurerTests.xml"); |
||||
} |
||||
|
||||
public void testConfigurableWithExplicitBeanName() { |
||||
ShouldBeConfiguredBySpring myObject = new ShouldBeConfiguredBySpring(); |
||||
assertEquals("Rod", myObject.getName()); |
||||
} |
||||
|
||||
public void testInjectionAfterRefresh() { |
||||
context.refresh(); |
||||
ShouldBeConfiguredBySpring myObject = new ShouldBeConfiguredBySpring(); |
||||
assertEquals("Rod", myObject.getName()); |
||||
} |
||||
|
||||
public void testWithoutAnnotation() { |
||||
ShouldNotBeConfiguredBySpring myObject = new ShouldNotBeConfiguredBySpring(); |
||||
assertNull("Name should not have been set", myObject.getName()); |
||||
} |
||||
|
||||
public void testConfigurableWithImplicitBeanName() { |
||||
ShouldBeConfiguredBySpringUsingTypeNameAsBeanName myObject = |
||||
new ShouldBeConfiguredBySpringUsingTypeNameAsBeanName(); |
||||
assertEquals("Rob", myObject.getName()); |
||||
} |
||||
|
||||
public void testConfigurableUsingAutowireByType() { |
||||
ShouldBeConfiguredBySpringUsingAutowireByType myObject = |
||||
new ShouldBeConfiguredBySpringUsingAutowireByType(); |
||||
assertNotNull(myObject.getFriend()); |
||||
assertEquals("Ramnivas", myObject.getFriend().getName()); |
||||
} |
||||
|
||||
public void testConfigurableUsingAutowireByName() { |
||||
ValidAutowireByName myObject = new ValidAutowireByName(); |
||||
assertNotNull(myObject.getRamnivas()); |
||||
assertEquals("Ramnivas", myObject.getRamnivas().getName()); |
||||
} |
||||
|
||||
public void testInvalidAutowireByName() { |
||||
try { |
||||
new InvalidAutowireByName(); |
||||
fail("Autowire by name cannot work"); |
||||
} |
||||
catch (UnsatisfiedDependencyException ex) { |
||||
// Ok
|
||||
} |
||||
} |
||||
|
||||
public void testNewAspectAppliesToArbitraryNonAnnotatedPojo() { |
||||
ArbitraryExistingPojo aep = new ArbitraryExistingPojo(); |
||||
assertNotNull(aep.friend); |
||||
assertEquals("Ramnivas", aep.friend.getName()); |
||||
} |
||||
|
||||
public void testNewAspectThatWasNotAddedToSpringContainer() { |
||||
try{ |
||||
new ClassThatWillNotActuallyBeWired(); |
||||
} |
||||
catch (IllegalStateException ex) { |
||||
assertTrue(ex.getMessage().indexOf("BeanFactory") != -1); |
||||
} |
||||
} |
||||
|
||||
public void testInjectionOnDeserialization() throws Exception { |
||||
ShouldBeConfiguredBySpring domainObject = new ShouldBeConfiguredBySpring(); |
||||
domainObject.setName("Anonymous"); |
||||
ShouldBeConfiguredBySpring deserializedDomainObject = |
||||
serializeAndDeserialize(domainObject); |
||||
assertEquals("Dependency injected on deserialization","Rod",deserializedDomainObject.getName()); |
||||
} |
||||
|
||||
public void testInjectionOnDeserializationForClassesThatContainsPublicReadResolve() throws Exception { |
||||
ShouldBeConfiguredBySpringContainsPublicReadResolve domainObject = new ShouldBeConfiguredBySpringContainsPublicReadResolve(); |
||||
domainObject.setName("Anonymous"); |
||||
ShouldBeConfiguredBySpringContainsPublicReadResolve deserializedDomainObject = |
||||
serializeAndDeserialize(domainObject); |
||||
assertEquals("Dependency injected on deserialization","Rod",deserializedDomainObject.getName()); |
||||
assertEquals("User readResolve should take precedence", 1, deserializedDomainObject.readResolveInvocationCount); |
||||
} |
||||
|
||||
// See ShouldBeConfiguredBySpringContainsPrivateReadResolve
|
||||
// public void testInjectionOnDeserializationForClassesThatContainsPrivateReadResolve() throws Exception {
|
||||
// ShouldBeConfiguredBySpringContainsPrivateReadResolve domainObject = new ShouldBeConfiguredBySpringContainsPrivateReadResolve();
|
||||
// domainObject.setName("Anonymous");
|
||||
// ShouldBeConfiguredBySpringContainsPrivateReadResolve deserializedDomainObject =
|
||||
// serializeAndDeserialize(domainObject);
|
||||
// assertEquals("Dependency injected on deserialization","Rod",deserializedDomainObject.getName());
|
||||
// }
|
||||
|
||||
public void testNonInjectionOnDeserializationForSerializedButNotConfigured() throws Exception { |
||||
SerializableThatShouldNotBeConfiguredBySpring domainObject = new SerializableThatShouldNotBeConfiguredBySpring(); |
||||
domainObject.setName("Anonymous"); |
||||
SerializableThatShouldNotBeConfiguredBySpring deserializedDomainObject = |
||||
serializeAndDeserialize(domainObject); |
||||
assertEquals("Dependency injected on deserialization","Anonymous",deserializedDomainObject.getName()); |
||||
} |
||||
|
||||
public void testSubBeanConfiguredOnlyOnce() throws Exception { |
||||
SubBean subBean = new SubBean(); |
||||
assertEquals("Property injected more than once", 1, subBean.setterCount); |
||||
} |
||||
|
||||
public void testSubBeanConfiguredOnlyOnceForPreConstruction() throws Exception { |
||||
SubBeanPreConstruction subBean = new SubBeanPreConstruction(); |
||||
assertEquals("Property injected more than once", 1, subBean.setterCount); |
||||
} |
||||
|
||||
public void testSubSerializableBeanConfiguredOnlyOnce() throws Exception { |
||||
SubSerializableBean subBean = new SubSerializableBean(); |
||||
assertEquals("Property injected more than once", 1, subBean.setterCount); |
||||
subBean.setterCount = 0; |
||||
|
||||
SubSerializableBean deserializedSubBean = serializeAndDeserialize(subBean); |
||||
assertEquals("Property injected more than once", 1, deserializedSubBean.setterCount); |
||||
} |
||||
|
||||
public void testPreConstructionConfiguredBean() { |
||||
PreConstructionConfiguredBean bean = new PreConstructionConfiguredBean(); |
||||
assertTrue("Injection didn't occur before construction", bean.preConstructionConfigured); |
||||
} |
||||
|
||||
public void testPreConstructionConfiguredBeanDeserializationReinjection() throws Exception { |
||||
PreConstructionConfiguredBean bean = new PreConstructionConfiguredBean(); |
||||
PreConstructionConfiguredBean deserialized = serializeAndDeserialize(bean); |
||||
assertEquals("Injection didn't occur upon deserialization", "ramnivas", deserialized.getName()); |
||||
} |
||||
|
||||
public void testPostConstructionConfiguredBean() { |
||||
PostConstructionConfiguredBean bean = new PostConstructionConfiguredBean(); |
||||
assertFalse("Injection occurred before construction", bean.preConstructionConfigured); |
||||
} |
||||
|
||||
public void testPostConstructionConfiguredBeanDeserializationReinjection() throws Exception { |
||||
PostConstructionConfiguredBean bean = new PostConstructionConfiguredBean(); |
||||
PostConstructionConfiguredBean deserialized = serializeAndDeserialize(bean); |
||||
assertEquals("Injection didn't occur upon deserialization", "ramnivas", deserialized.getName()); |
||||
} |
||||
|
||||
public void testInterfaceDrivenDependencyInjection() { |
||||
MailClientDependencyInjectionAspect.aspectOf().setMailSender(new JavaMailSenderImpl()); |
||||
Order testOrder = new Order(); |
||||
assertNotNull("Interface driven injection didn't occur for direct construction", testOrder.mailSender); |
||||
} |
||||
|
||||
public void testInterfaceDrivenDependencyInjectionMultipleInterfaces() { |
||||
MailClientDependencyInjectionAspect.aspectOf().setMailSender(new JavaMailSenderImpl()); |
||||
PaymentProcessorDependencyInjectionAspect.aspectOf().setPaymentProcessor(new PaymentProcessor()); |
||||
|
||||
ShoppingCart testCart = new ShoppingCart(); |
||||
|
||||
assertNotNull("Interface driven injection didn't occur for direct construction", testCart.mailSender); |
||||
assertNotNull("Interface driven injection didn't occur for direct construction", testCart.paymentProcessor); |
||||
} |
||||
|
||||
public void testInterfaceDrivenDependencyInjectionUponDeserialization() throws Exception { |
||||
MailClientDependencyInjectionAspect.aspectOf().setMailSender(new JavaMailSenderImpl()); |
||||
Order testOrder = new Order(); |
||||
Order deserializedOrder = serializeAndDeserialize(testOrder); |
||||
assertNotNull("Interface driven injection didn't occur for deserialization", testOrder.mailSender); |
||||
} |
||||
|
||||
public void testFieldAutoWiredAnnotationInjection() { |
||||
FieldAutoWiredServiceBean bean = new FieldAutoWiredServiceBean(); |
||||
assertNotNull(bean.testService); |
||||
} |
||||
|
||||
public void testMethodAutoWiredAnnotationInjection() { |
||||
MethodAutoWiredServiceBean bean = new MethodAutoWiredServiceBean(); |
||||
assertNotNull(bean.testService); |
||||
} |
||||
|
||||
public void testMultiArgumentMethodAutoWiredAnnotationInjection() { |
||||
MultiArgumentMethodAutoWiredServiceBean bean = new MultiArgumentMethodAutoWiredServiceBean(); |
||||
assertNotNull(bean.testService); |
||||
assertNotNull(bean.paymentService); |
||||
} |
||||
|
||||
public void testGenericParameterConfigurableBean() { |
||||
GenericParameterConfigurableBean bean = new GenericParameterConfigurableBean(); |
||||
assertNotNull(bean.testService); |
||||
} |
||||
|
||||
@SuppressWarnings("unchecked") |
||||
private <T> T serializeAndDeserialize(T serializable) throws Exception { |
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
||||
ObjectOutputStream oos = new ObjectOutputStream(baos); |
||||
oos.writeObject(serializable); |
||||
oos.close(); |
||||
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); |
||||
ObjectInputStream ois = new ObjectInputStream(bais); |
||||
return (T)ois.readObject(); |
||||
} |
||||
|
||||
|
||||
@Configurable("beanOne") |
||||
private static class ShouldBeConfiguredBySpring implements Serializable { |
||||
|
||||
private String name; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getName() { |
||||
return this.name; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configurable("beanOne") |
||||
private static class ShouldBeConfiguredBySpringContainsPublicReadResolve implements Serializable { |
||||
|
||||
private String name; |
||||
|
||||
private int readResolveInvocationCount = 0; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getName() { |
||||
return this.name; |
||||
} |
||||
|
||||
public Object readResolve() throws ObjectStreamException { |
||||
readResolveInvocationCount++; |
||||
return this; |
||||
} |
||||
} |
||||
|
||||
|
||||
// Won't work until we use hasmethod() experimental pointcut in AspectJ.
|
||||
// @Configurable("beanOne")
|
||||
// private static class ShouldBeConfiguredBySpringContainsPrivateReadResolve implements Serializable {
|
||||
//
|
||||
// private String name;
|
||||
//
|
||||
// public void setName(String name) {
|
||||
// this.name = name;
|
||||
// }
|
||||
//
|
||||
// public String getName() {
|
||||
// return this.name;
|
||||
// }
|
||||
//
|
||||
// private Object readResolve() throws ObjectStreamException {
|
||||
// return this;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
private static class ShouldNotBeConfiguredBySpring { |
||||
|
||||
private String name; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getName() { |
||||
return this.name; |
||||
} |
||||
} |
||||
|
||||
|
||||
private static class SerializableThatShouldNotBeConfiguredBySpring implements Serializable { |
||||
|
||||
private String name; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getName() { |
||||
return this.name; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configurable |
||||
private static class ShouldBeConfiguredBySpringUsingTypeNameAsBeanName { |
||||
|
||||
private String name; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getName() { |
||||
return this.name; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configurable(autowire=Autowire.BY_TYPE) |
||||
private static class ShouldBeConfiguredBySpringUsingAutowireByType { |
||||
|
||||
private TestBean friend = null; |
||||
|
||||
public TestBean getFriend() { |
||||
return friend; |
||||
} |
||||
|
||||
public void setFriend(TestBean friend) { |
||||
this.friend = friend; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configurable(autowire=Autowire.BY_NAME) |
||||
private static class ValidAutowireByName { |
||||
|
||||
private TestBean friend = null; |
||||
|
||||
public TestBean getRamnivas() { |
||||
return friend; |
||||
} |
||||
|
||||
public void setRamnivas(TestBean friend) { |
||||
this.friend = friend; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configurable(autowire=Autowire.BY_NAME, dependencyCheck=true) |
||||
private static class InvalidAutowireByName { |
||||
|
||||
private TestBean friend; |
||||
|
||||
public TestBean getFriend() { |
||||
return friend; |
||||
} |
||||
|
||||
public void setFriend(TestBean friend) { |
||||
this.friend = friend; |
||||
} |
||||
} |
||||
|
||||
|
||||
private static class ArbitraryExistingPojo { |
||||
|
||||
private TestBean friend; |
||||
|
||||
public void setFriend(TestBean f) { |
||||
this.friend = f; |
||||
} |
||||
} |
||||
|
||||
|
||||
public static class CircularFactoryBean implements FactoryBean{ |
||||
|
||||
public CircularFactoryBean() { |
||||
// ValidAutowireByName autowired = new ValidAutowireByName();
|
||||
// assertNull(autowired.getRamnivas());
|
||||
} |
||||
|
||||
public Object getObject() throws Exception { |
||||
return new TestBean(); |
||||
} |
||||
|
||||
public Class getObjectType() { |
||||
return TestBean.class; |
||||
} |
||||
|
||||
public boolean isSingleton() { |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configurable |
||||
private static class BaseBean { |
||||
|
||||
public int setterCount; |
||||
|
||||
private String name; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
setterCount++; |
||||
} |
||||
} |
||||
|
||||
|
||||
private static class SubBean extends BaseBean { |
||||
} |
||||
|
||||
@Configurable(preConstruction=true) |
||||
private static class SubBeanPreConstruction extends BaseBean { |
||||
} |
||||
|
||||
@Configurable |
||||
private static class BaseSerializableBean implements Serializable { |
||||
|
||||
public int setterCount; |
||||
|
||||
private String name; |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
setterCount++; |
||||
} |
||||
} |
||||
|
||||
|
||||
private static class SubSerializableBean extends BaseSerializableBean { |
||||
} |
||||
|
||||
|
||||
@Aspect |
||||
private static class WireArbitraryExistingPojo extends AbstractBeanConfigurerAspect { |
||||
|
||||
@Pointcut("initialization(ArbitraryExistingPojo.new(..)) && this(beanInstance)") |
||||
protected void beanCreation(Object beanInstance){ |
||||
|
||||
} |
||||
} |
||||
|
||||
|
||||
@Aspect |
||||
private static class AspectThatWillNotBeUsed extends AbstractBeanConfigurerAspect { |
||||
|
||||
@Pointcut("initialization(ClassThatWillNotActuallyBeWired.new(..)) && this(beanInstance)") |
||||
protected void beanCreation(Object beanInstance){ |
||||
} |
||||
} |
||||
|
||||
private static aspect MailClientDependencyInjectionAspect extends AbstractInterfaceDrivenDependencyInjectionAspect { |
||||
private MailSender mailSender; |
||||
|
||||
public pointcut inConfigurableBean() : within(MailSenderClient+); |
||||
|
||||
public void configureBean(Object bean) { |
||||
((MailSenderClient)bean).setMailSender(this.mailSender); |
||||
} |
||||
|
||||
declare parents: MailSenderClient implements ConfigurableObject; |
||||
|
||||
public void setMailSender(MailSender mailSender) { |
||||
this.mailSender = mailSender; |
||||
} |
||||
} |
||||
|
||||
private static aspect PaymentProcessorDependencyInjectionAspect extends AbstractInterfaceDrivenDependencyInjectionAspect { |
||||
private PaymentProcessor paymentProcessor; |
||||
|
||||
public pointcut inConfigurableBean() : within(PaymentProcessorClient+); |
||||
|
||||
public void configureBean(Object bean) { |
||||
((PaymentProcessorClient)bean).setPaymentProcessor(this.paymentProcessor); |
||||
} |
||||
|
||||
declare parents: PaymentProcessorClient implements ConfigurableObject; |
||||
|
||||
public void setPaymentProcessor(PaymentProcessor paymentProcessor) { |
||||
this.paymentProcessor = paymentProcessor; |
||||
} |
||||
} |
||||
|
||||
public static interface MailSenderClient { |
||||
public void setMailSender(MailSender mailSender); |
||||
} |
||||
|
||||
public static interface PaymentProcessorClient { |
||||
public void setPaymentProcessor(PaymentProcessor paymentProcessor); |
||||
} |
||||
|
||||
public static class PaymentProcessor { |
||||
|
||||
} |
||||
|
||||
public static class Order implements MailSenderClient, Serializable { |
||||
private transient MailSender mailSender; |
||||
|
||||
public void setMailSender(MailSender mailSender) { |
||||
this.mailSender = mailSender; |
||||
} |
||||
} |
||||
|
||||
public static class ShoppingCart implements MailSenderClient, PaymentProcessorClient { |
||||
private transient MailSender mailSender; |
||||
private transient PaymentProcessor paymentProcessor; |
||||
|
||||
public void setMailSender(MailSender mailSender) { |
||||
this.mailSender = mailSender; |
||||
} |
||||
|
||||
public void setPaymentProcessor(PaymentProcessor paymentProcessor) { |
||||
this.paymentProcessor = paymentProcessor; |
||||
} |
||||
} |
||||
|
||||
private static class ClassThatWillNotActuallyBeWired { |
||||
|
||||
} |
||||
|
||||
@Configurable |
||||
private static class PreOrPostConstructionConfiguredBean implements Serializable { |
||||
private transient String name; |
||||
protected transient boolean preConstructionConfigured; |
||||
transient int count; |
||||
|
||||
public PreOrPostConstructionConfiguredBean() { |
||||
preConstructionConfigured = (this.name != null); |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public String getName() { |
||||
return this.name; |
||||
} |
||||
} |
||||
|
||||
|
||||
@Configurable(preConstruction=true) |
||||
public static class PreConstructionConfiguredBean extends PreOrPostConstructionConfiguredBean { |
||||
} |
||||
|
||||
|
||||
@Configurable(preConstruction=false) |
||||
private static class PostConstructionConfiguredBean extends PreOrPostConstructionConfiguredBean { |
||||
} |
||||
|
||||
@Configurable |
||||
public static class FieldAutoWiredServiceBean { |
||||
@Autowired transient private TestService testService; |
||||
} |
||||
|
||||
@Configurable |
||||
public static class MethodAutoWiredServiceBean { |
||||
transient private TestService testService; |
||||
|
||||
@Autowired |
||||
public void setTestService(TestService testService) { |
||||
this.testService = testService; |
||||
} |
||||
} |
||||
|
||||
@Configurable |
||||
public static class MultiArgumentMethodAutoWiredServiceBean { |
||||
transient private TestService testService; |
||||
transient private PaymentService paymentService; |
||||
|
||||
@Autowired |
||||
public void setDependencies(TestService testService, PaymentService paymentService) { |
||||
this.testService = testService; |
||||
this.paymentService = paymentService; |
||||
} |
||||
} |
||||
|
||||
@Configurable |
||||
public static class GenericParameterConfigurableBean { |
||||
private TestService testService; |
||||
|
||||
public void setTestService(TestService testService) { |
||||
this.testService = testService; |
||||
} |
||||
} |
||||
|
||||
public static class TestService { |
||||
|
||||
} |
||||
|
||||
public static class PaymentService { |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
/* |
||||
* 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.beans.factory.aspectj; |
||||
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext; |
||||
|
||||
import junit.framework.TestCase; |
||||
|
||||
public class SpringConfiguredWithAutoProxyingTests extends TestCase { |
||||
|
||||
@Override |
||||
protected void setUp() throws Exception { |
||||
new ClassPathXmlApplicationContext("org/springframework/beans/factory/aspectj/springConfigured.xml"); |
||||
} |
||||
|
||||
public void testSpringConfiguredAndAutoProxyUsedTogether() { |
||||
; // set up is sufficient to trigger failure if this is going to fail...
|
||||
} |
||||
} |
||||
@ -0,0 +1,68 @@
@@ -0,0 +1,68 @@
|
||||
<?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:context="http://www.springframework.org/schema/context" |
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd |
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> |
||||
|
||||
<context:spring-configured/> |
||||
|
||||
<context:annotation-config/> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$WireArbitraryExistingPojo" |
||||
factory-method="aspectOf"/> |
||||
|
||||
<bean id="beanOne" class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$ShouldBeConfiguredBySpring" |
||||
lazy-init="true"> |
||||
<property name="name" value="Rod"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$ShouldBeConfiguredBySpringUsingTypeNameAsBeanName" |
||||
lazy-init="true"> |
||||
<property name="name" value="Rob"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$SubBean" |
||||
lazy-init="true"> |
||||
<property name="name" value="Ramnivas"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$SubBeanPreConstruction" |
||||
lazy-init="true"> |
||||
<property name="name" value="Ramnivas"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$SubSerializableBean" |
||||
lazy-init="true"> |
||||
<property name="name" value="Ramnivas"/> |
||||
</bean> |
||||
|
||||
<bean id="circular" class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$CircularFactoryBean" |
||||
autowire-candidate="false"/> |
||||
|
||||
<!-- Used as a target for autowiring by type --> |
||||
<bean id="ramnivas" class="org.springframework.beans.TestBean" depends-on="circular"> |
||||
<property name="name" value="Ramnivas"/> |
||||
<property name="spouse" ref="circular"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$ArbitraryExistingPojo"> |
||||
<property name="friend" ref="ramnivas"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$PreConstructionConfiguredBean"> |
||||
<property name="name" value="ramnivas"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$PostConstructionConfiguredBean"> |
||||
<property name="name" value="ramnivas"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$GenericParameterConfigurableBean" scope="prototype"> |
||||
<property name="testService" ref="testService"/> |
||||
</bean> |
||||
|
||||
<bean id="testService" class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$TestService"/> |
||||
<bean id="paymentService" class="org.springframework.beans.factory.aspectj.BeanConfigurerTests$PaymentService"/> |
||||
|
||||
</beans> |
||||
@ -0,0 +1,14 @@
@@ -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" |
||||
xmlns:context="http://www.springframework.org/schema/context" |
||||
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 |
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> |
||||
|
||||
<context:spring-configured/> |
||||
|
||||
<aop:aspectj-autoproxy/> |
||||
|
||||
</beans> |
||||
@ -0,0 +1,58 @@
@@ -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.transaction; |
||||
|
||||
import org.springframework.transaction.support.AbstractPlatformTransactionManager; |
||||
import org.springframework.transaction.support.DefaultTransactionStatus; |
||||
|
||||
/** |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
*/ |
||||
public class CallCountingTransactionManager extends AbstractPlatformTransactionManager { |
||||
|
||||
public TransactionDefinition lastDefinition; |
||||
public int begun; |
||||
public int commits; |
||||
public int rollbacks; |
||||
public int inflight; |
||||
|
||||
protected Object doGetTransaction() { |
||||
return new Object(); |
||||
} |
||||
|
||||
protected void doBegin(Object transaction, TransactionDefinition definition) { |
||||
this.lastDefinition = definition; |
||||
++begun; |
||||
++inflight; |
||||
} |
||||
|
||||
protected void doCommit(DefaultTransactionStatus status) { |
||||
++commits; |
||||
--inflight; |
||||
} |
||||
|
||||
protected void doRollback(DefaultTransactionStatus status) { |
||||
++rollbacks; |
||||
--inflight; |
||||
} |
||||
|
||||
public void clear() { |
||||
begun = commits = rollbacks = inflight = 0; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,34 @@
@@ -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. |
||||
* |
||||
* Created on 11 Sep 2006 by Adrian Colyer |
||||
*/ |
||||
package org.springframework.transaction.aspectj; |
||||
|
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
/** |
||||
* @author Adrian Colyer |
||||
* @since 2.0 |
||||
*/ |
||||
public class ClassWithPrivateAnnotatedMember { |
||||
|
||||
public void doSomething() { |
||||
doInTransaction(); |
||||
} |
||||
|
||||
@Transactional |
||||
private void doInTransaction() {} |
||||
} |
||||
@ -0,0 +1,34 @@
@@ -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. |
||||
* |
||||
* Created on 11 Sep 2006 by Adrian Colyer |
||||
*/ |
||||
package org.springframework.transaction.aspectj; |
||||
|
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
/** |
||||
* @author Adrian Colyer |
||||
* @since 2.0 |
||||
*/ |
||||
public class ClassWithProtectedAnnotatedMember { |
||||
|
||||
public void doSomething() { |
||||
doInTransaction(); |
||||
} |
||||
|
||||
@Transactional |
||||
protected void doInTransaction() {} |
||||
} |
||||
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
package org.springframework.transaction.aspectj; |
||||
|
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
@Transactional |
||||
public interface ITransactional { |
||||
|
||||
Object echo(Throwable t) throws Throwable; |
||||
|
||||
} |
||||
@ -0,0 +1,19 @@
@@ -0,0 +1,19 @@
|
||||
package org.springframework.transaction.aspectj; |
||||
|
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
public class MethodAnnotationOnClassWithNoInterface { |
||||
|
||||
@Transactional(rollbackFor=InterruptedException.class) |
||||
public Object echo(Throwable t) throws Throwable { |
||||
if (t != null) { |
||||
throw t; |
||||
} |
||||
return t; |
||||
} |
||||
|
||||
public void noTransactionAttribute() { |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,18 @@
@@ -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="transactionManager" class="org.springframework.transaction.CallCountingTransactionManager"/> |
||||
|
||||
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> |
||||
<property name="transactionManager" ref="transactionManager"/> |
||||
</bean> |
||||
|
||||
<bean class="org.springframework.transaction.aspectj.TransactionalAnnotationOnlyOnClassWithNoInterface"/> |
||||
|
||||
<bean class="org.springframework.transaction.aspectj.ClassWithProtectedAnnotatedMember"/> |
||||
|
||||
<bean class="org.springframework.transaction.aspectj.ClassWithPrivateAnnotatedMember"/> |
||||
|
||||
</beans> |
||||
@ -0,0 +1,261 @@
@@ -0,0 +1,261 @@
|
||||
/* |
||||
* 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.transaction.aspectj; |
||||
|
||||
import java.lang.reflect.Method; |
||||
|
||||
import junit.framework.AssertionFailedError; |
||||
|
||||
import org.springframework.test.AbstractDependencyInjectionSpringContextTests; |
||||
import org.springframework.transaction.CallCountingTransactionManager; |
||||
import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource; |
||||
import org.springframework.transaction.interceptor.TransactionAspectSupport; |
||||
import org.springframework.transaction.interceptor.TransactionAttribute; |
||||
|
||||
/** |
||||
* @author Rod Johnson |
||||
* @author Ramnivas Laddad |
||||
*/ |
||||
public class TransactionAspectTests extends AbstractDependencyInjectionSpringContextTests { |
||||
|
||||
private TransactionAspectSupport transactionAspect; |
||||
|
||||
private CallCountingTransactionManager txManager; |
||||
|
||||
private TransactionalAnnotationOnlyOnClassWithNoInterface annotationOnlyOnClassWithNoInterface; |
||||
|
||||
private ClassWithProtectedAnnotatedMember beanWithAnnotatedProtectedMethod; |
||||
|
||||
private ClassWithPrivateAnnotatedMember beanWithAnnotatedPrivateMethod; |
||||
|
||||
private MethodAnnotationOnClassWithNoInterface methodAnnotationOnly = new MethodAnnotationOnClassWithNoInterface(); |
||||
|
||||
|
||||
public void setAnnotationOnlyOnClassWithNoInterface( |
||||
TransactionalAnnotationOnlyOnClassWithNoInterface annotationOnlyOnClassWithNoInterface) { |
||||
this.annotationOnlyOnClassWithNoInterface = annotationOnlyOnClassWithNoInterface; |
||||
} |
||||
|
||||
public void setClassWithAnnotatedProtectedMethod(ClassWithProtectedAnnotatedMember aBean) { |
||||
this.beanWithAnnotatedProtectedMethod = aBean; |
||||
} |
||||
|
||||
public void setClassWithAnnotatedPrivateMethod(ClassWithPrivateAnnotatedMember aBean) { |
||||
this.beanWithAnnotatedPrivateMethod = aBean; |
||||
} |
||||
|
||||
public void setTransactionAspect(TransactionAspectSupport transactionAspect) { |
||||
this.transactionAspect = transactionAspect; |
||||
this.txManager = (CallCountingTransactionManager) transactionAspect.getTransactionManager(); |
||||
} |
||||
|
||||
public TransactionAspectSupport getTransactionAspect() { |
||||
return this.transactionAspect; |
||||
} |
||||
|
||||
@Override |
||||
protected String getConfigPath() { |
||||
return "TransactionAspectTests-context.xml"; |
||||
} |
||||
|
||||
|
||||
public void testCommitOnAnnotatedClass() throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0, txManager.begun); |
||||
annotationOnlyOnClassWithNoInterface.echo(null); |
||||
assertEquals(1, txManager.commits); |
||||
} |
||||
|
||||
public void testCommitOnAnnotatedProtectedMethod() throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0, txManager.begun); |
||||
beanWithAnnotatedProtectedMethod.doInTransaction(); |
||||
assertEquals(1, txManager.commits); |
||||
} |
||||
|
||||
public void testCommitOnAnnotatedPrivateMethod() throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0, txManager.begun); |
||||
beanWithAnnotatedPrivateMethod.doSomething(); |
||||
assertEquals(1, txManager.commits); |
||||
} |
||||
|
||||
public void testNoCommitOnNonAnnotatedNonPublicMethodInTransactionalType() throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0,txManager.begun); |
||||
annotationOnlyOnClassWithNoInterface.nonTransactionalMethod(); |
||||
assertEquals(0,txManager.begun); |
||||
} |
||||
|
||||
public void testCommitOnAnnotatedMethod() throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0, txManager.begun); |
||||
methodAnnotationOnly.echo(null); |
||||
assertEquals(1, txManager.commits); |
||||
} |
||||
|
||||
|
||||
public static class NotTransactional { |
||||
public void noop() { |
||||
} |
||||
} |
||||
|
||||
public void testNotTransactional() throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0, txManager.begun); |
||||
new NotTransactional().noop(); |
||||
assertEquals(0, txManager.begun); |
||||
} |
||||
|
||||
|
||||
public void testDefaultCommitOnAnnotatedClass() throws Throwable { |
||||
testRollback(new TransactionOperationCallback() { |
||||
public Object performTransactionalOperation() throws Throwable { |
||||
return annotationOnlyOnClassWithNoInterface.echo(new Exception()); |
||||
} |
||||
}, false); |
||||
} |
||||
|
||||
public void testDefaultRollbackOnAnnotatedClass() throws Throwable { |
||||
testRollback(new TransactionOperationCallback() { |
||||
public Object performTransactionalOperation() throws Throwable { |
||||
return annotationOnlyOnClassWithNoInterface.echo(new RuntimeException()); |
||||
} |
||||
}, true); |
||||
} |
||||
|
||||
|
||||
public static class SubclassOfClassWithTransactionalAnnotation extends TransactionalAnnotationOnlyOnClassWithNoInterface { |
||||
} |
||||
|
||||
public void testDefaultCommitOnSubclassOfAnnotatedClass() throws Throwable { |
||||
testRollback(new TransactionOperationCallback() { |
||||
public Object performTransactionalOperation() throws Throwable { |
||||
return new SubclassOfClassWithTransactionalAnnotation().echo(new Exception()); |
||||
} |
||||
}, false); |
||||
} |
||||
|
||||
public static class SubclassOfClassWithTransactionalMethodAnnotation extends MethodAnnotationOnClassWithNoInterface { |
||||
} |
||||
|
||||
public void testDefaultCommitOnSubclassOfClassWithTransactionalMethodAnnotated() throws Throwable { |
||||
testRollback(new TransactionOperationCallback() { |
||||
public Object performTransactionalOperation() throws Throwable { |
||||
return new SubclassOfClassWithTransactionalMethodAnnotation().echo(new Exception()); |
||||
} |
||||
}, false); |
||||
} |
||||
|
||||
public static class ImplementsAnnotatedInterface implements ITransactional { |
||||
public Object echo(Throwable t) throws Throwable { |
||||
if (t != null) { |
||||
throw t; |
||||
} |
||||
return t; |
||||
} |
||||
} |
||||
|
||||
public void testDefaultCommitOnImplementationOfAnnotatedInterface() throws Throwable { |
||||
// testRollback(new TransactionOperationCallback() {
|
||||
// public Object performTransactionalOperation() throws Throwable {
|
||||
// return new ImplementsAnnotatedInterface().echo(new Exception());
|
||||
// }
|
||||
// }, false);
|
||||
|
||||
final Exception ex = new Exception(); |
||||
testNotTransactional(new TransactionOperationCallback() { |
||||
public Object performTransactionalOperation() throws Throwable { |
||||
return new ImplementsAnnotatedInterface().echo(ex); |
||||
} |
||||
}, ex); |
||||
} |
||||
|
||||
/** |
||||
* Note: resolution does not occur. Thus we can't make a class transactional if |
||||
* it implements a transactionally annotated interface. This behaviour could only |
||||
* be changed in AbstractFallbackTransactionAttributeSource in Spring proper. |
||||
* @throws SecurityException |
||||
* @throws NoSuchMethodException |
||||
*/ |
||||
public void testDoesNotResolveTxAnnotationOnMethodFromClassImplementingAnnotatedInterface() throws SecurityException, NoSuchMethodException { |
||||
AnnotationTransactionAttributeSource atas = new AnnotationTransactionAttributeSource(); |
||||
Method m = ImplementsAnnotatedInterface.class.getMethod("echo", Throwable.class); |
||||
TransactionAttribute ta = atas.getTransactionAttribute(m, ImplementsAnnotatedInterface.class); |
||||
assertNull(ta); |
||||
} |
||||
|
||||
|
||||
public void testDefaultRollbackOnImplementationOfAnnotatedInterface() throws Throwable { |
||||
// testRollback(new TransactionOperationCallback() {
|
||||
// public Object performTransactionalOperation() throws Throwable {
|
||||
// return new ImplementsAnnotatedInterface().echo(new RuntimeException());
|
||||
// }
|
||||
// }, true);
|
||||
|
||||
final Exception rollbackProvokingException = new RuntimeException(); |
||||
testNotTransactional(new TransactionOperationCallback() { |
||||
public Object performTransactionalOperation() throws Throwable { |
||||
return new ImplementsAnnotatedInterface().echo(rollbackProvokingException); |
||||
} |
||||
}, rollbackProvokingException); |
||||
} |
||||
|
||||
|
||||
protected void testRollback(TransactionOperationCallback toc, boolean rollback) throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0, txManager.begun); |
||||
try { |
||||
toc.performTransactionalOperation(); |
||||
assertEquals(1, txManager.commits); |
||||
} |
||||
catch (Throwable caught) { |
||||
if (caught instanceof AssertionFailedError) { |
||||
return; |
||||
} |
||||
} |
||||
|
||||
if (rollback) { |
||||
assertEquals(1, txManager.rollbacks); |
||||
} |
||||
assertEquals(1, txManager.begun); |
||||
} |
||||
|
||||
protected void testNotTransactional(TransactionOperationCallback toc, Throwable expected) throws Throwable { |
||||
txManager.clear(); |
||||
assertEquals(0, txManager.begun); |
||||
try { |
||||
toc.performTransactionalOperation(); |
||||
} |
||||
catch (Throwable t) { |
||||
if (expected == null) { |
||||
fail("Expected " + expected); |
||||
} |
||||
assertSame(expected, t); |
||||
} |
||||
finally { |
||||
assertEquals(0, txManager.begun); |
||||
} |
||||
} |
||||
|
||||
|
||||
private interface TransactionOperationCallback { |
||||
|
||||
Object performTransactionalOperation() throws Throwable; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
package org.springframework.transaction.aspectj; |
||||
|
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
@Transactional |
||||
public class TransactionalAnnotationOnlyOnClassWithNoInterface { |
||||
|
||||
public Object echo(Throwable t) throws Throwable { |
||||
if (t != null) { |
||||
throw t; |
||||
} |
||||
return t; |
||||
} |
||||
|
||||
void nonTransactionalMethod() { |
||||
// no-op
|
||||
} |
||||
|
||||
} |
||||
|
||||
Loading…
Reference in new issue