From 108adf84f6847cc4221c59024dfb0567748e00d3 Mon Sep 17 00:00:00 2001 From: "nguyenminhtuanfit@gmail.com" Date: Fri, 4 Nov 2016 07:57:11 +0700 Subject: [PATCH] aspectj introduction --- aspectj/pom.xml | 131 ++++++++++++++++++ .../java/com/baeldung/aspectj/Account.java | 13 ++ .../com/baeldung/aspectj/AccountAspect.aj | 30 ++++ .../java/com/baeldung/aspectj/Secured.java | 12 ++ .../com/baeldung/aspectj/SecuredMethod.java | 23 +++ .../baeldung/aspectj/SecuredMethodAspect.java | 27 ++++ aspectj/src/main/resources/META-INF/aop.xml | 8 ++ aspectj/src/main/resources/logback.xml | 18 +++ .../baeldung/aspectj/test/AccountTest.java | 27 ++++ .../aspectj/test/SecuredMethodTest.java | 14 ++ 10 files changed, 303 insertions(+) create mode 100644 aspectj/pom.xml create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/Account.java create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/Secured.java create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java create mode 100644 aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java create mode 100644 aspectj/src/main/resources/META-INF/aop.xml create mode 100644 aspectj/src/main/resources/logback.xml create mode 100644 aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java create mode 100644 aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java diff --git a/aspectj/pom.xml b/aspectj/pom.xml new file mode 100644 index 0000000000..2a1cff11c8 --- /dev/null +++ b/aspectj/pom.xml @@ -0,0 +1,131 @@ + + 4.0.0 + com.baeldung + aspectj + 0.0.1-SNAPSHOT + aspectj + + + + org.aspectj + aspectjrt + ${aspectj.version} + + + + org.aspectj + aspectjweaver + ${aspectj.version} + + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + ch.qos.logback + logback-core + ${logback.version} + + + + + junit + junit + ${junit.version} + + + + + + aspectj + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${source.version} + ${source.version} + + + + + + org.codehaus.mojo + aspectj-maven-plugin + 1.7 + + ${source.version} + ${source.version} + ${source.version} + true + true + ignore + ${project.build.sourceEncoding} + + + + + + + compile + test-compile + + + + + + + + + + + 1.8 + 1.6.11 + UTF-8 + 1.8.9 + 1.7.21 + 1.1.7 + 3.5.1 + 4.12 + + + \ No newline at end of file diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Account.java b/aspectj/src/main/java/com/baeldung/aspectj/Account.java new file mode 100644 index 0000000000..59cab72ebf --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/Account.java @@ -0,0 +1,13 @@ +package com.baeldung.aspectj; + +public class Account { + int balance = 20; + + public boolean withdraw(int amount) { + if (balance - amount > 0) { + balance = balance - amount; + return true; + } else + return false; + } +} diff --git a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj new file mode 100644 index 0000000000..3bdddd22a8 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj @@ -0,0 +1,30 @@ +package com.baeldung.aspectj; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public aspect AccountAspect { + private static final Logger logger = LoggerFactory.getLogger(AccountAspect.class); + final int MIN_BALANCE = 10; + + pointcut callWithDraw(int amount, Account account): + call(boolean Account.withdraw(int)) && args(amount) && target(account); + + before(int amount, Account account) : callWithDraw(amount, account) { + logger.info(" Balance before withdrawal: {}", account.balance); + logger.info(" Withdraw ammout: {}", amount); + } + + boolean around(int amount, Account account) : callWithDraw(amount, account) { + if (account.balance - amount >= MIN_BALANCE) + return proceed(amount, account); + else { + logger.info("Withdrawal Rejected!"); + return false; + } + } + + after(int amount, Account balance) : callAtWithDraw(amount, balance) { + logger.info("Balance after withdrawal : {}", balance.balance); + } +} diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Secured.java b/aspectj/src/main/java/com/baeldung/aspectj/Secured.java new file mode 100644 index 0000000000..923f208c2f --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/Secured.java @@ -0,0 +1,12 @@ +package com.baeldung.aspectj; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Secured { + public boolean isLocked() default false; +} diff --git a/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java new file mode 100644 index 0000000000..aa4b733a00 --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java @@ -0,0 +1,23 @@ +package com.baeldung.aspectj; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SecuredMethod { + private static final Logger logger = LoggerFactory.getLogger(SecuredMethod.class); + + @Secured(isLocked = true) + public void lockedMethod() throws Exception { + logger.info("lockedMethod"); + } + + @Secured(isLocked = false) + public void unlockedMethod() { + logger.info("unlockedMethod"); + } + + public static void main(String[] args) throws Exception { + SecuredMethod sv = new SecuredMethod(); + sv.lockedMethod(); + } +} \ No newline at end of file diff --git a/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java new file mode 100644 index 0000000000..9ea45ec43b --- /dev/null +++ b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java @@ -0,0 +1,27 @@ +package com.baeldung.aspectj; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Aspect +public class SecuredMethodAspect { + private static final Logger logger = LoggerFactory.getLogger(SecuredMethodAspect.class); + + @Pointcut("@annotation(secured)") + public void callAt(Secured secured) { + } + + @Around("callAt(secured)") + public Object around(ProceedingJoinPoint pjp, Secured secured) throws Throwable { + if (secured.isLocked()) { + logger.info(pjp.getSignature().toLongString() + " is locked"); + return null; + } else { + return pjp.proceed(); + } + } +} diff --git a/aspectj/src/main/resources/META-INF/aop.xml b/aspectj/src/main/resources/META-INF/aop.xml new file mode 100644 index 0000000000..f930cde942 --- /dev/null +++ b/aspectj/src/main/resources/META-INF/aop.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/aspectj/src/main/resources/logback.xml b/aspectj/src/main/resources/logback.xml new file mode 100644 index 0000000000..8b566286b8 --- /dev/null +++ b/aspectj/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n + + + + + + + + + + + + \ No newline at end of file diff --git a/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java b/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java new file mode 100644 index 0000000000..d90793f681 --- /dev/null +++ b/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java @@ -0,0 +1,27 @@ +package com.baeldung.aspectj.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.aspectj.Account; + +public class AccountTest { + private Account account; + + @Before + public void before() { + account = new Account(); + } + + @Test + public void givenBalance20AndMinBalance10_whenWithdraw5_thenSuccess() { + assertTrue(account.withdraw(5)); + } + + @Test + public void givenBalance20AndMinBalance10_whenWithdraw100_thenFail() { + assertFalse(account.withdraw(100)); + } +} diff --git a/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java b/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java new file mode 100644 index 0000000000..924bb279fd --- /dev/null +++ b/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java @@ -0,0 +1,14 @@ +package com.baeldung.aspectj.test; + +import org.junit.Test; + +import com.baeldung.aspectj.SecuredMethod; + +public class SecuredMethodTest { + @Test + public void testMethod() throws Exception { + SecuredMethod service = new SecuredMethod(); + service.unlockedMethod(); + service.lockedMethod(); + } +} \ No newline at end of file