package net.prietopalacios.josemanuel.aop.service; public interface Service { public void sendSomething(); public void sendEsception() throws Exception; }
package net.prietopalacios.josemanuel.aop.service; public class ServiceImpl implements Service { public void sendSomething() { System.out.println("--------------------"); System.out.println("I'm doing something."); System.out.println("--------------------"); } public void sendEsception() throws Exception { throw new Exception("Exception"); } @Override public String toString() { return "ServiceImpl []"; } }
package net.prietopalacios.josemanuel.aop; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Random; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class AopService { private Map<Integer, Integer> sessions; private Map<Integer, Integer> history; public AopService() { this.sessions = new HashMap<Integer, Integer>(); this.history = new HashMap<Integer, Integer>(); } @Before(value="(execution(* net.prietopalacios.josemanuel.aop.service.*.*(..)))") public void startsession(JoinPoint joinPoint) throws Exception { int hashCode = joinPoint.hashCode(); int session = startSession(); startSession(hashCode, session); System.out.println("=================="); System.out.println("BEFORE: "); System.out.println("hashCode: " + hashCode); System.out.println("session: " + session); } @AfterThrowing(value="(execution(* net.prietopalacios.josemanuel.aop.service.*.*(..)))", throwing="exception") public void afterThrowingStopSession(JoinPoint joinPoint, Exception exception) throws Exception { int hashCode = joinPoint.hashCode(); int session = sessions.get(hashCode); System.out.println("AFTERTHROWING: "); System.out.println("hashCode: " + hashCode); System.out.println("session: " + session); stopSession(hashCode, session); } @After(value="(execution(* net.prietopalacios.josemanuel.aop.service.*.*(..)))") public void afterStopSession(JoinPoint joinPoint) throws Exception { int hashCode = joinPoint.hashCode(); if(!sessions.containsKey(hashCode)) return; int session = sessions.get(hashCode); System.out.println("AFTER: "); System.out.println("hashCode: " + hashCode); System.out.println("session: " + session); stopSession(hashCode, session); } private int startSession(){ Random randomGenerator = new Random(); return randomGenerator.nextInt(100); } private void startSession(int hashCode, int session) throws Exception{ if(sessions.containsKey(hashCode)) { throw new Exception ("Ya existe la clave: " + hashCode); } sessions.put(hashCode, session); history.put(hashCode, session); } private void stopSession(int hashCode, int session) throws Exception{ printMap(); int remove = sessions.remove(hashCode); if(remove != session) throw new Exception("Imposible cerrar conexion"); } private void printMap(){ int n=1; for(Entry<Integer, Integer> entry: history.entrySet()){ System.out.println(n++ + ".- (h)clave: " + entry.getKey() + ", valor:" + entry.getValue()); } n=0; for(Entry<Integer, Integer> entry: sessions.entrySet()){ System.out.println(n++ + ".- (s)clave: " + entry.getKey() + ", valor:" + entry.getValue()); } } }
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <aop:aspectj-autoproxy /> <bean id="service" class="net.prietopalacios.josemanuel.aop.service.ServiceImpl" /> <bean id="aop" class="net.prietopalacios.josemanuel.aop.AopService" /> </beans>
package net.prietopalacios.josemanuel.aop.service; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring.xml") public class ServiceImplTest { @Autowired Service service; @Test public void testDoSomething() { try { service.sendSomething(); service.sendSomething(); assertTrue(true); } catch (Exception e) { if(e.getMessage() != null){ assertTrue(e.getMessage(), false); }else{ assertTrue(e.getCause().getMessage(), false); } } } @Test public void testThrowEsception() { try { service.sendEsception(); assertTrue(true); } catch (Exception e) { if(e.getMessage() != null){ assertTrue(e.getMessage(), false); }else{ assertTrue(e.getCause().getMessage(), false); } } } }
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.prietopalacios.josemanuel</groupId> <artifactId>aop</artifactId> <version>0.0.1-SNAPSHOT</version> <name>aop_example</name> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.7.3</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>3.0.5.RELEASE</version> <scope>test</scope> </dependency> </dependencies> </project>