001 /** 002 * Copyright 2010 The Kuali Foundation Licensed under the 003 * Educational Community License, Version 2.0 (the "License"); you may 004 * not use this file except in compliance with the License. You may 005 * obtain a copy of the License at 006 * 007 * http://www.osedu.org/licenses/ECL-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, 010 * software distributed under the License is distributed on an "AS IS" 011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 012 * or implied. See the License for the specific language governing 013 * permissions and limitations under the License. 014 */ 015 016 package org.kuali.student.common_test_tester; 017 018 import static org.junit.Assert.assertEquals; 019 import static org.junit.Assert.assertNotNull; 020 import static org.junit.Assert.assertTrue; 021 022 import java.lang.reflect.Method; 023 024 import org.aopalliance.aop.Advice; 025 import org.apache.log4j.Logger; 026 import org.aspectj.lang.ProceedingJoinPoint; 027 import org.junit.Test; 028 import org.kuali.student.common.test.spring.AbstractServiceTest; 029 import org.kuali.student.common.test.spring.Client; 030 import org.kuali.student.common.test.spring.Dao; 031 import org.kuali.student.common.test.spring.Daos; 032 import org.kuali.student.common.test.spring.IdToObjectEhcacheAdvice; 033 import org.kuali.student.common.test.spring.PersistenceFileLocation; 034 import org.kuali.student.common_test_tester.support.MyService; 035 import org.springframework.aop.aspectj.AspectInstanceFactory; 036 import org.springframework.aop.aspectj.AspectJAroundAdvice; 037 import org.springframework.aop.aspectj.AspectJExpressionPointcut; 038 import org.springframework.aop.aspectj.AspectJPointcutAdvisor; 039 import org.springframework.aop.aspectj.SingletonAspectInstanceFactory; 040 import org.springframework.aop.framework.ProxyFactory; 041 042 @Daos( { 043 @Dao(value = "org.kuali.student.common_test_tester.support.MyDaoImpl", testDataFile = "classpath:META-INF/load-my-beans.xml",testSqlFile="classpath:test.sql"), 044 @Dao("org.kuali.student.common_test_tester.support.OtherDaoImpl") }) 045 @PersistenceFileLocation("classpath:META-INF/test-persistence.xml") 046 public class ServiceCommonTest extends AbstractServiceTest { 047 final Logger LOG = Logger.getLogger(ServiceCommonTest.class); 048 @Client(value="org.kuali.student.common_test_tester.support.MyServiceImpl",additionalContextFile="classpath:test-my-additional-context.xml") 049 private MyService client; 050 051 @Test 052 public void test1() { 053 LOG.info(System.getProperty("ks.test.daoImplClasses")); 054 assertNotNull(client.saveString("la la la")); 055 } 056 057 @Test 058 public void testDaoLoader(){ 059 String value = "loaded-value"; 060 assertEquals(value, client.findValueFromValue(value)); 061 } 062 063 @Test 064 public void testClientCaching() { 065 // Create a proxy for aop caching 066 MyService cachedClient = client; 067 try { 068 //Create the proxy 069 ProxyFactory factory = new ProxyFactory(client); 070 factory.addInterface(MyService.class); 071 072 //Create the advice (caching) and a factory for that advice 073 Advice cacheAdvice = new IdToObjectEhcacheAdvice("cachename"); 074 AspectInstanceFactory aif = new SingletonAspectInstanceFactory( 075 cacheAdvice); 076 077 //Look up the method object 078 Method method = IdToObjectEhcacheAdvice.class.getMethod( 079 "getFromCache", ProceedingJoinPoint.class); 080 //Create a new pointcut 081 AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); 082 pointcut 083 .setExpression("execution(* org.kuali.student.common_test_tester.support.MyService.find*(..))"); 084 //Create the around advice using our caching aspect and the point cut 085 AspectJAroundAdvice advice = new AspectJAroundAdvice(method, 086 pointcut, aif); 087 //Create an advisor to wrap our advice 088 AspectJPointcutAdvisor advisor = new AspectJPointcutAdvisor(advice); 089 //Add the advisor to the proxy factory 090 factory.addAdvisor(advisor); 091 092 //Do the same with a different Method/Expression 093 method = IdToObjectEhcacheAdvice.class.getMethod("invalidateCache", 094 ProceedingJoinPoint.class); 095 pointcut = new AspectJExpressionPointcut(); 096 pointcut 097 .setExpression("execution(* org.kuali.student.common_test_tester.support.MyService.update*(..))"); 098 advice = new AspectJAroundAdvice(method, pointcut, aif); 099 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 }