From 108adf84f6847cc4221c59024dfb0567748e00d3 Mon Sep 17 00:00:00 2001 From: "nguyenminhtuanfit@gmail.com" Date: Fri, 4 Nov 2016 07:57:11 +0700 Subject: [PATCH 1/3] 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 From 19eb8bd90d286e5d3337cf520c71d3feebe07cd0 Mon Sep 17 00:00:00 2001 From: "nguyenminhtuanfit@gmail.com" Date: Sat, 12 Nov 2016 15:53:40 +0700 Subject: [PATCH 2/3] An introduction to JAXB --- jaxb/pom.xml | 170 ++++++++++++++++++ .../src/main/java/com/baeldung/jaxb/Book.java | 58 ++++++ .../java/com/baeldung/jaxb/DateAdapter.java | 28 +++ .../src/main/java/com/baeldung/jaxb/Main.java | 39 ++++ jaxb/src/main/resources/global.xjb | 13 ++ jaxb/src/main/resources/logback.xml | 18 ++ jaxb/src/main/resources/user.xsd | 23 +++ 7 files changed, 349 insertions(+) create mode 100644 jaxb/pom.xml create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/Book.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/Main.java create mode 100644 jaxb/src/main/resources/global.xjb create mode 100644 jaxb/src/main/resources/logback.xml create mode 100644 jaxb/src/main/resources/user.xsd diff --git a/jaxb/pom.xml b/jaxb/pom.xml new file mode 100644 index 0000000000..cce40c55d4 --- /dev/null +++ b/jaxb/pom.xml @@ -0,0 +1,170 @@ + + 4.0.0 + com.baeldung + jaxb + 0.0.1-SNAPSHOT + jaxb + + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb.version} + + + + org.glassfish.jaxb + jaxb-core + ${jaxb.version} + + + + + com.sun.istack + istack-commons-runtime + 3.0.2 + + + + org.slf4j + slf4j-api + ${org.slf4j.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + ch.qos.logback + logback-core + ${logback.version} + + + + + + jaxb + + + src/main/resources + true + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + org.codehaus.mojo + jaxb2-maven-plugin + [${jaxb2-maven-plugin.version},) + + schemagen + xjc + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + + org.codehaus.mojo + jaxb2-maven-plugin + ${jaxb2-maven-plugin.version} + + + xjc + + xjc + + + + + + src/main/resources/global.xjb + + + src/main/resources/user.xsd + + ${basedir}/src/main/java + false + + + + + + + + + + + 2.2.11 + + + 1.7.21 + 1.1.7 + + + 3.5.1 + 2.3 + + + \ No newline at end of file diff --git a/jaxb/src/main/java/com/baeldung/jaxb/Book.java b/jaxb/src/main/java/com/baeldung/jaxb/Book.java new file mode 100644 index 0000000000..8455d3e6df --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/Book.java @@ -0,0 +1,58 @@ +package com.baeldung.jaxb; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; +import javax.xml.bind.annotation.XmlType; + +@XmlRootElement(name = "book") +@XmlType(propOrder = { "id", "name", "date" }) +public class Book { + private Long id; + private String name; + private String author; + private Date date; + + @XmlAttribute + public void setId(Long id) { + this.id = id; + } + + @XmlElement(name = "title") + public void setName(String name) { + this.name = name; + } + + @XmlTransient + public void setAuthor(String author) { + this.author = author; + } + + public String getName() { + return name; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public Long getId() { + return id; + } + + public String getAuthor() { + return author; + } + + @Override + public String toString() { + return "Book [id=" + id + ", name=" + name + ", author=" + author + ", date=" + date + "]"; + } +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java new file mode 100644 index 0000000000..6631525619 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/DateAdapter.java @@ -0,0 +1,28 @@ +package com.baeldung.jaxb; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.xml.bind.annotation.adapters.XmlAdapter; + +public class DateAdapter extends XmlAdapter { + + private static final ThreadLocal dateFormat = new ThreadLocal() { + + @Override + protected DateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } + }; + + @Override + public Date unmarshal(String v) throws Exception { + return dateFormat.get().parse(v); + } + + @Override + public String marshal(Date v) throws Exception { + return dateFormat.get().format(v); + } +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/Main.java b/jaxb/src/main/java/com/baeldung/jaxb/Main.java new file mode 100644 index 0000000000..aaf062dd4e --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/Main.java @@ -0,0 +1,39 @@ +package com.baeldung.jaxb; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Date; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; + +public class Main { + public static void marshal() throws JAXBException, IOException { + Book book = new Book(); + book.setId(1L); + book.setName("Book1"); + book.setAuthor("Author1"); + book.setDate(new Date()); + + JAXBContext context = JAXBContext.newInstance(Book.class); + Marshaller marshaller = context.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + marshaller.marshal(book, new File("./book.xml")); + } + + public static Book unMashal() throws JAXBException, IOException { + JAXBContext context = JAXBContext.newInstance(Book.class); + Unmarshaller unmarshaller = context.createUnmarshaller(); + Book book = (Book) unmarshaller.unmarshal(new FileReader("./book.xml")); + return book; + } + + public static void main(String[] args) throws JAXBException, IOException { + marshal(); + Book book = unMashal(); + System.out.println(book.toString()); + } +} diff --git a/jaxb/src/main/resources/global.xjb b/jaxb/src/main/resources/global.xjb new file mode 100644 index 0000000000..de9dcf1577 --- /dev/null +++ b/jaxb/src/main/resources/global.xjb @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/jaxb/src/main/resources/logback.xml b/jaxb/src/main/resources/logback.xml new file mode 100644 index 0000000000..8b566286b8 --- /dev/null +++ b/jaxb/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/jaxb/src/main/resources/user.xsd b/jaxb/src/main/resources/user.xsd new file mode 100644 index 0000000000..18d2b95d10 --- /dev/null +++ b/jaxb/src/main/resources/user.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 0110a3f75e84541134118e36ac765115598be720 Mon Sep 17 00:00:00 2001 From: "nguyenminhtuanfit@gmail.com" Date: Mon, 14 Nov 2016 21:14:09 +0700 Subject: [PATCH 3/3] change pointcut name --- aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj index 3bdddd22a8..2ddf03192b 100644 --- a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj +++ b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj @@ -24,7 +24,7 @@ public aspect AccountAspect { } } - after(int amount, Account balance) : callAtWithDraw(amount, balance) { + after(int amount, Account balance) : callWithDraw(amount, balance) { logger.info("Balance after withdrawal : {}", balance.balance); } }