diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..84f198a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,90 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
diff --git a/cdidemo/cdidemo.iml b/cdidemo/cdidemo.iml
new file mode 100644
index 0000000..9d53095
--- /dev/null
+++ b/cdidemo/cdidemo.iml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cdidemo/pom.xml b/cdidemo/pom.xml
new file mode 100644
index 0000000..ac46184
--- /dev/null
+++ b/cdidemo/pom.xml
@@ -0,0 +1,75 @@
+
+
+ 4.0.0
+ cdidemo
+ cdidemo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ it.plague.jeedemo.CdiMain
+ 1.7
+ 1.7
+
+
+
+
+ org.jboss.weld.se
+ weld-se-core
+
+
+ junit
+ junit
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 2.5.1
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 2.12.4
+
+
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.2.1
+
+
+
+ java
+
+
+ it.plague.jeedemo.CdiMain
+
+
+
+
+
+
+
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/CdiMain.java b/cdidemo/src/main/java/it/plague/jeedemo/CdiMain.java
new file mode 100644
index 0000000..b770f49
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/CdiMain.java
@@ -0,0 +1,18 @@
+package it.plague.jeedemo;
+
+import it.plague.jeedemo.beans.Book;
+import it.plague.jeedemo.services.BookService;
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+
+public class CdiMain {
+
+ public static void main(String[] args) {
+ Weld weld = new Weld();
+ WeldContainer container = weld.initialize();
+ BookService bookService = container.instance().select(BookService.class).get();
+ Book book = bookService.createBook("H2G2", 12.5f, "Geeky scifi Book");
+ System.out.println(book);
+ weld.shutdown();
+ }
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/annotations/EightDigits.java b/cdidemo/src/main/java/it/plague/jeedemo/annotations/EightDigits.java
new file mode 100644
index 0000000..fe20882
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/annotations/EightDigits.java
@@ -0,0 +1,14 @@
+package it.plague.jeedemo.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
+public @interface EightDigits {
+
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/annotations/Loggable.java b/cdidemo/src/main/java/it/plague/jeedemo/annotations/Loggable.java
new file mode 100644
index 0000000..358020b
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/annotations/Loggable.java
@@ -0,0 +1,14 @@
+package it.plague.jeedemo.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.interceptor.InterceptorBinding;
+
+@InterceptorBinding
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Loggable {
+
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/annotations/ThirteenDigits.java b/cdidemo/src/main/java/it/plague/jeedemo/annotations/ThirteenDigits.java
new file mode 100644
index 0000000..d0f1da9
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/annotations/ThirteenDigits.java
@@ -0,0 +1,14 @@
+package it.plague.jeedemo.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
+public @interface ThirteenDigits {
+
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/beans/Book.java b/cdidemo/src/main/java/it/plague/jeedemo/beans/Book.java
new file mode 100644
index 0000000..900ea41
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/beans/Book.java
@@ -0,0 +1,58 @@
+package it.plague.jeedemo.beans;
+
+public class Book {
+
+ private String title;
+ private Float price;
+ private String description;
+ private String number;
+
+ public Book(String title, Float price, String description) {
+ this.title = title;
+ this.price = price;
+ this.description = description;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public Float getPrice() {
+ return price;
+ }
+
+ public void setPrice(Float price) {
+ this.price = price;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+
+ @Override
+ public String toString() {
+ return "Book{" +
+ "title='" + title + '\'' +
+ ", price=" + price +
+ ", description='" + description + '\'' +
+ ", number='" + number + '\'' +
+ '}';
+ }
+
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/beans/IsbnGenerator.java b/cdidemo/src/main/java/it/plague/jeedemo/beans/IsbnGenerator.java
new file mode 100644
index 0000000..314fb7e
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/beans/IsbnGenerator.java
@@ -0,0 +1,22 @@
+package it.plague.jeedemo.beans;
+
+import it.plague.jeedemo.annotations.Loggable;
+import it.plague.jeedemo.annotations.ThirteenDigits;
+import java.util.Random;
+import java.util.logging.Logger;
+import javax.inject.Inject;
+
+@ThirteenDigits
+public class IsbnGenerator implements NumberGenerator {
+
+ @Inject
+ private Logger logger;
+
+ @Override
+ @Loggable
+ public String generateNumber() {
+ String isbn = " 13-84356- " + Math.abs(new Random().nextInt());
+ logger.info("Generated ISBN: " + isbn);
+ return isbn;
+ }
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/beans/IssnGenerator.java b/cdidemo/src/main/java/it/plague/jeedemo/beans/IssnGenerator.java
new file mode 100644
index 0000000..3957a89
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/beans/IssnGenerator.java
@@ -0,0 +1,22 @@
+package it.plague.jeedemo.beans;
+
+import it.plague.jeedemo.annotations.EightDigits;
+import it.plague.jeedemo.annotations.Loggable;
+import java.util.Random;
+import java.util.logging.Logger;
+import javax.inject.Inject;
+
+@EightDigits
+public class IssnGenerator implements NumberGenerator {
+
+ @Inject
+ private Logger logger;
+
+ @Override
+ @Loggable
+ public String generateNumber() {
+ String issn = " 8- " + Math.abs(new Random().nextInt());
+ logger.info("Generated ISSN: " + issn);
+ return issn;
+ }
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/beans/NumberGenerator.java b/cdidemo/src/main/java/it/plague/jeedemo/beans/NumberGenerator.java
new file mode 100644
index 0000000..475c217
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/beans/NumberGenerator.java
@@ -0,0 +1,6 @@
+package it.plague.jeedemo.beans;
+
+public interface NumberGenerator {
+
+ String generateNumber();
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/interceptors/LoggingInterceptor.java b/cdidemo/src/main/java/it/plague/jeedemo/interceptors/LoggingInterceptor.java
new file mode 100644
index 0000000..1448da8
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/interceptors/LoggingInterceptor.java
@@ -0,0 +1,26 @@
+package it.plague.jeedemo.interceptors;
+
+import it.plague.jeedemo.annotations.Loggable;
+import java.util.logging.Logger;
+import javax.inject.Inject;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
+import javax.interceptor.InvocationContext;
+
+@Interceptor
+@Loggable
+public class LoggingInterceptor {
+
+ @Inject
+ private Logger logger;
+
+ @AroundInvoke
+ public Object logMethod(InvocationContext ic) throws Exception {
+ logger.entering(ic.getTarget().getClass().getName(), ic.getMethod().getName());
+ try {
+ return ic.proceed();
+ } finally {
+ logger.exiting(ic.getTarget().getClass().getName(), ic.getMethod().getName());
+ }
+ }
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/producers/LoggerProducer.java b/cdidemo/src/main/java/it/plague/jeedemo/producers/LoggerProducer.java
new file mode 100644
index 0000000..325f067
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/producers/LoggerProducer.java
@@ -0,0 +1,13 @@
+package it.plague.jeedemo.producers;
+
+import java.util.logging.Logger;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.InjectionPoint;
+
+public class LoggerProducer {
+
+ @Produces
+ public Logger produceLogger(InjectionPoint injectionPoint) {
+ return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
+ }
+}
diff --git a/cdidemo/src/main/java/it/plague/jeedemo/services/BookService.java b/cdidemo/src/main/java/it/plague/jeedemo/services/BookService.java
new file mode 100644
index 0000000..3edd102
--- /dev/null
+++ b/cdidemo/src/main/java/it/plague/jeedemo/services/BookService.java
@@ -0,0 +1,21 @@
+package it.plague.jeedemo.services;
+
+import it.plague.jeedemo.annotations.Loggable;
+import it.plague.jeedemo.annotations.ThirteenDigits;
+import it.plague.jeedemo.beans.Book;
+import it.plague.jeedemo.beans.NumberGenerator;
+import javax.inject.Inject;
+
+@Loggable
+public class BookService {
+
+ @Inject
+ @ThirteenDigits
+ private NumberGenerator numberGenerator;
+
+ public Book createBook(String title, Float price, String description) {
+ Book book = new Book(title, price, description);
+ book.setNumber(numberGenerator.generateNumber());
+ return book;
+ }
+}
diff --git a/cdidemo/src/main/resources/META-INF/beans.xml b/cdidemo/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..8819456
--- /dev/null
+++ b/cdidemo/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/cdidemo/src/test/java/it/plague/jeedemo/BookServiceIT.java b/cdidemo/src/test/java/it/plague/jeedemo/BookServiceIT.java
new file mode 100644
index 0000000..c3fb949
--- /dev/null
+++ b/cdidemo/src/test/java/it/plague/jeedemo/BookServiceIT.java
@@ -0,0 +1,22 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.assertTrue;
+
+import it.plague.jeedemo.beans.Book;
+import it.plague.jeedemo.services.BookService;
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+import org.junit.Test;
+
+public class BookServiceIT {
+
+ @Test
+ public void shouldCheckNumberIsMOCK() {
+ Weld weld = new Weld();
+ WeldContainer container = weld.initialize();
+ BookService bookService = container.instance().select(BookService.class).get();
+ Book book = bookService.createBook("H2G2", 12.5f, "Geeky scifi Book");
+ assertTrue(book.getNumber().startsWith("MOCK"));
+ weld.shutdown();
+ }
+}
diff --git a/cdidemo/src/test/java/it/plague/jeedemo/MockGenerator.java b/cdidemo/src/test/java/it/plague/jeedemo/MockGenerator.java
new file mode 100644
index 0000000..3cdfe26
--- /dev/null
+++ b/cdidemo/src/test/java/it/plague/jeedemo/MockGenerator.java
@@ -0,0 +1,25 @@
+package it.plague.jeedemo;
+
+import it.plague.jeedemo.annotations.Loggable;
+import it.plague.jeedemo.annotations.ThirteenDigits;
+import it.plague.jeedemo.beans.NumberGenerator;
+import java.util.Random;
+import java.util.logging.Logger;
+import javax.enterprise.inject.Alternative;
+import javax.inject.Inject;
+
+@Alternative
+@ThirteenDigits
+public class MockGenerator implements NumberGenerator {
+
+ @Inject
+ private Logger logger;
+
+ @Override
+ @Loggable
+ public String generateNumber() {
+ String mock = "MOCK- " + Math.abs(new Random().nextInt());
+ logger.info("Generated Mock: " + mock);
+ return mock;
+ }
+}
diff --git a/cdidemo/src/test/resources/META-INF/beans.xml b/cdidemo/src/test/resources/META-INF/beans.xml
new file mode 100644
index 0000000..0f77543
--- /dev/null
+++ b/cdidemo/src/test/resources/META-INF/beans.xml
@@ -0,0 +1,11 @@
+
+
+
+ it.plague.jeedemo.MockGenerator
+
+
+ it.plague.jeedemo.interceptors.LoggingInterceptor
+
+
\ No newline at end of file
diff --git a/jeedemo.iml b/jeedemo.iml
new file mode 100644
index 0000000..4fd5057
--- /dev/null
+++ b/jeedemo.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..11bc87b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,62 @@
+
+ 4.0.0
+ it.plague.jeedemo
+ jeedemo
+ 1.0-SNAPSHOT
+ pom
+ jeedemo
+
+
+ cdidemo
+
+
+
+
+
+ org.eclipse.persistence
+ org.eclipse.persistence.jpa
+ 2.5.0
+
+
+ org.hibernate
+ hibernate-validator
+ 6.0.16.Final
+
+
+ org.glassfish
+ javax.el
+ 3.0.1-b09
+
+
+ org.projectlombok
+ lombok
+ 1.18.6
+ provided
+
+
+ org.jboss.weld.se
+ weld-se-core
+ 2.0.0.Final
+
+
+ org.apache.derby
+ derbyclient
+ 10.9.1.0
+
+
+ org.apache.derby
+ derby
+ 10.9.1.0
+ test
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+