diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0bede59
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,92 @@
+# 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
+*.dat
+
+# 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
+/ejbdemo/testdb/
diff --git a/.idea/artifacts/jsfdemo_ejb_exploded.xml b/.idea/artifacts/jsfdemo_ejb_exploded.xml
new file mode 100644
index 0000000..90e7411
--- /dev/null
+++ b/.idea/artifacts/jsfdemo_ejb_exploded.xml
@@ -0,0 +1,9 @@
+
+
+ $PROJECT_DIR$/out/artifacts/jsfdemo_ejb_exploded
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/jsfdemo_war_exploded.xml b/.idea/artifacts/jsfdemo_war_exploded.xml
new file mode 100644
index 0000000..e03b8e1
--- /dev/null
+++ b/.idea/artifacts/jsfdemo_war_exploded.xml
@@ -0,0 +1,23 @@
+
+
+ $PROJECT_DIR$/jsfdemo/target/jsfdemo-1.0-SNAPSHOT
+
+
+ true
+ jsfdemo
+ war
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..b9d18bf
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..5264490
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..cff944a
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..a60049d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Angular
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/beanvalidationdemo/beanvalidationdemo.iml b/beanvalidationdemo/beanvalidationdemo.iml
new file mode 100644
index 0000000..74f3f13
--- /dev/null
+++ b/beanvalidationdemo/beanvalidationdemo.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/beanvalidationdemo/pom.xml b/beanvalidationdemo/pom.xml
new file mode 100644
index 0000000..49fb236
--- /dev/null
+++ b/beanvalidationdemo/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+ beanvalidationdemo
+ beanvalidationdemo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.hibernate
+ hibernate-validator
+
+
+ org.glassfish
+ javax.el
+
+
+ org.jboss.weld.se
+ weld-se-core
+
+
+ org.projectlombok
+ lombok
+
+
+ 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
+
+
+
+
+
+
+
diff --git a/beanvalidationdemo/src/main/java/it/plague/jeedemo/Address.java b/beanvalidationdemo/src/main/java/it/plague/jeedemo/Address.java
new file mode 100644
index 0000000..c5ba402
--- /dev/null
+++ b/beanvalidationdemo/src/main/java/it/plague/jeedemo/Address.java
@@ -0,0 +1,32 @@
+package it.plague.jeedemo;
+
+import javax.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Address {
+
+ @NotNull
+ private String street1;
+ private String street2;
+ @NotNull
+ private String city;
+ private String state;
+ @NotNull
+ @ZipCode
+ private String zipCode;
+ private String coutry;
+
+ public Address(@NotNull String street1, @NotNull String city, String state,
+ @NotNull String zipCode, String coutry) {
+ this.street1 = street1;
+ this.city = city;
+ this.state = state;
+ this.zipCode = zipCode;
+ this.coutry = coutry;
+ }
+}
diff --git a/beanvalidationdemo/src/main/java/it/plague/jeedemo/Customer.java b/beanvalidationdemo/src/main/java/it/plague/jeedemo/Customer.java
new file mode 100644
index 0000000..8aa40dd
--- /dev/null
+++ b/beanvalidationdemo/src/main/java/it/plague/jeedemo/Customer.java
@@ -0,0 +1,31 @@
+package it.plague.jeedemo;
+
+import java.util.Date;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Past;
+import javax.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Customer {
+
+ @NotNull
+ @Size(min = 2)
+ private String firstName;
+ private String lastName;
+ @Email
+ private String email;
+ private String phoneNumber;
+ @Past
+ private Date dateOfBirth;
+ private Address deliveryAddress;
+
+ public Customer(
+ @NotNull @Size(min = 2) String firstName, String lastName, String email) {
+ this(firstName, lastName, email, null, null, null);
+ }
+}
diff --git a/beanvalidationdemo/src/main/java/it/plague/jeedemo/Email.java b/beanvalidationdemo/src/main/java/it/plague/jeedemo/Email.java
new file mode 100644
index 0000000..5cfd9dd
--- /dev/null
+++ b/beanvalidationdemo/src/main/java/it/plague/jeedemo/Email.java
@@ -0,0 +1,37 @@
+package it.plague.jeedemo;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import javax.validation.ReportAsSingleViolation;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+
+@Size(min = 7)
+@Pattern(regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\."
+ + "[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*"
+ + "@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
+@ReportAsSingleViolation
+@Constraint(validatedBy = {})
+@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Email {
+
+ String message() default "{it.plague.jeedemo.Email.message}";
+
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+
+ @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR, ElementType.PARAMETER})
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface List {
+
+ Email[] value();
+ }
+}
diff --git a/beanvalidationdemo/src/main/java/it/plague/jeedemo/USA.java b/beanvalidationdemo/src/main/java/it/plague/jeedemo/USA.java
new file mode 100644
index 0000000..aa4a2b7
--- /dev/null
+++ b/beanvalidationdemo/src/main/java/it/plague/jeedemo/USA.java
@@ -0,0 +1,14 @@
+package it.plague.jeedemo;
+
+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 USA {
+
+}
diff --git a/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCode.java b/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCode.java
new file mode 100644
index 0000000..ebf3d03
--- /dev/null
+++ b/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCode.java
@@ -0,0 +1,29 @@
+package it.plague.jeedemo;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+@Constraint(validatedBy = ZipCodeValidator.class)
+@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR, ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ZipCode {
+
+ String message() default "{it.plague.jeedemo.beanvalidation.ZipCode.message}";
+
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+
+ @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR, ElementType.PARAMETER})
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface List {
+
+ ZipCode[] value();
+ }
+}
diff --git a/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCodeChecker.java b/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCodeChecker.java
new file mode 100644
index 0000000..c72bbc1
--- /dev/null
+++ b/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCodeChecker.java
@@ -0,0 +1,9 @@
+package it.plague.jeedemo;
+
+public class ZipCodeChecker {
+
+ public boolean isZipCodeValid(String value) {
+ // TODO it's not important for this example, here could you do anything do you want
+ return true;
+ }
+}
diff --git a/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCodeValidator.java b/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCodeValidator.java
new file mode 100644
index 0000000..199d0b3
--- /dev/null
+++ b/beanvalidationdemo/src/main/java/it/plague/jeedemo/ZipCodeValidator.java
@@ -0,0 +1,38 @@
+package it.plague.jeedemo;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.inject.Inject;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+public class ZipCodeValidator implements ConstraintValidator {
+
+ /**
+ * FIXME
+ * this attribute not work, because @Produce
+ * not defined
+ */
+ @Inject
+ @USA
+ private ZipCodeChecker checker;
+
+ private Pattern zipPattern = Pattern.compile("\\d{5}(-\\d{5})?");
+
+ @Override
+ public void initialize(ZipCode zipCode) {
+
+ }
+
+ @Override
+ public boolean isValid(String value, ConstraintValidatorContext context) {
+ if (value == null) {
+ return true;
+ }
+ Matcher m = zipPattern.matcher(value);
+ if (!m.matches()) {
+ return false;
+ }
+ return checker.isZipCodeValid(value);
+ }
+}
diff --git a/beanvalidationdemo/src/main/resources/META-INF/beans.xml b/beanvalidationdemo/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..8819456
--- /dev/null
+++ b/beanvalidationdemo/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/beanvalidationdemo/src/main/resources/ValidationMessages.properties b/beanvalidationdemo/src/main/resources/ValidationMessages.properties
new file mode 100644
index 0000000..627fe5e
--- /dev/null
+++ b/beanvalidationdemo/src/main/resources/ValidationMessages.properties
@@ -0,0 +1 @@
+it.plague.jeedemo.Email.message=invalid email address
\ No newline at end of file
diff --git a/beanvalidationdemo/src/test/java/it/plague/jeedemo/AddressIT.java b/beanvalidationdemo/src/test/java/it/plague/jeedemo/AddressIT.java
new file mode 100644
index 0000000..5d850e7
--- /dev/null
+++ b/beanvalidationdemo/src/test/java/it/plague/jeedemo/AddressIT.java
@@ -0,0 +1,23 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.*;
+
+import java.util.Set;
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import org.junit.Test;
+
+public class AddressIT {
+
+ @Test
+ public void shouldRaiseConstraintViolationCauseInvalidZipCode() {
+ ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
+ Validator validator = vf.getValidator();
+ Address address = new Address("233 Spring Street", "New York", "NY", "DUMMY", "USA");
+ Set> violations = validator.validate(address);
+ assertEquals(1, violations.size());
+ vf.close();
+ }
+}
diff --git a/beanvalidationdemo/src/test/java/it/plague/jeedemo/CustomerIT.java b/beanvalidationdemo/src/test/java/it/plague/jeedemo/CustomerIT.java
new file mode 100644
index 0000000..e2b668c
--- /dev/null
+++ b/beanvalidationdemo/src/test/java/it/plague/jeedemo/CustomerIT.java
@@ -0,0 +1,48 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Set;
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class CustomerIT {
+
+ private static ValidatorFactory vf;
+ private static Validator validator;
+
+ @BeforeClass
+ public static void init() {
+ vf = Validation.buildDefaultValidatorFactory();
+ validator = vf.getValidator();
+ }
+
+ @AfterClass
+ public static void close() {
+ vf.close();
+ }
+
+ @Test
+ public void shouldRaiseNoConstraintViolation() {
+ Customer customer = new Customer("John", "Smith", "jsmith@gmail.com");
+ Set> violations = validator.validate(customer);
+ assertEquals(0, violations.size());
+ }
+
+ @Test
+ public void shouldRaiseConstraintViolationCauseInvalidEmail() {
+ Customer customer = new Customer("John", "Smith", "DummyEmail");
+ Set> violations = validator.validate(customer);
+ assertEquals(1, violations.size());
+ assertEquals("invalid email address", violations.iterator().next().getMessage());
+ assertEquals("DummyEmail", violations.iterator().next().getInvalidValue());
+ assertEquals("{it.plague.jeedemo.Email.message}",
+ violations.iterator().next().getMessageTemplate());
+ }
+}
diff --git a/beanvalidationdemo/src/test/resources/META-INF/beans.xml b/beanvalidationdemo/src/test/resources/META-INF/beans.xml
new file mode 100644
index 0000000..8819456
--- /dev/null
+++ b/beanvalidationdemo/src/test/resources/META-INF/beans.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/cdidemo/cdidemo.iml b/cdidemo/cdidemo.iml
new file mode 100644
index 0000000..74f3f13
--- /dev/null
+++ b/cdidemo/cdidemo.iml
@@ -0,0 +1,2 @@
+
+
\ 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/ejbdemo/ejbdemo.iml b/ejbdemo/ejbdemo.iml
new file mode 100644
index 0000000..423fba3
--- /dev/null
+++ b/ejbdemo/ejbdemo.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ejbdemo/pom.xml b/ejbdemo/pom.xml
new file mode 100644
index 0000000..b5408c4
--- /dev/null
+++ b/ejbdemo/pom.xml
@@ -0,0 +1,85 @@
+
+
+
+ 4.0.0
+ ejbdemo
+ ejbdemo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.eclipse.persistence
+ org.eclipse.persistence.jpa
+
+
+ org.eclipse.persistence
+ org.eclipse.persistence.jpa.modelgen.processor
+ 2.5.0
+ provided
+
+
+ org.hibernate
+ hibernate-validator
+
+
+ org.glassfish
+ javax.el
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+ provided
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 2.12.4
+
+
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+
+
diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/Book.java b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java
new file mode 100644
index 0000000..541f323
--- /dev/null
+++ b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java
@@ -0,0 +1,37 @@
+package it.plague.jeedemo;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Entity
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@NamedQuery(name = "Book.findAll", query = "select b from Book b")
+public class Book implements Serializable {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+ @NotNull
+ @Column(nullable = false)
+ private String title;
+ private Float price;
+ @Size(max = 2000)
+ @Column(length = 2000)
+ private String description;
+ private String isbn;
+ private Integer nbOfPage;
+ private Boolean illustrations;
+}
diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java
new file mode 100644
index 0000000..4fa19e9
--- /dev/null
+++ b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java
@@ -0,0 +1,39 @@
+package it.plague.jeedemo;
+
+import java.util.List;
+import javax.ejb.LocalBean;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+import javax.validation.constraints.NotNull;
+
+@Stateless
+@LocalBean
+public class BookEJB implements BookEJBRemote {
+
+ @Inject
+ private EntityManager em;
+
+ @Override
+ public List findBooks() {
+ TypedQuery query = em.createNamedQuery("Book.findAll", Book.class);
+ return query.getResultList();
+ }
+
+ @Override
+ public @NotNull Book createBook(@NotNull Book book) {
+ em.persist(book);
+ return book;
+ }
+
+ @Override
+ public @NotNull Book updateBook(@NotNull Book book) {
+ return em.merge(book);
+ }
+
+ @Override
+ public void deleteBook(@NotNull Book book) {
+ em.remove(em.merge(book));
+ }
+}
diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java
new file mode 100644
index 0000000..523fca0
--- /dev/null
+++ b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java
@@ -0,0 +1,16 @@
+package it.plague.jeedemo;
+
+import java.util.List;
+import javax.ejb.Remote;
+
+@Remote
+public interface BookEJBRemote {
+
+ List findBooks();
+
+ Book createBook(Book book);
+
+ void deleteBook(Book book);
+
+ Book updateBook(Book book);
+}
diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java
new file mode 100644
index 0000000..9c5ab0c
--- /dev/null
+++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java
@@ -0,0 +1,56 @@
+package it.plague.jeedemo;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+import javax.inject.Inject;
+
+
+@Startup
+@Singleton
+@DataSourceDefinition(
+ className = "org.apache.derby.jdbc.EmbeddedDataSource",
+ name = "java:global/jdbc/ejbdemoDS",
+ user = "APP",
+ password = "APP",
+ databaseName = "testdb",
+ properties = {"connectionAttributes=;create=true"})
+public class DatabasePopulator {
+
+ @Inject
+ private BookEJB bookEJB;
+
+ private Book h2g2;
+ private Book lord;
+
+ @PostConstruct
+ private void populateDB() {
+ h2g2 = Book.builder()
+ .title("Beginning Java EE 7")
+ .price(35f)
+ .description("Great book")
+ .isbn("1-8763-9125-7")
+ .nbOfPage(605)
+ .illustrations(true)
+ .build();
+ lord = Book.builder()
+ .title("The Lord of the Rings")
+ .price(50.4f)
+ .description("SciFi")
+ .isbn("1-84023-742-2")
+ .nbOfPage(1216)
+ .illustrations(true)
+ .build();
+
+ bookEJB.createBook(h2g2);
+ bookEJB.createBook(lord);
+ }
+
+ @PreDestroy
+ private void clearDB() {
+ bookEJB.deleteBook(h2g2);
+ bookEJB.deleteBook(lord);
+ }
+}
diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java
new file mode 100644
index 0000000..a9087da
--- /dev/null
+++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java
@@ -0,0 +1,12 @@
+package it.plague.jeedemo;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+public class DatabaseProducer {
+
+ @Produces
+ @PersistenceContext(unitName = "ejbdemoPU")
+ private EntityManager em;
+}
diff --git a/ejbdemo/src/main/resources/META-INF/beans.xml b/ejbdemo/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..5c49eb7
--- /dev/null
+++ b/ejbdemo/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/ejbdemo/src/main/resources/META-INF/persistence.xml b/ejbdemo/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..ed7b83f
--- /dev/null
+++ b/ejbdemo/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ java:global/jdbc/ejbdemoDS
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java
new file mode 100644
index 0000000..4bff095
--- /dev/null
+++ b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java
@@ -0,0 +1,56 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import javax.ejb.embeddable.EJBContainer;
+import javax.naming.Context;
+import org.junit.Test;
+
+public class BookEJBIT {
+
+ @Test
+ public void shouldCreateABook() throws Exception {
+ Map properties = new HashMap<>();
+ properties.put(EJBContainer.MODULES, new File("target/classes"));
+ try (EJBContainer ec = EJBContainer.createEJBContainer(properties)) {
+ Context ctx = ec.getContext();
+
+ // Check JNDI dependencies (Datasource and EJBs)
+ assertNotNull(ctx.lookup("java:global/jdbc/ejbdemoDS"));
+ assertNotNull(ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJBRemote"));
+ assertNotNull(ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB"));
+
+ // Looks up the EJB
+ BookEJB bookEJB = (BookEJB) ctx
+ .lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB");
+
+ // Find all the books and makes sure there are two (inserted by the DBPopulator)
+ assertEquals(2, bookEJB.findBooks().size());
+
+ // Creates an instance of book;
+ Book book = Book.builder()
+ .title("H2G2")
+ .price(12.5f)
+ .description("Scifi book")
+ .isbn("1-24561-799-0")
+ .nbOfPage(354)
+ .illustrations(false)
+ .build();
+ book = bookEJB.createBook(book);
+ assertNotNull("ID should not be null", book.getId());
+
+ // Find all the books and makes sure is an extra one
+ assertEquals(3, bookEJB.findBooks().size());
+
+ // Removes the created book
+ bookEJB.deleteBook(book);
+
+ // Finds all the books and makes sure there is one less
+ assertEquals(2, bookEJB.findBooks().size());
+ }
+ }
+}
diff --git a/jaxrsdemo/jaxrsdemo.iml b/jaxrsdemo/jaxrsdemo.iml
new file mode 100644
index 0000000..6a56488
--- /dev/null
+++ b/jaxrsdemo/jaxrsdemo.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jaxrsdemo/pom.xml b/jaxrsdemo/pom.xml
new file mode 100644
index 0000000..3380df3
--- /dev/null
+++ b/jaxrsdemo/pom.xml
@@ -0,0 +1,85 @@
+
+
+ 4.0.0
+ jaxrsdemo
+ war
+ jaxrsdemo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.eclipse.persistence
+ org.eclipse.persistence.jpa
+
+
+ org.eclipse.persistence
+ org.eclipse.persistence.jpa.modelgen.processor
+ 2.5.0
+ provided
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+ provided
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 3.2.2
+
+ false
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 2.12.4
+
+
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+
+
diff --git a/jaxrsdemo/src/main/java/it/plague/jeedemo/ApplicationConfig.java b/jaxrsdemo/src/main/java/it/plague/jeedemo/ApplicationConfig.java
new file mode 100644
index 0000000..fa87e3c
--- /dev/null
+++ b/jaxrsdemo/src/main/java/it/plague/jeedemo/ApplicationConfig.java
@@ -0,0 +1,23 @@
+package it.plague.jeedemo;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("rs")
+public class ApplicationConfig extends Application {
+
+ @Override
+ public Set> getClasses() {
+ Set> resources = new HashSet<>();
+ addRestResources(resources);
+ return resources;
+ }
+
+ private void addRestResources(Set> resources) {
+ resources.add(it.plague.jeedemo.BookRestService.class);
+ resources.add(org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.class);
+ }
+
+}
diff --git a/jaxrsdemo/src/main/java/it/plague/jeedemo/Book.java b/jaxrsdemo/src/main/java/it/plague/jeedemo/Book.java
new file mode 100644
index 0000000..1551ee2
--- /dev/null
+++ b/jaxrsdemo/src/main/java/it/plague/jeedemo/Book.java
@@ -0,0 +1,43 @@
+package it.plague.jeedemo;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.xml.bind.annotation.XmlRootElement;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Entity
+@XmlRootElement
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@NamedQuery(name = Book.FIND_ALL, query = "select b from Book b")
+public class Book {
+
+ public static final String FIND_ALL = "FIND_ALL";
+
+ @Id
+ @GeneratedValue
+ private String id;
+
+ @Column(nullable = false)
+ private String title;
+
+ private Float price;
+
+ @Column(length = 2000)
+ private String description;
+
+ private String isbn;
+
+ private Integer nbOfPage;
+
+ private Boolean illustrations;
+
+}
diff --git a/jaxrsdemo/src/main/java/it/plague/jeedemo/BookRestService.java b/jaxrsdemo/src/main/java/it/plague/jeedemo/BookRestService.java
new file mode 100644
index 0000000..b90387f
--- /dev/null
+++ b/jaxrsdemo/src/main/java/it/plague/jeedemo/BookRestService.java
@@ -0,0 +1,75 @@
+package it.plague.jeedemo;
+
+import java.net.URI;
+import javax.ejb.Stateless;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+import javax.ws.rs.BadRequestException;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+@Path("/book")
+@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+@Stateless
+public class BookRestService {
+
+ @PersistenceContext(name = "jaxrsPU")
+ private EntityManager em;
+
+ @Context
+ private UriInfo uriInfo;
+
+ @GET
+ public Response getBooks() {
+ TypedQuery query = em.createNamedQuery(Book.FIND_ALL, Book.class);
+ Books books = new Books(query.getResultList());
+ return Response.ok(books).build();
+ }
+
+ @GET
+ @Path("{id}")
+ public Response getBook(@PathParam("id") String id) {
+ Book book = em.find(Book.class, id);
+ if (book == null) {
+ throw new NotFoundException();
+ }
+ return Response.ok(book)
+ .build();
+ }
+
+ @POST
+ public Response createBook(Book book) {
+ if (book == null) {
+ throw new BadRequestException();
+ }
+ em.persist(book);
+ URI location = uriInfo.getAbsolutePathBuilder()
+ .path(book.getId())
+ .build();
+ return Response.created(location).build();
+ }
+
+ @DELETE
+ @Path("{id}")
+ public Response deleteBook(@PathParam("id") String id) {
+ Book book = em.find(Book.class, id);
+ if (book == null) {
+ throw new NotFoundException();
+ }
+ em.remove(book);
+ return Response.noContent().build();
+ }
+
+}
diff --git a/jaxrsdemo/src/main/java/it/plague/jeedemo/Books.java b/jaxrsdemo/src/main/java/it/plague/jeedemo/Books.java
new file mode 100644
index 0000000..e66add2
--- /dev/null
+++ b/jaxrsdemo/src/main/java/it/plague/jeedemo/Books.java
@@ -0,0 +1,29 @@
+package it.plague.jeedemo;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@XmlRootElement
+@XmlSeeAlso(Book.class)
+public class Books extends ArrayList {
+
+ public Books(Collection extends Book> c) {
+ super(c);
+ }
+
+ @XmlElement(name = "book")
+ public List getBooks() {
+ return this;
+ }
+
+ public void setBooks(List books) {
+ this.addAll(books);
+ }
+
+}
diff --git a/jaxrsdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java b/jaxrsdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java
new file mode 100644
index 0000000..d19e387
--- /dev/null
+++ b/jaxrsdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java
@@ -0,0 +1,59 @@
+package it.plague.jeedemo;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+
+@Startup
+@Singleton
+@DataSourceDefinition(
+ className = "org.apache.derby.jdbc.EmbeddedDataSource",
+ name = "java:global/jdbc/jaxrsoPU",
+ user = "APP",
+ password = "APP",
+ databaseName = "testdb",
+ properties = {"connectionAttributes=;create=true"})
+public class DatabasePopulator {
+
+ @PersistenceContext(name = "jaxrsPU")
+ private EntityManager em;
+
+ private Book h2g2;
+ private Book lord;
+
+ @PostConstruct
+ private void populateDB() {
+ h2g2 = Book.builder()
+ .title("Beginning Java EE 7")
+ .price(35f)
+ .description("Great book")
+ .isbn("1-8763-9125-7")
+ .nbOfPage(605)
+ .illustrations(true)
+ .build();
+ lord = Book.builder()
+ .title("The Lord of the Rings")
+ .price(50.4f)
+ .description("SciFi")
+ .isbn("1-84023-742-2")
+ .nbOfPage(1216)
+ .illustrations(true)
+ .build();
+
+ em.persist(h2g2);
+ em.persist(lord);
+ }
+
+ @PreDestroy
+ private void clearDB() {
+ em.remove(h2g2);
+ em.remove(lord);
+ }
+
+}
diff --git a/jaxrsdemo/src/main/resources/META-INF/beans.xml b/jaxrsdemo/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000..5c49eb7
--- /dev/null
+++ b/jaxrsdemo/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/jaxrsdemo/src/main/resources/META-INF/persistence.xml b/jaxrsdemo/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..6ef6907
--- /dev/null
+++ b/jaxrsdemo/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ java:global/jdbc/jaxrsoPU
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jaxrsdemo/src/test/java/it/plague/jeedemo/BookRestServiceIT.java b/jaxrsdemo/src/test/java/it/plague/jeedemo/BookRestServiceIT.java
new file mode 100644
index 0000000..8702647
--- /dev/null
+++ b/jaxrsdemo/src/test/java/it/plague/jeedemo/BookRestServiceIT.java
@@ -0,0 +1,84 @@
+package it.plague.jeedemo;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.net.URI;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriBuilder;
+import org.junit.Test;
+
+public class BookRestServiceIT {
+
+ private static URI uri = UriBuilder.fromUri("http://localhost/jaxrsdemo-1.0-SNAPSHOT/rs/book")
+ .port(8080).build();
+
+ private static Client client = ClientBuilder.newClient();
+
+ @Test
+ public void shouldNotCreateANullBook() {
+ // POSTs a null book
+ Response response = client.target(uri)
+ .request()
+ .post(Entity.entity(null, MediaType.APPLICATION_XML));
+ assertThat(response.getStatus(), is(Status.BAD_REQUEST.getStatusCode()));
+ }
+
+ @Test
+ public void shouldNOtFindTheBookID() {
+ // GETs a book with an unknown ID
+ Response response = client.target(uri)
+ .path("unknownID")
+ .request()
+ .get();
+ assertThat(response.getStatus(), is(Status.NOT_FOUND.getStatusCode()));
+ }
+
+ @Test
+ public void shouldCreateAndDeleteABook() {
+ Book book = Book.builder()
+ .title("H2G2")
+ .price(12.5f)
+ .description("Science book")
+ .isbn("1-84023-742-2")
+ .nbOfPage(354)
+ .illustrations(false)
+ .build();
+
+ // POSTs a book
+ Response response = client.target(uri)
+ .request()
+ .post(Entity.entity(book, MediaType.APPLICATION_XML));
+ assertThat(response.getStatus(), is(Status.CREATED.getStatusCode()));
+ URI bookUri = response.getLocation();
+
+ // With the location, GETs the book
+ response = client.target(bookUri)
+ .request()
+ .get();
+ book = response.readEntity(Book.class);
+ assertThat(response.getStatus(), is(Status.OK.getStatusCode()));
+ assertEquals("H2G2", book.getTitle());
+
+ // Gets the book id and DELETEs it
+ String bookId = bookUri.toString().split("/")[6];
+ response = client.target(uri)
+ .path(bookId)
+ .request()
+ .delete();
+ assertThat(response.getStatus(), is(Status.NO_CONTENT.getStatusCode()));
+
+ // GETs the book and checks it has been deleted
+ response = client.target(bookUri)
+ .request()
+ .get();
+ assertThat(response.getStatus(), is(Status.NOT_FOUND.getStatusCode()));
+ }
+
+}
diff --git a/jaxwsdemo-client/jaxwsdemo-client.iml b/jaxwsdemo-client/jaxwsdemo-client.iml
new file mode 100644
index 0000000..c49e5ea
--- /dev/null
+++ b/jaxwsdemo-client/jaxwsdemo-client.iml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jaxwsdemo-client/pom.xml b/jaxwsdemo-client/pom.xml
new file mode 100644
index 0000000..60ce946
--- /dev/null
+++ b/jaxwsdemo-client/pom.xml
@@ -0,0 +1,96 @@
+
+
+ 4.0.0
+ jaxwsdemo-client
+ jaxwsdemo-client
+ jar
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+
+
+ junit
+ junit
+
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ add-source
+ generate-sources
+
+ add-source
+
+
+
+ ${project.build.directory}/generated-sources/wsimport/
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.4
+
+
+
+ it.plague.jeedemo.WebServiceConsumer
+
+
+
+
+
+ org.jvnet.jax-ws-commons
+ jaxws-maven-plugin
+ 2.2
+
+
+
+ wsimport
+
+
+
+
+ http://localhost:8080/jaxwsdemo-service-1.0-SNAPSHOT/CardValidatorService?wsdl
+
+
+ true
+
+
+
+
+
+
+
diff --git a/jaxwsdemo-client/src/main/java/it/plague/jeedemo/WebServiceConsumer.java b/jaxwsdemo-client/src/main/java/it/plague/jeedemo/WebServiceConsumer.java
new file mode 100644
index 0000000..c0a392f
--- /dev/null
+++ b/jaxwsdemo-client/src/main/java/it/plague/jeedemo/WebServiceConsumer.java
@@ -0,0 +1,20 @@
+package it.plague.jeedemo;
+
+import javax.xml.ws.WebServiceRef;
+
+public class WebServiceConsumer {
+
+ @WebServiceRef
+ private static CardValidatorService cardValidatorService;
+
+ public static void main(String[] args) {
+ CreditCard creditCard = new CreditCard();
+ creditCard.setNumber("12341234");
+ creditCard.setExpiryDate("10/12");
+ creditCard.setType("VISA");
+ creditCard.setControlNumber(1234);
+
+ Validator cardValidator = cardValidatorService.getCardValidatorPort();
+ System.out.println(cardValidator.validate(creditCard));
+ }
+}
diff --git a/jaxwsdemo-service/jaxwsdemoservice.iml b/jaxwsdemo-service/jaxwsdemoservice.iml
new file mode 100644
index 0000000..78b2cc5
--- /dev/null
+++ b/jaxwsdemo-service/jaxwsdemoservice.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/jaxwsdemo-service/pom.xml b/jaxwsdemo-service/pom.xml
new file mode 100644
index 0000000..36901ff
--- /dev/null
+++ b/jaxwsdemo-service/pom.xml
@@ -0,0 +1,72 @@
+
+
+ 4.0.0
+ jaxwsdemo-service
+ jaxwsdemo-service
+ war
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+
+
+ org.projectlombok
+ lombok
+
+
+ junit
+ junit
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 3.2.2
+
+ false
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 2.12.4
+
+
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+
+
diff --git a/jaxwsdemo-service/src/main/java/it/plague/jeedemo/CardValidator.java b/jaxwsdemo-service/src/main/java/it/plague/jeedemo/CardValidator.java
new file mode 100644
index 0000000..86ad14e
--- /dev/null
+++ b/jaxwsdemo-service/src/main/java/it/plague/jeedemo/CardValidator.java
@@ -0,0 +1,13 @@
+package it.plague.jeedemo;
+
+import javax.jws.WebService;
+
+@WebService(endpointInterface = "it.plague.jeedemo.Validator")
+public class CardValidator implements Validator {
+
+ @Override
+ public boolean validate(CreditCard creditCard) {
+ Character lastDigit = creditCard.getNumber().charAt(creditCard.getNumber().length() - 1);
+ return Integer.parseInt(lastDigit.toString()) % 2 == 0;
+ }
+}
diff --git a/jaxwsdemo-service/src/main/java/it/plague/jeedemo/CreditCard.java b/jaxwsdemo-service/src/main/java/it/plague/jeedemo/CreditCard.java
new file mode 100644
index 0000000..9d9816e
--- /dev/null
+++ b/jaxwsdemo-service/src/main/java/it/plague/jeedemo/CreditCard.java
@@ -0,0 +1,30 @@
+package it.plague.jeedemo;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class CreditCard {
+
+ @XmlAttribute(required = true)
+ private String number;
+
+ @XmlAttribute(name = "expiry_date", required = true)
+ private String expiryDate;
+
+ @XmlAttribute(name = "control_number", required = true)
+ private Integer controlNumber;
+
+ @XmlAttribute(required = true)
+ private String type;
+
+}
diff --git a/jaxwsdemo-service/src/main/java/it/plague/jeedemo/Validator.java b/jaxwsdemo-service/src/main/java/it/plague/jeedemo/Validator.java
new file mode 100644
index 0000000..4da1dbb
--- /dev/null
+++ b/jaxwsdemo-service/src/main/java/it/plague/jeedemo/Validator.java
@@ -0,0 +1,9 @@
+package it.plague.jeedemo;
+
+import javax.jws.WebService;
+
+@WebService
+public interface Validator {
+
+ boolean validate(CreditCard creditCard);
+}
diff --git a/jaxwsdemo-service/src/test/java/it/plague/jeedemo/CardValidatorIT.java b/jaxwsdemo-service/src/test/java/it/plague/jeedemo/CardValidatorIT.java
new file mode 100644
index 0000000..34caabf
--- /dev/null
+++ b/jaxwsdemo-service/src/test/java/it/plague/jeedemo/CardValidatorIT.java
@@ -0,0 +1,62 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.*;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Service;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CardValidatorIT {
+
+ private static Endpoint endpoint;
+
+ private static Validator cardValidator;
+
+ @BeforeClass
+ public static void setUp() throws MalformedURLException {
+ final String url = "http://localhost:8081/cardValidator";
+
+ // Publishes the SOAP Web Service
+ endpoint = Endpoint.publish(url, new CardValidator());
+
+ // Needed properties to access the web service
+ URL wsdlDocumentLocation = new URL(url + "?wsdl");
+ String namespaceURI = "http://jeedemo.plague.it/";
+ String servicePart = "CardValidatorService";
+ String portName = "CardValidatorPort";
+ QName serviceQn = new QName(namespaceURI, servicePart);
+ QName portQn = new QName(namespaceURI, portName);
+
+ // Creates a service instance
+ Service service = Service.create(wsdlDocumentLocation, serviceQn);
+ cardValidator = service.getPort(portQn, Validator.class);
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @Test
+ public void shouldBePublished() {
+ assertTrue(endpoint.isPublished());
+ assertEquals("http://schemas.xmlsoap.org/wsdl/soap/http", endpoint.getBinding().getBindingID());
+ }
+
+ @Test
+ public void shouldCheckCreditCardValidity() {
+ CreditCard creditCard = new CreditCard("12341234", "10/10", 1234, "VISA");
+ assertTrue("Credit card should be valid", cardValidator.validate(creditCard));
+
+ creditCard.setNumber("12341233");
+ assertFalse("Credit card should not be valid", cardValidator.validate(creditCard));
+ }
+
+}
diff --git a/jaxwsdemo-service/src/test/java/it/plague/jeedemo/CardValidatorTest.java b/jaxwsdemo-service/src/test/java/it/plague/jeedemo/CardValidatorTest.java
new file mode 100644
index 0000000..84b0826
--- /dev/null
+++ b/jaxwsdemo-service/src/test/java/it/plague/jeedemo/CardValidatorTest.java
@@ -0,0 +1,21 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class CardValidatorTest {
+
+ @Test
+ public void shouldCheckCreditCardValidity() {
+ CardValidator cardValidator = new CardValidator();
+
+ CreditCard creditCard = new CreditCard("12341234", "10/10", 1234, "VISA");
+ assertTrue("Credit card should be valid", cardValidator.validate(creditCard));
+
+ creditCard.setNumber("12341233");
+ assertFalse("Credit card should not be valid", cardValidator.validate(creditCard));
+ }
+
+}
diff --git a/jeedemo.iml b/jeedemo.iml
new file mode 100644
index 0000000..74f3f13
--- /dev/null
+++ b/jeedemo.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/jmsdemo/pom.xml b/jmsdemo/pom.xml
new file mode 100644
index 0000000..39bb98a
--- /dev/null
+++ b/jmsdemo/pom.xml
@@ -0,0 +1,66 @@
+
+
+ 4.0.0
+ jmsdemo
+ jmsdemo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+ provided
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 2.12.4
+
+
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+
+
diff --git a/jmsdemo/src/main/java/it/plague/jeedemo/ExpensiveOrderMDB.java b/jmsdemo/src/main/java/it/plague/jeedemo/ExpensiveOrderMDB.java
new file mode 100644
index 0000000..894a17c
--- /dev/null
+++ b/jmsdemo/src/main/java/it/plague/jeedemo/ExpensiveOrderMDB.java
@@ -0,0 +1,25 @@
+package it.plague.jeedemo;
+
+import javax.ejb.ActivationConfigProperty;
+import javax.ejb.MessageDriven;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+
+@MessageDriven(mappedName = "jms/javaee7/Topic",
+ activationConfig = {
+ @ActivationConfigProperty(propertyName = "acknowledgeMod", propertyValue = "Auto-acknowledge"),
+ @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "orderAmount > 1000")
+ })
+public class ExpensiveOrderMDB implements MessageListener {
+
+ @Override
+ public void onMessage(Message message) {
+ try {
+ OrderDTO order = message.getBody(OrderDTO.class);
+ System.out.println("Expensive order received: " + order);
+ } catch (JMSException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/jmsdemo/src/main/java/it/plague/jeedemo/OrderConsumer.java b/jmsdemo/src/main/java/it/plague/jeedemo/OrderConsumer.java
new file mode 100644
index 0000000..e47ccdc
--- /dev/null
+++ b/jmsdemo/src/main/java/it/plague/jeedemo/OrderConsumer.java
@@ -0,0 +1,29 @@
+package it.plague.jeedemo;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSContext;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+public class OrderConsumer {
+
+ public static void main(String[] args) throws NamingException {
+ // Get the JNDI context
+ Context jndiContext = new InitialContext();
+
+ // Looks up the administered objects
+ ConnectionFactory connectionFactory =
+ (ConnectionFactory) jndiContext.lookup("jms/javaee7/ConnectionFactory");
+ Destination destination =
+ (Destination) jndiContext.lookup("jms/javaee7/Topic");
+
+ try (JMSContext context = connectionFactory.createContext()) {
+ while (true) {
+ OrderDTO order = context.createConsumer(destination).receiveBody(OrderDTO.class);
+ System.out.println("Order received: " + order);
+ }
+ }
+ }
+}
diff --git a/jmsdemo/src/main/java/it/plague/jeedemo/OrderDTO.java b/jmsdemo/src/main/java/it/plague/jeedemo/OrderDTO.java
new file mode 100644
index 0000000..4f3f405
--- /dev/null
+++ b/jmsdemo/src/main/java/it/plague/jeedemo/OrderDTO.java
@@ -0,0 +1,18 @@
+package it.plague.jeedemo;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderDTO implements Serializable {
+
+ private Long orderId;
+ private Date creationDate;
+ private String customerName;
+ private Float totalAmount;
+}
diff --git a/jmsdemo/src/main/java/it/plague/jeedemo/OrderProducer.java b/jmsdemo/src/main/java/it/plague/jeedemo/OrderProducer.java
new file mode 100644
index 0000000..7429ab2
--- /dev/null
+++ b/jmsdemo/src/main/java/it/plague/jeedemo/OrderProducer.java
@@ -0,0 +1,32 @@
+package it.plague.jeedemo;
+
+import java.util.Date;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSContext;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+public class OrderProducer {
+
+ public static void main(String[] args) throws NamingException {
+ // Creates an orderDto with a total amount parameter
+ Float totalAmount = Float.valueOf(args[0]);
+ OrderDTO order = new OrderDTO(12342L, new Date(), "Betty Moreu", totalAmount);
+
+ // Get the JNDI context
+ Context jndiContext = new InitialContext();
+
+ // Looks up the administered objects
+ ConnectionFactory connectionFactory =
+ (ConnectionFactory) jndiContext.lookup("jms/javaee7/ConnectionFactory");
+ Destination destination =
+ (Destination) jndiContext.lookup("jms/javaee7/Topic");
+
+ try (JMSContext context = connectionFactory.createContext()) {
+ // Sends an object message to the topic
+ context.createProducer().setProperty("orderAmount", totalAmount).send(destination, order);
+ }
+ }
+}
diff --git a/jpademo/jpademo.iml b/jpademo/jpademo.iml
new file mode 100644
index 0000000..1b4d57b
--- /dev/null
+++ b/jpademo/jpademo.iml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jpademo/pom.xml b/jpademo/pom.xml
new file mode 100644
index 0000000..9af52a4
--- /dev/null
+++ b/jpademo/pom.xml
@@ -0,0 +1,82 @@
+
+
+ 4.0.0
+ jpademo
+ jpademo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.eclipse.persistence
+ org.eclipse.persistence.jpa
+
+
+ org.hibernate
+ hibernate-validator
+
+
+ org.glassfish
+ javax.el
+
+
+ org.apache.derby
+ derbyclient
+
+
+ org.apache.derby
+ derby
+ test
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 2.12.4
+
+
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+
+
diff --git a/jpademo/src/main/java/it/plague/jeedemo/Book.java b/jpademo/src/main/java/it/plague/jeedemo/Book.java
new file mode 100644
index 0000000..b1f20d5
--- /dev/null
+++ b/jpademo/src/main/java/it/plague/jeedemo/Book.java
@@ -0,0 +1,37 @@
+package it.plague.jeedemo;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Entity
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@NamedQueries({
+ @NamedQuery(name = "Book.findAll", query = "select b from Book b"),
+ @NamedQuery(name = "Book.findOneH2G2", query = "select b from Book b where b.title = 'H2G2'")
+})
+public @Data
+class Book {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+ @NotNull
+ private String title;
+ private Float price;
+ @Size(min = 10, max = 2000)
+ private String description;
+ private String isbn;
+ private Integer nbOfPage;
+ private Boolean illustrations;
+}
diff --git a/jpademo/src/main/resources/META-INF/insert.sql b/jpademo/src/main/resources/META-INF/insert.sql
new file mode 100644
index 0000000..2c8e481
--- /dev/null
+++ b/jpademo/src/main/resources/META-INF/insert.sql
@@ -0,0 +1,3 @@
+insert into book(id, title, description, illustrations, isbn, nbofpage, price) values (1000, 'Beginning Java EE 6', 'Best Java EE book ever', 1, '1234-5678', 450, 49)
+insert into book(id, title, description, illustrations, isbn, nbofpage, price) values (1001, 'Beginning Java EE 7', 'No, this is the best', 1, '5678-9012', 550, 53)
+insert into book(id, title, description, illustrations, isbn, nbofpage, price) values (1010, 'The Lord of the Rings', 'One ring to rule them all', 0, '1234-5678', 222, 23)
diff --git a/jpademo/src/main/resources/META-INF/persistence.xml b/jpademo/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..9835c63
--- /dev/null
+++ b/jpademo/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ org.eclipse.persistence.jpa.PersistenceProvider
+ it.plague.jeedemo.Book
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.eclipse.persistence.jpa.PersistenceProvider
+ it.plague.jeedemo.Book
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jpademo/src/test/java/it/plague/jeedemo/BookIT.java b/jpademo/src/test/java/it/plague/jeedemo/BookIT.java
new file mode 100644
index 0000000..765ed02
--- /dev/null
+++ b/jpademo/src/test/java/it/plague/jeedemo/BookIT.java
@@ -0,0 +1,70 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.validation.ConstraintViolationException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class BookIT {
+
+ private EntityManager em;
+
+ @Before
+ public void initEntityManager() {
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpademoTestUnit");
+ em = emf.createEntityManager();
+ }
+
+ @After
+ public void closeEntityManager() {
+ if (em != null) {
+ em.close();
+ }
+ }
+
+ @Test
+ public void shouldCreateJavaEE7Book() {
+ Book book = em.find(Book.class, 1001L);
+ assertEquals("Beginning Java EE 7", book.getTitle());
+ }
+
+ @Test
+ public void shouldCreateH2G2Book() {
+ Book book = Book.builder()
+ .title("H2G2")
+ .description("The Hitchhiker's Guide to the Galaxy")
+ .price(12.5f)
+ .isbn("1-84023-742-2")
+ .nbOfPage(354)
+ .illustrations(false)
+ .build();
+
+ em.getTransaction().begin();
+ em.persist(book);
+ em.getTransaction().commit();
+ assertNotNull("ID should not be null", book.getId());
+
+ book = em.createNamedQuery("Book.findOneH2G2", Book.class).getSingleResult();
+ assertEquals("The Hitchhiker's Guide to the Galaxy", book.getDescription());
+ }
+
+ @Test(expected = ConstraintViolationException.class)
+ public void shouldRaiseConstraintViolationCauseNullTitle() {
+ Book book = Book.builder()
+ .title(null)
+ .description("Null title, should fail")
+ .price(12.5f)
+ .isbn("1-84023-742-2")
+ .nbOfPage(354)
+ .illustrations(false)
+ .build();
+ em.persist(book);
+ }
+}
diff --git a/jsfdemo/jsfdemo.iml b/jsfdemo/jsfdemo.iml
new file mode 100644
index 0000000..0ae94f4
--- /dev/null
+++ b/jsfdemo/jsfdemo.iml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jsfdemo/pom.xml b/jsfdemo/pom.xml
new file mode 100644
index 0000000..830f992
--- /dev/null
+++ b/jsfdemo/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+ jsfdemo
+ war
+ jsfdemo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+ provided
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 3.2.2
+
+ false
+
+
+
+
+
diff --git a/jsfdemo/src/main/java/it/plague/jeedemo/Book.java b/jsfdemo/src/main/java/it/plague/jeedemo/Book.java
new file mode 100644
index 0000000..b877ec1
--- /dev/null
+++ b/jsfdemo/src/main/java/it/plague/jeedemo/Book.java
@@ -0,0 +1,47 @@
+package it.plague.jeedemo;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Entity
+@XmlRootElement
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@NamedQuery(name = Book.FIND_ALL, query = "select b from Book b")
+public class Book {
+
+ public static final String FIND_ALL = "FIND_ALL";
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @NotNull
+ @Size(min = 4, max = 50)
+ @Column(nullable = false)
+ private String title;
+
+ private Float price;
+
+ @Column(length = 2000)
+ private String description;
+
+ private String isbn;
+
+ private Integer nbOfPage;
+
+ private Boolean illustrations;
+
+}
diff --git a/jsfdemo/src/main/java/it/plague/jeedemo/BookEJB.java b/jsfdemo/src/main/java/it/plague/jeedemo/BookEJB.java
new file mode 100644
index 0000000..9931590
--- /dev/null
+++ b/jsfdemo/src/main/java/it/plague/jeedemo/BookEJB.java
@@ -0,0 +1,35 @@
+package it.plague.jeedemo;
+
+import java.util.List;
+import javax.annotation.sql.DataSourceDefinition;
+import javax.ejb.Stateless;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.persistence.EntityManager;
+
+@Named
+@Stateless
+@DataSourceDefinition(
+ name = "java:global/jdbc/lab11DS",
+ className = "org.apache.derby.jdbc.EmbeddedDriver",
+ url = "jdbc:derby:memory:lab11DB;create=true;user=app;password=app"
+)
+public class BookEJB {
+
+ @Inject
+ private EntityManager em;
+
+ public Book createBook(Book book) {
+ em.persist(book);
+ return book;
+ }
+
+ public List findAllBooks() {
+ return em.createNamedQuery(Book.FIND_ALL, Book.class).getResultList();
+ }
+
+ public Book findBookById(Long id) {
+ return em.find(Book.class, id);
+ }
+
+}
diff --git a/jsfdemo/src/main/java/it/plague/jeedemo/BookView.java b/jsfdemo/src/main/java/it/plague/jeedemo/BookView.java
new file mode 100644
index 0000000..77db08d
--- /dev/null
+++ b/jsfdemo/src/main/java/it/plague/jeedemo/BookView.java
@@ -0,0 +1,36 @@
+package it.plague.jeedemo;
+
+import javax.enterprise.context.RequestScoped;
+import javax.faces.application.FacesMessage;
+import javax.faces.context.FacesContext;
+import javax.inject.Inject;
+import javax.inject.Named;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Named
+@RequestScoped
+@NoArgsConstructor
+public class BookView {
+
+ @Inject
+ private BookEJB bookEJB;
+
+ @Getter
+ @Setter
+ private Book book = new Book();
+
+ public void doFindBookById() {
+ book = bookEJB.findBookById(book.getId());
+ }
+
+ public String doCreateBook() {
+ bookEJB.createBook(book);
+ FacesContext.getCurrentInstance().addMessage(null,
+ new FacesMessage(FacesMessage.SEVERITY_INFO, "Book created",
+ "The book " + book.getTitle() + " has been created with id = " + book.getId()));
+ return "newBook.xhtml";
+ }
+
+}
diff --git a/jsfdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java b/jsfdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java
new file mode 100644
index 0000000..d1c9dfb
--- /dev/null
+++ b/jsfdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java
@@ -0,0 +1,12 @@
+package it.plague.jeedemo;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+public class DatabaseProducer {
+
+ @Produces
+ @PersistenceContext(unitName = "jsfdemoPU")
+ private EntityManager em;
+}
diff --git a/jsfdemo/src/main/resources/META-INF/persistence.xml b/jsfdemo/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..84a6131
--- /dev/null
+++ b/jsfdemo/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ java:global/jdbc/lab11DS
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jsfdemo/src/main/webapp/WEB-INF/beans.xml b/jsfdemo/src/main/webapp/WEB-INF/beans.xml
new file mode 100644
index 0000000..ae0f4bf
--- /dev/null
+++ b/jsfdemo/src/main/webapp/WEB-INF/beans.xml
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/jsfdemo/src/main/webapp/WEB-INF/faces-config.xml b/jsfdemo/src/main/webapp/WEB-INF/faces-config.xml
new file mode 100644
index 0000000..c2df863
--- /dev/null
+++ b/jsfdemo/src/main/webapp/WEB-INF/faces-config.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/jsfdemo/src/main/webapp/WEB-INF/web.xml b/jsfdemo/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..aebe7b9
--- /dev/null
+++ b/jsfdemo/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,15 @@
+
+
+
+ Faces Servlet
+ javax.faces.webapp.FacesServlet
+ 1
+
+
+ Faces Servlet
+ *.xhtml
+
+
\ No newline at end of file
diff --git a/jsfdemo/src/main/webapp/layout.xhtml b/jsfdemo/src/main/webapp/layout.xhtml
new file mode 100644
index 0000000..109df1d
--- /dev/null
+++ b/jsfdemo/src/main/webapp/layout.xhtml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ Defautl title
+
+
+
+
+ Default title
+
+
+ Default content
+
+
+
+
diff --git a/jsfdemo/src/main/webapp/newBook.xhtml b/jsfdemo/src/main/webapp/newBook.xhtml
new file mode 100644
index 0000000..77c2a87
--- /dev/null
+++ b/jsfdemo/src/main/webapp/newBook.xhtml
@@ -0,0 +1,47 @@
+
+
+
+
+
+ Create new book
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ List of books
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsfdemo/src/main/webapp/viewBook.xhtml b/jsfdemo/src/main/webapp/viewBook.xhtml
new file mode 100644
index 0000000..938f0ce
--- /dev/null
+++ b/jsfdemo/src/main/webapp/viewBook.xhtml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+ View a book
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jsfdemo/src/test/java/it/plague/jeedemo/AppTest.java b/jsfdemo/src/test/java/it/plague/jeedemo/AppTest.java
new file mode 100644
index 0000000..5bd98cc
--- /dev/null
+++ b/jsfdemo/src/test/java/it/plague/jeedemo/AppTest.java
@@ -0,0 +1,20 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest
+{
+ /**
+ * Rigorous Test :-)
+ */
+ @Test
+ public void shouldAnswerWithTrue()
+ {
+ assertTrue( true );
+ }
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e3f84a3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,76 @@
+
+ 4.0.0
+ it.plague.jeedemo
+ jeedemo
+ 1.0-SNAPSHOT
+ pom
+ jeedemo
+
+
+ cdidemo
+ beanvalidationdemo
+ jpademo
+ ejbdemo
+ xmlandjsondemo
+ jmsdemo
+ jaxwsdemo-service
+ jaxrsdemo
+ jsfdemo
+
+
+
+
+
+ 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.glassfish.main.extras
+ glassfish-embedded-all
+ 4.1.2
+ provided
+
+
+ org.apache.derby
+ derby
+ 10.9.1.0
+ test
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
diff --git a/xmlandjsondemo/pom.xml b/xmlandjsondemo/pom.xml
new file mode 100644
index 0000000..601969e
--- /dev/null
+++ b/xmlandjsondemo/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+ xmlandjsondemo
+ xmlandjsondemo
+
+
+ jeedemo
+ it.plague.jeedemo
+ 1.0-SNAPSHOT
+
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ javax.json
+ javax.json-api
+ 1.1
+
+
+ org.glassfish
+ javax.json
+ 1.1
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 2.12.4
+
+
+ integration-test
+
+ integration-test
+ verify
+
+
+
+
+
+
+
diff --git a/xmlandjsondemo/src/main/java/it/plague/jeedemo/CreditCard.java b/xmlandjsondemo/src/main/java/it/plague/jeedemo/CreditCard.java
new file mode 100644
index 0000000..13ab105
--- /dev/null
+++ b/xmlandjsondemo/src/main/java/it/plague/jeedemo/CreditCard.java
@@ -0,0 +1,26 @@
+package it.plague.jeedemo;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class CreditCard {
+
+ @XmlAttribute
+ private String number;
+ @XmlElement(name = "expiry_date")
+ private String expiryDate;
+ @XmlElement(name = "control_number")
+ private Integer controlNumber;
+ private String type;
+}
diff --git a/xmlandjsondemo/src/test/java/it/plague/jeedemo/CreditCardJSonTest.java b/xmlandjsondemo/src/test/java/it/plague/jeedemo/CreditCardJSonTest.java
new file mode 100644
index 0000000..37c0307
--- /dev/null
+++ b/xmlandjsondemo/src/test/java/it/plague/jeedemo/CreditCardJSonTest.java
@@ -0,0 +1,37 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.*;
+
+import java.io.StringWriter;
+import javax.json.Json;
+import javax.json.stream.JsonGenerator;
+import org.junit.Test;
+
+public class CreditCardJSonTest {
+
+ public static final String creditCardJSon =
+ "{\"creditCard\":" +
+ "{\"number\":\"12345678\"," +
+ "\"expiryDate\":\"10/14\"," +
+ "\"controlNumber\":566," +
+ "\"type\":\"Visa\"}" +
+ "}";
+
+ @Test
+ public void shouldGenerateACreditCard() {
+ CreditCard creditCard = new CreditCard("12345678", "10/14", 566, "Visa");
+ StringWriter writer = new StringWriter();
+ JsonGenerator generator = Json.createGenerator(writer);
+ generator.writeStartObject()
+ .writeStartObject("creditCard")
+ .write("number", creditCard.getNumber())
+ .write("expiryDate", creditCard.getExpiryDate())
+ .write("controlNumber", creditCard.getControlNumber())
+ .write("type", creditCard.getType())
+ .writeEnd()
+ .writeEnd()
+ .close();
+ assertEquals(creditCardJSon, writer.toString().trim());
+ }
+
+}
diff --git a/xmlandjsondemo/src/test/java/it/plague/jeedemo/CreditCardXmlTest.java b/xmlandjsondemo/src/test/java/it/plague/jeedemo/CreditCardXmlTest.java
new file mode 100644
index 0000000..12d8119
--- /dev/null
+++ b/xmlandjsondemo/src/test/java/it/plague/jeedemo/CreditCardXmlTest.java
@@ -0,0 +1,46 @@
+package it.plague.jeedemo;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import org.junit.Test;
+
+public class CreditCardXmlTest {
+
+ public static final String creditCardXml =
+ "" +
+ "" +
+ "10/14" +
+ "566" +
+ "Visa" +
+ "";
+
+ @Test
+ public void shouldMarshallACreditCard() throws JAXBException {
+ CreditCard creditCard = new CreditCard("12345678", "10/14", 566, "Visa");
+ StringWriter writer = new StringWriter();
+ JAXBContext context = JAXBContext.newInstance(CreditCard.class);
+ Marshaller marshaller = context.createMarshaller();
+ marshaller.marshal(creditCard, writer);
+ System.out.println(writer);
+ assertEquals(creditCardXml, writer.toString().trim());
+ }
+
+ @Test
+ public void shouldUnmarshallACreditCard() throws JAXBException {
+ StringReader reader = new StringReader(creditCardXml);
+ JAXBContext context = JAXBContext.newInstance(CreditCard.class);
+ Unmarshaller unmarshaller = context.createUnmarshaller();
+ CreditCard creditCard = (CreditCard) unmarshaller.unmarshal(reader);
+ assertEquals("12345678", creditCard.getNumber());
+ assertEquals("10/14", creditCard.getExpiryDate());
+ assertEquals((Object) 566, creditCard.getControlNumber());
+ assertEquals("Visa", creditCard.getType());
+ }
+
+}
diff --git a/xmlandjsondemo/xmlandjsondemo.iml b/xmlandjsondemo/xmlandjsondemo.iml
new file mode 100644
index 0000000..78b2cc5
--- /dev/null
+++ b/xmlandjsondemo/xmlandjsondemo.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file