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..2ddf03192b
--- /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) : callWithDraw(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
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