View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  
16  package org.kuali.student.common_test_tester;
17  
18  import static org.junit.Assert.assertEquals;
19  import static org.junit.Assert.assertNotNull;
20  import static org.junit.Assert.assertTrue;
21  
22  import java.lang.reflect.Method;
23  
24  import org.aopalliance.aop.Advice;
25  import org.apache.log4j.Logger;
26  import org.aspectj.lang.ProceedingJoinPoint;
27  import org.junit.Test;
28  import org.kuali.student.common.test.spring.AbstractServiceTest;
29  import org.kuali.student.common.test.spring.Client;
30  import org.kuali.student.common.test.spring.Dao;
31  import org.kuali.student.common.test.spring.Daos;
32  import org.kuali.student.common.test.spring.IdToObjectEhcacheAdvice;
33  import org.kuali.student.common.test.spring.PersistenceFileLocation;
34  import org.kuali.student.common_test_tester.support.MyService;
35  import org.springframework.aop.aspectj.AspectInstanceFactory;
36  import org.springframework.aop.aspectj.AspectJAroundAdvice;
37  import org.springframework.aop.aspectj.AspectJExpressionPointcut;
38  import org.springframework.aop.aspectj.AspectJPointcutAdvisor;
39  import org.springframework.aop.aspectj.SingletonAspectInstanceFactory;
40  import org.springframework.aop.framework.ProxyFactory;
41  
42  @Daos( {
43  		@Dao(value = "org.kuali.student.common_test_tester.support.MyDaoImpl", testDataFile = "classpath:META-INF/load-my-beans.xml",testSqlFile="classpath:test.sql"),
44  		@Dao("org.kuali.student.common_test_tester.support.OtherDaoImpl") })
45  @PersistenceFileLocation("classpath:META-INF/test-persistence.xml")
46  public class ServiceCommonTest extends AbstractServiceTest {
47  	final Logger LOG = Logger.getLogger(ServiceCommonTest.class);
48  	@Client(value="org.kuali.student.common_test_tester.support.MyServiceImpl",additionalContextFile="classpath:test-my-additional-context.xml")
49  	private MyService client;
50  
51  	@Test
52  	public void test1() {
53  		LOG.info(System.getProperty("ks.test.daoImplClasses"));
54  		assertNotNull(client.saveString("la la la"));
55  	}
56  
57  	@Test
58  	public void testDaoLoader(){
59  	    String value = "loaded-value";
60  	    assertEquals(value, client.findValueFromValue(value));
61  	}
62  	
63  	@Test
64  	public void testClientCaching() {
65  		// Create a proxy for aop caching
66  		MyService cachedClient = client;
67  		try {
68  			//Create the proxy
69  			ProxyFactory factory = new ProxyFactory(client);
70  			factory.addInterface(MyService.class);
71  
72  			//Create the advice (caching) and a factory for that advice
73  			Advice cacheAdvice = new IdToObjectEhcacheAdvice("cachename");
74  			AspectInstanceFactory aif = new SingletonAspectInstanceFactory(
75  					cacheAdvice);
76  			
77  			//Look up the method object
78  			Method method = IdToObjectEhcacheAdvice.class.getMethod(
79  					"getFromCache", ProceedingJoinPoint.class);
80  			//Create a new pointcut
81  			AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
82  			pointcut
83  					.setExpression("execution(* org.kuali.student.common_test_tester.support.MyService.find*(..))");
84  			//Create the around advice using our caching aspect and the point cut
85  			AspectJAroundAdvice advice = new AspectJAroundAdvice(method,
86  					pointcut, aif);
87  			//Create an advisor to wrap our advice
88  			AspectJPointcutAdvisor advisor = new AspectJPointcutAdvisor(advice);
89  			//Add the advisor to the proxy factory
90  			factory.addAdvisor(advisor);
91  
92  			//Do the same with a different Method/Expression
93  			method = IdToObjectEhcacheAdvice.class.getMethod("invalidateCache",
94  					ProceedingJoinPoint.class);
95  			pointcut = new AspectJExpressionPointcut();
96  			pointcut
97  					.setExpression("execution(* org.kuali.student.common_test_tester.support.MyService.update*(..))");
98  			advice = new AspectJAroundAdvice(method, pointcut, aif);
99  			advisor = new AspectJPointcutAdvisor(advice);
100 			factory.addAdvisor(advisor);
101 			
102 			cachedClient = (MyService) factory.getProxy();
103 		} catch (SecurityException e) {
104 			LOG.error(e);
105 		} catch (NoSuchMethodException e) {
106 			LOG.error(e);
107 		}
108 
109 		String id = cachedClient.saveString("Cache me!");
110 		cachedClient.findStringId(id);
111 		// find again but it should be cached by now
112 		assertNotNull(cachedClient.findStringId(id));
113 		assertTrue(cachedClient.updateValue(id, "Updated!!!"));
114 		// now should not be in caches
115 		assertNotNull(cachedClient.findStringId(id));
116 	}
117 }