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[] 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[] 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 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 @@ + + + + + + <ui:insert name="title">Defautl title</ui:insert> + + + + +

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