diff --git a/.gitignore b/.gitignore index d0d28d2b45afd48fb7a11c892cda38b567641906..861db796b3ae4ae0c2e53c823d05f43ca3ae4c1e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,6 @@ utils/src/main/resources/* *.jks *.p12 target/ -.classpath -.project .settings/ Thumbs.db diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java index f05f5a5ca1b4c59901d899a33eae690ed9409b71..87c8588218bea84ab9bd3168cc4089aa554b55b3 100644 --- a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java +++ b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.UUID; public class PersonDAO { - private EntityManager entityManager; + private final EntityManager entityManager; @Inject public PersonDAO(@H2Database EntityManager entityManager) { @@ -16,7 +16,7 @@ public class PersonDAO { } public List<Person> findAll() { - return entityManager.createNamedQuery("Person.findAll").getResultList(); + return entityManager.createNamedQuery("Person.findAll", Person.class).getResultList(); } public UUID persist(Person person) { @@ -25,7 +25,7 @@ public class PersonDAO { } public Person findByUUID(UUID uuid) { - return entityManager.createNamedQuery("Person.findByUUID", Person.class).setParameter("uuid",uuid).getSingleResult(); + return entityManager.createNamedQuery("Person.findByUUID", Person.class).setParameter("uuid", uuid).getSingleResult(); } } diff --git a/dao/src/main/resources/META-INF/beans.xml b/dao/src/main/resources/META-INF/beans.xml index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..efd69bc2d38663ae2f69879265843f8ff04aac04 100644 --- a/dao/src/main/resources/META-INF/beans.xml +++ b/dao/src/main/resources/META-INF/beans.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/beans_3_0.xsd" + bean-discovery-mode="all"> +</beans> \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 5ae1c98638980baaf2941b88b67298809f095a24..b1872955b06e1de629af0c5cefd3e00743d2e5ad 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -# syntax=docker/dockerfile:1 +# syntax=docker/dockerfile:1.3 ### First we build the application in docker in a controlled env FROM maven:3.8.3-eclipse-temurin-11 as build @@ -7,8 +7,11 @@ COPY ./ /app/ RUN --mount=type=cache,id=mvncache,target=/root/.m2/repository,rw \ mvn -B clean package + ### Then we add the builded war to a JEE server. -FROM payara/server-full:5.2021.9-jdk11 as server +#FROM payara/server-full:5.2021.9-jdk11 as server +FROM brunoe/payara:jdk11-6 as server + ARG STORE_PASSWORD=changeit ## Download the JDBC driver USER root @@ -16,7 +19,9 @@ RUN apt-get update && \ apt-get install -y wget unzip && \ rm -rf /var/lib/apt/lists/* && \ wget https://repo1.maven.org/maven2/com/h2database/h2/1.4.200/h2-1.4.200.jar \ - -O /tmp/h2.jar + -O /tmp/h2.jar && \ + cp /tmp/h2.jar /opt/payara/appserver/glassfish/domains/domain1/lib/h2.jar + USER payara ## This script adds a jdbc connection pool and ressource COPY docker/post-boot-commands.asadmin $POSTBOOT_COMMANDS @@ -29,8 +34,14 @@ COPY --from=build /app/utils/src/main/resources/mycert-pub.p12 /app/utils/src/m RUN keytool -importkeystore -noprompt -destkeystore /opt/payara/appserver/glassfish/domains/domain1/config/keystore.jks -srckeystore /tmp/mycert.p12 -srcstoretype PKCS12 -alias mycert -srcstorepass storepass -deststorepass ${STORE_PASSWORD} -deststoretype pkcs12 && \ keytool -importcert -noprompt -trustcacerts -destkeystore /opt/payara/appserver/glassfish/domains/domain1/config/cacerts.jks -file /tmp/mycert.crt -alias mycert -srcstorepass storepass -deststorepass ${STORE_PASSWORD} -deststoretype pkcs12 +#RUN wget https://github.com/eclipse-ee4j/mojarra/releases/download/3.0.2-RELEASE/jakarta.faces-3.0.2.jar \ +# -O /opt/payara/appserver/glassfish/modules/jakarta.faces.jar +#RUN wget https://github.com/eclipse-ee4j/mojarra/releases/download/2.3.17-RELEASE/jakarta.faces-2.3.17.jar \ +# -O /opt/payara/appserver/glassfish/modules/jakarta.faces.jar FROM server as production -COPY --from=build /app/restApp/target/*.war \ - $DEPLOY_DIR -COPY --from=build /app/wsApp/target/*.war \ - $DEPLOY_DIR +#COPY --from=build /app/restApp/target/*.war \ +# $DEPLOY_DIR +#COPY --from=build /app/wsApp/target/*.war \ +# $DEPLOY_DIR +COPY --from=build /app/jsf/target/*.war \ + $DEPLOY_DIR \ No newline at end of file diff --git a/docker/payara/Dockerfile b/docker/payara/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..05665875fe4ed02f90440ff3b1b421cf46017b37 --- /dev/null +++ b/docker/payara/Dockerfile @@ -0,0 +1,96 @@ +# FROM azul/zulu-openjdk:8u222 as mypayara +#FROM eclipse-temurin:17-jdk +FROM eclipse-temurin:11-jdk +# Default payara ports to expose +# 4848: admin console +# 9009: debug port (JPDA) +# 8080: http +# 8181: https +EXPOSE 4848 9009 8080 8181 + +# Payara version (5.183+) +#ARG PAYARA_VERSION=5.2021.9 +ARG PAYARA_VERSION=6.2021.1.Alpha1 +ARG PAYARA_PKG=https://search.maven.org/remotecontent?filepath=fish/payara/distributions/payara/${PAYARA_VERSION}/payara-${PAYARA_VERSION}.zip +#ARG PAYARA_SHA1=81c43f3c537ec74a813b48172758866615e1e792 +ARG PAYARA_SHA1=0262f8af7e52b318109ed43f8a31a1e93f111bbf + +ARG TINI_VERSION=v0.19.0 + +# Initialize the configurable environment variables +ENV HOME_DIR=/opt/payara\ + PAYARA_DIR=/opt/payara/appserver\ + SCRIPT_DIR=/opt/payara/scripts\ + CONFIG_DIR=/opt/payara/config\ + DEPLOY_DIR=/opt/payara/deployments\ + PASSWORD_FILE=/opt/payara/passwordFile\ + # Payara Server Domain options + DOMAIN_NAME=domain1\ + ADMIN_USER=admin\ + ADMIN_PASSWORD=admin\ + # Utility environment variables + JVM_ARGS=\ + PAYARA_ARGS=\ + DEPLOY_PROPS=\ + POSTBOOT_COMMANDS=/opt/payara/config/post-boot-commands.asadmin\ + PREBOOT_COMMANDS=/opt/payara/config/pre-boot-commands.asadmin +ENV PATH="${PATH}:${PAYARA_DIR}/bin" + +# Create and set the Payara user and working directory owned by the new user +RUN groupadd -g 1000 payara && \ + useradd -u 1000 -M -s /bin/bash -d ${HOME_DIR} payara -g payara && \ + echo payara:payara | chpasswd && \ + mkdir -p ${DEPLOY_DIR} && \ + mkdir -p ${CONFIG_DIR} && \ + mkdir -p ${SCRIPT_DIR} && \ + chown -R payara: ${HOME_DIR} && \ + # Install required packages + apt-get update && \ + apt-get install -y wget unzip gpg && \ + rm -rf /var/lib/apt/lists/* + +# Install tini as minimized init system +RUN wget --no-verbose -O /tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini && \ + wget --no-verbose -O /tini.asc https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc && \ + gpg --batch --keyserver "keyserver.ubuntu.com" --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 && \ + gpg --batch --verify /tini.asc /tini && \ + chmod +x /tini + +USER payara +WORKDIR ${HOME_DIR} + +# Download and unzip the Payara distribution +RUN ulimit -n 1024 ; wget --no-verbose -O payara.zip ${PAYARA_PKG} && \ + echo "${PAYARA_SHA1} *payara.zip" | sha1sum -c - && \ + unzip -qq payara.zip -d ./ && \ + mv payara*/ appserver && \ + # Configure the password file for configuring Payara + echo "AS_ADMIN_PASSWORD=\nAS_ADMIN_NEWPASSWORD=${ADMIN_PASSWORD}" > /tmp/tmpfile && \ + echo "AS_ADMIN_PASSWORD=${ADMIN_PASSWORD}" >> ${PASSWORD_FILE} && \ + # Configure the payara domain + ${PAYARA_DIR}/bin/asadmin --user ${ADMIN_USER} --passwordfile=/tmp/tmpfile change-admin-password --domain_name=${DOMAIN_NAME} && \ + ${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} start-domain ${DOMAIN_NAME} && \ + ${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} enable-secure-admin && \ + for MEMORY_JVM_OPTION in $(${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} list-jvm-options | grep "Xm[sx]"); do\ + ${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} delete-jvm-options $MEMORY_JVM_OPTION;\ + done && \ + # FIXME: when upgrading this container to Java 10+, this needs to be changed to '-XX:+UseContainerSupport' and '-XX:MaxRAMPercentage' +# ${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-jvm-options '-XX\:+UnlockExperimentalVMOptions:-XX\:+UseCGroupMemoryLimitForHeap:-XX\:MaxRAMFraction=1' && \ + ${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} create-jvm-options '-XX\:+UseContainerSupport:-XX\:MaxRAMPercentage=100' && \ + ${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} set-log-attributes com.sun.enterprise.server.logging.GFFileHandler.logtoFile=false && \ + ${PAYARA_DIR}/bin/asadmin --user=${ADMIN_USER} --passwordfile=${PASSWORD_FILE} stop-domain ${DOMAIN_NAME} && \ + # Cleanup unused files + rm -rf \ + /tmp/tmpFile \ + payara.zip \ + ${PAYARA_DIR}/glassfish/domains/${DOMAIN_NAME}/osgi-cache \ + ${PAYARA_DIR}/glassfish/domains/${DOMAIN_NAME}/logs +# ${PAYARA_DIR}/glassfish/domains/domain1 + +# Copy across docker scripts +COPY --chown=payara:payara bin/*.sh ${SCRIPT_DIR}/ +RUN mkdir -p ${SCRIPT_DIR}/init.d && \ + chmod +x ${SCRIPT_DIR}/* + +ENTRYPOINT ["/tini", "--"] +CMD ${SCRIPT_DIR}/entrypoint.sh diff --git a/docker/payara/build.sh b/docker/payara/build.sh new file mode 100755 index 0000000000000000000000000000000000000000..6ee1b511105493c2a4181dd967400f0fadc99ede --- /dev/null +++ b/docker/payara/build.sh @@ -0,0 +1 @@ +COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker build -t brunoe/payara:jdk11-6 . diff --git a/docker/payara/run.sh b/docker/payara/run.sh new file mode 100755 index 0000000000000000000000000000000000000000..7103277cebf38945809bd712d796c05abe84ae20 --- /dev/null +++ b/docker/payara/run.sh @@ -0,0 +1 @@ +docker run -it -p 4848:4848 -p 8080 brunoe/payara diff --git a/docker/post-boot-commands.asadmin b/docker/post-boot-commands.asadmin index 2bd8a432084692826c01b01231f97a349baafb29..9afc702dd1921877e0862be202eaaeef548a827f 100755 --- a/docker/post-boot-commands.asadmin +++ b/docker/post-boot-commands.asadmin @@ -1,7 +1,7 @@ set-hazelcast-configuration --enabled=true --dynamic=true add-library /tmp/h2.jar -create-jdbc-connection-pool --datasourceclassname org.h2.jdbcx.JdbcDataSource --restype javax.sql.ConnectionPoolDataSource --property password=password:user=user:url="jdbc:h2:tcp://db:9092/payara;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE" H2-pool -create-jdbc-resource --connectionpoolid H2-pool jdbc/h2-pool +create-jdbc-connection-pool --datasourceclassname org.h2.jdbcx.JdbcDataSource --restype javax.sql.ConnectionPoolDataSource --property password=password:user=user:url="jdbc:h2:tcp://db:9092/payara;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH" My-H2-pool +create-jdbc-resource --connectionpoolid My-H2-pool jdbc/my-h2-pool # set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.cert-nickname=mycert diff --git a/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java b/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java index 2b85888364a51ab6761879e6b7e83f556a2fdd58..b3bdcf85113dbc5920c50e441cffee5c626fd594 100644 --- a/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java +++ b/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java @@ -2,40 +2,51 @@ package fr.univtln.bruno.samples.jee91.dao; import jakarta.json.bind.annotation.JsonbTransient; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; import jakarta.xml.bind.annotation.XmlRootElement; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Setter; +import lombok.*; import lombok.experimental.FieldDefaults; +import java.io.Serializable; import java.util.UUID; +@AllArgsConstructor(staticName = "of") +@NoArgsConstructor +@ToString(onlyExplicitlyIncluded = true) @Table(name = "PERSON") @Entity @Getter @Setter -@NamedQueries({ - @NamedQuery(name = "Person.findAll", - query = "select p from Person p"), - @NamedQuery( - name = "Person.findAllOrderedByName", - query = "SELECT p FROM Person p ORDER BY p.name"), - @NamedQuery( - name = "Person.findByUUID", - query = "SELECT p FROM Person p WHERE p.uuid=:uuid") -}) +@NamedQuery(name = "Person.findAll", + query = "select p from Person p") +@NamedQuery( + name = "Person.findAllOrderedByName", + query = "SELECT p FROM Person p ORDER BY p.name") +@NamedQuery( + name = "Person.findByUUID", + query = "SELECT p FROM Person p WHERE p.uuid=:uuid") @XmlRootElement @FieldDefaults(level = AccessLevel.PRIVATE) -public class Person { +public class Person implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") @JsonbTransient long id; + @ToString.Include @Column(name = "NAME") + @NotBlank + @Pattern(regexp = "[A-Z][a-z]+", message = "Le nom doit commencer par une majuscule suivie de minuscules") String name; + @ToString.Include @Column(name = "UUID", updatable = false, nullable = false, unique = true) UUID uuid = UUID.randomUUID(); + + @Builder + public Person(String name) { + this.name = name; + } } diff --git a/jsf/pom.xml b/jsf/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d5f2855adc5d82f07e03c3c5167b0e0b849000d3 --- /dev/null +++ b/jsf/pom.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>jee9.1</artifactId> + <groupId>fr.univtln.bruno.samples.jee91</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>jsf</artifactId> + <packaging>war</packaging> + + <properties> + <primefaces.version>11.0.0-RC2</primefaces.version> + <!--primefaces.version>11.0.0-SNAPSHOT</primefaces.version--> + <omnifaces.version>4.0-M12</omnifaces.version> + <all-themes.version>1.0.10</all-themes.version> + </properties> + + <!--repositories> + <repository> + <id>prime-repo</id> + <name>PrimeFaces Maven Repository</name> + <url>https://repository.primefaces.org</url> + <layout>default</layout> + </repository> + </repositories--> + + <dependencies> + <dependency> + <groupId>fr.univtln.bruno.samples.jee91</groupId> + <artifactId>business</artifactId> + <version>1.0-SNAPSHOT</version> + <!--type>ejb-client</type--> + </dependency> + + <dependency> + <groupId>fr.univtln.bruno.samples.jee91</groupId> + <artifactId>dao</artifactId> + <version>1.0-SNAPSHOT</version> + </dependency> + + <dependency> + <groupId>jakarta.platform</groupId> + <artifactId>jakarta.jakartaee-api</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + </dependency> + + <!--dependency> + <groupId>org.omnifaces</groupId> + <artifactId>omnifaces</artifactId> + <version>${omnifaces.version}</version> + </dependency--> + <dependency> + <groupId>org.primefaces</groupId> + <artifactId>primefaces</artifactId> + <version>${primefaces.version}</version> + <classifier>jakarta</classifier> + </dependency> + <!--dependency> + <groupId>org.primefaces.themes</groupId> + <artifactId>all-themes</artifactId> + <version>${all-themes.version}</version> + </dependency--> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>3.3.2</version> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file diff --git a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/AddPersonView.java b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/AddPersonView.java new file mode 100644 index 0000000000000000000000000000000000000000..8aa8588bc36b1147c0083ce86add2e80a5337349 --- /dev/null +++ b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/AddPersonView.java @@ -0,0 +1,35 @@ +package fr.univtln.bruno.jee91.jsf; + +import fr.univtln.bruno.samples.jee91.dao.Person; +import fr.univtln.bruno.samples.jee91.dao.PersonDAO; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.transaction.Transactional; +import lombok.Getter; + +import java.io.Serializable; + +@Named +@ViewScoped +public class AddPersonView implements Serializable { + + private static final long serialVersionUID = 1L; + + @Inject + private transient PersonDAO personDAO; + + @Getter + private final Person newPerson = new Person(); + @Getter + private Person addedPerson = new Person(); + + @Transactional + public void addPerson() { + addedPerson = Person.builder().name(newPerson.getName()).build(); + personDAO.persist(addedPerson); + FacesContext.getCurrentInstance().addMessage("growl-id", new FacesMessage(FacesMessage.SEVERITY_INFO, "Person added", addedPerson.getName() + "(" + addedPerson.getUuid() + ")")); + } +} diff --git a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java new file mode 100644 index 0000000000000000000000000000000000000000..75dab8e96c45709abfd94b305504362bfcf67bc5 --- /dev/null +++ b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java @@ -0,0 +1,28 @@ +package fr.univtln.bruno.jee91.jsf; + +import fr.univtln.bruno.samples.jee91.dao.Person; +import fr.univtln.bruno.samples.jee91.dao.PersonDAO; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; + +import java.util.List; + +@Named +@RequestScoped +public class ViewPersonBean { + + @Inject + PersonDAO personDAO; + + private final String message = "Hello"; + + public String getMessage() { + return this.message; + } + + public List<Person> getPersons() { + return personDAO.findAll(); + } + +} diff --git a/jsf/src/main/resources/META-INF/log4j.properties b/jsf/src/main/resources/META-INF/log4j.properties new file mode 100644 index 0000000000000000000000000000000000000000..b26344f037fddc8848b1789a4ef4b1f2be4ddb5c --- /dev/null +++ b/jsf/src/main/resources/META-INF/log4j.properties @@ -0,0 +1,17 @@ +log4j.rootLogger=debug, stdout, R + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout + +# Pattern to output the caller's file name and line number. +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n + +log4j.appender.R=org.apache.log4j.RollingFileAppender +log4j.appender.R.File=wqClient.log + +log4j.appender.R.MaxFileSize=100KB +# Keep one backup file +log4j.appender.R.MaxBackupIndex=1 + +log4j.appender.R.layout=org.apache.log4j.PatternLayout +log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n \ No newline at end of file diff --git a/jsf/src/main/resources/META-INF/persistence.xml b/jsf/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000000000000000000000000000000000..e900259cf5ea473bb81e5f25c9f8716ceb87f03f --- /dev/null +++ b/jsf/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<persistence xmlns="https://jakarta.ee/xml/ns/persistence" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" + version="3.0"> + <persistence-unit name="myappPU" transaction-type="JTA"> + <jta-data-source>jdbc/my-h2-pool</jta-data-source> + <class>fr.univtln.bruno.samples.jee91.dao.Person</class> + <validation-mode>CALLBACK</validation-mode> + <properties> + <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create" /> + <property name="jakarta.persistence.schema-generation.scripts.action" value="drop-and-create" /> + <property name="jakarta.persistence.schema-generation.scripts.create-target" value="sampleCreate.ddl" /> + <property name="jakarta.persistence.schema-generation.scripts.drop-target" value="sampleDrop.ddl" /> + + <property name="jakarta.persistence.sql-load-script-source" value="insert.sql" /> + </properties> + </persistence-unit> +</persistence> \ No newline at end of file diff --git a/jsf/src/main/resources/insert.sql b/jsf/src/main/resources/insert.sql new file mode 100644 index 0000000000000000000000000000000000000000..e74e7ffef4c148ef8820cf85f012ce24599f7e1f --- /dev/null +++ b/jsf/src/main/resources/insert.sql @@ -0,0 +1,4 @@ +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Yves', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870B25A000916801FE374FCFAC5DCF94C11'); +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Pierre', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870B8F28F7D3945291756DAC7325DF44938'); +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Marie', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F73745369674269747378709AA3211A9B897403843C82366C6B450E'); +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Jeanne', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870BC1580AEB48C0F0C0B3C82E884AA4C3C'); \ No newline at end of file diff --git a/jsf/src/main/webapp/WEB-INF/beans.xml b/jsf/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 0000000000000000000000000000000000000000..efd69bc2d38663ae2f69879265843f8ff04aac04 --- /dev/null +++ b/jsf/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/beans_3_0.xsd" + bean-discovery-mode="all"> +</beans> \ No newline at end of file diff --git a/jsf/src/main/webapp/WEB-INF/faces-config.xml b/jsf/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000000000000000000000000000000000000..c573714301d239cada20b40e4393e9b1a863af81 --- /dev/null +++ b/jsf/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<faces-config + xmlns="https://jakarta.ee/xml/ns/jakartaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_3_0.xsd" + version="3.0" +> + <!-- Your faces config here. --> +</faces-config> \ No newline at end of file diff --git a/jsf/src/main/webapp/WEB-INF/web.xml b/jsf/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..cffeb3b2ed648e1cbc8628e1be4c1f1cf89594df --- /dev/null +++ b/jsf/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" + version="5.0"> + + <!--context-param> + <param-name>jakarta.faces.PROJECT_STAGE</param-name> + <param-value>Development</param-value> + </context-param--> + + <servlet> + <servlet-name>Faces Servlet</servlet-name> + <servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class> + <load-on-startup>1</load-on-startup> + </servlet> + <!--La servlet de JSF est configurée pour répondre à toutes les requêtes de fichiers XHTML--> + <servlet-mapping> + <servlet-name>Faces Servlet</servlet-name> + <url-pattern>*.xhtml</url-pattern> + </servlet-mapping> + + <session-config> + <session-timeout>30</session-timeout> + </session-config> + + <welcome-file-list> + <welcome-file>index.xhtml</welcome-file> + </welcome-file-list> + + <mime-mapping> + <extension>woff</extension> + <mime-type>application/font-woff</mime-type> + </mime-mapping> + <mime-mapping> + <extension>ttf</extension> + <mime-type>application/x-font-ttf</mime-type> + </mime-mapping> + + <mime-mapping> + <extension>eot</extension> + <mime-type>application/vnd.ms-fontobject</mime-type> + </mime-mapping> + +</web-app> \ No newline at end of file diff --git a/jsf/src/main/webapp/addPerson.xhtml b/jsf/src/main/webapp/addPerson.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..8ce3f48169039f606000618a1f3fbb7532cc8517 --- /dev/null +++ b/jsf/src/main/webapp/addPerson.xhtml @@ -0,0 +1,21 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:p="http://primefaces.org/ui"> + +<h:head></h:head> + +<h:body> + <div class="card"> + <h:form> + <h3 class="p-mt-0">Add a person</h3> + <p:growl id="growl" for="growl-id" showDetail="true" skipDetailIfEqualsSummary="true"/> + <h:panelGrid columns="3" cellpadding="7"> + <p:outputLabel for="fieldName" value="Name"/> + <p:inputText id="fieldName" value="#{addPersonView.newPerson.name}"/> + <p:message for="fieldName"/> + <p:commandButton value="Save" ajax="false" icon="pi pi-check" validateClient="true" styleClass="p-mr-3" action="#{addPersonView.addPerson}"/> + </h:panelGrid> + </h:form> + </div> +</h:body> +</html> diff --git a/jsf/src/main/webapp/index.xhtml b/jsf/src/main/webapp/index.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..f43818fbbdab8bdd6dfaa17173c8bc646063d593 --- /dev/null +++ b/jsf/src/main/webapp/index.xhtml @@ -0,0 +1,28 @@ +<!DOCTYPE html> + +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:p="http://primefaces.org/ui" + xml:lang="en"> + +<h:head> + <title>Person list</title> +</h:head> + +<h:body> + <h3 style="text-align: center"><h:outputText value="#{viewPersonBean.message}"/></h3> + + <div class="card"> + <p:dataTable var="person" value="#{viewPersonBean.persons}"> + <p:column headerText="UUID"> + <h:outputText value="#{person.uuid}"/> + </p:column> + + <p:column headerText="Name"> + <h:outputText value="#{person.name}"/> + </p:column> + </p:dataTable> + </div> + +</h:body> +</html> diff --git a/jsf/src/main/webapp/test.xhtml b/jsf/src/main/webapp/test.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..c854dabea51d0a48ce87247a67f7eb11df8aa95c --- /dev/null +++ b/jsf/src/main/webapp/test.xhtml @@ -0,0 +1,12 @@ +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:p="http://primefaces.org/ui"> + +<h:head> +</h:head> + +<h:body> + <p:spinner /> +</h:body> +</html> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9397a8411f6897eaa7fb395295c1f18dcee08078..7b344197500b639a8eace92c5927a761b8b3c160 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ <module>wsClient</module> <module>entites</module> <module>utils</module> + <module>jsf</module> </modules> <packaging>pom</packaging> @@ -25,8 +26,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <jakarta.jakartaee-api.version>9.1.0</jakarta.jakartaee-api.version> - <microprofile.version>3.0</microprofile.version> + <jakarta.jakartaee-api.version>9.0.0</jakarta.jakartaee-api.version> <junit-jupiter.version>5.8.1</junit-jupiter.version> </properties> @@ -38,13 +38,6 @@ <version>${jakarta.jakartaee-api.version}</version> <scope>provided</scope> </dependency> - <dependency> - <groupId>org.eclipse.microprofile</groupId> - <artifactId>microprofile</artifactId> - <version>${microprofile.version}</version> - <type>pom</type> - <scope>provided</scope> - </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> @@ -76,7 +69,47 @@ <version>2.22.2</version> </plugin> - + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + <version>3.0.0</version> + <executions> + <execution> + <id>enforce-maven</id> + <goals> + <goal>enforce</goal> + </goals> + <configuration> + <rules> + <requireMavenVersion> + <version>3.8</version> + </requireMavenVersion> + </rules> + </configuration> + </execution> + </executions> + </plugin> </plugins> + + <pluginManagement> + <plugins> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>3.1.0</version> + </plugin> + <plugin> + <artifactId>maven-deploy-plugin</artifactId> + <version>3.0.0-M1</version> + </plugin> + <plugin> + <artifactId>maven-install-plugin</artifactId> + <version>3.0.0-M1</version> + </plugin> + <plugin> + <artifactId>maven-site-plugin</artifactId> + <version>3.9.1</version> + </plugin> + </plugins> + </pluginManagement> </build> </project> \ No newline at end of file diff --git a/restApp/pom.xml b/restApp/pom.xml index c642a31ed0c27f98aa14cab0463e65a50df8c288..f5b6c51ef97ce5e3b37aaead485d585fde23dd46 100644 --- a/restApp/pom.xml +++ b/restApp/pom.xml @@ -29,11 +29,6 @@ <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> </dependency> - <dependency> - <groupId>org.eclipse.microprofile</groupId> - <artifactId>microprofile</artifactId> - <type>pom</type> - </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> diff --git a/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java b/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java index d0feb963ef9d65a0055969cff4203d3647940060..63379567b154ea0efb082c7ac07bd825b713c8c8 100644 --- a/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java +++ b/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java @@ -6,19 +6,19 @@ import fr.univtln.bruno.samples.jee91.dao.Person; import fr.univtln.bruno.samples.jee91.dao.PersonDAO; import fr.univtln.bruno.samples.jee91.ejb.Hello; import fr.univtln.bruno.samples.jee91.ejb.qualifiers.SpokenLanguage; +import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; -import org.eclipse.microprofile.config.inject.ConfigProperty; import java.util.List; import java.util.Map; import java.util.UUID; +@RequestScoped @Path("sample") -//@Stateless @Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_XML}) public class SampleResource { @@ -32,9 +32,7 @@ public class SampleResource { @Inject PersonDAO personDAO; - @Inject - @ConfigProperty(name = "message") - private String message; + private final String message = "Hello"; @GET public Response message() { diff --git a/restApp/src/main/resources/META-INF/microprofile-config.properties b/restApp/src/main/resources/META-INF/microprofile-config.properties deleted file mode 100644 index 9ab849fb222baec06d45967782915033c1b18c24..0000000000000000000000000000000000000000 --- a/restApp/src/main/resources/META-INF/microprofile-config.properties +++ /dev/null @@ -1 +0,0 @@ -message=Hello World Jakarta EE 9.1 \ No newline at end of file diff --git a/restApp/src/main/resources/META-INF/persistence.xml b/restApp/src/main/resources/META-INF/persistence.xml index 50230cc5a2ed4c07f3146453bfd81a201697f389..18fe3bac73127e9a827bed24e72d412c334bdcc5 100644 --- a/restApp/src/main/resources/META-INF/persistence.xml +++ b/restApp/src/main/resources/META-INF/persistence.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> -<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" +<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> + xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" + version="3.0"> <persistence-unit name="myappPU" transaction-type="JTA"> - <jta-data-source>jdbc/h2-pool</jta-data-source> + <jta-data-source>jdbc/my-h2-pool</jta-data-source> <class>fr.univtln.bruno.samples.jee91.dao.Person</class> <properties> diff --git a/restApp/src/main/webapp/WEB-INF/beans.xml b/restApp/src/main/webapp/WEB-INF/beans.xml index f8e254275530a1d3ce18bae65334cd014bf184c4..efd69bc2d38663ae2f69879265843f8ff04aac04 100644 --- a/restApp/src/main/webapp/WEB-INF/beans.xml +++ b/restApp/src/main/webapp/WEB-INF/beans.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" - bean-discovery-mode="all"> +<beans xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/beans_3_0.xsd" + bean-discovery-mode="all"> </beans> \ No newline at end of file diff --git a/wsApp/src/main/resources/META-INF/microprofile-config.properties b/wsApp/src/main/resources/META-INF/microprofile-config.properties deleted file mode 100644 index 9ab849fb222baec06d45967782915033c1b18c24..0000000000000000000000000000000000000000 --- a/wsApp/src/main/resources/META-INF/microprofile-config.properties +++ /dev/null @@ -1 +0,0 @@ -message=Hello World Jakarta EE 9.1 \ No newline at end of file diff --git a/wsApp/src/main/resources/META-INF/persistence.xml b/wsApp/src/main/resources/META-INF/persistence.xml index e285a5f2e096fbcdae9923f731058155bdd13655..2cc799781f7801097a6abc19442f1889451888fd 100644 --- a/wsApp/src/main/resources/META-INF/persistence.xml +++ b/wsApp/src/main/resources/META-INF/persistence.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> +<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" + version="3.0"> <persistence-unit name="myappPU" transaction-type="JTA"> - <jta-data-source>jdbc/h2-pool</jta-data-source> - <exclude-unlisted-classes>false</exclude-unlisted-classes> + <jta-data-source>jdbc/my-h2-pool</jta-data-source> + <class>fr.univtln.bruno.samples.jee91.dao.Person</class> </persistence-unit> </persistence> \ No newline at end of file diff --git a/wsClient/pom.xml b/wsClient/pom.xml index e09ffbe737e4ef75ace4864b58689ff5c8af4cbc..378075cd4df7f97f767a9331ba8a4a93522fcd73 100644 --- a/wsClient/pom.xml +++ b/wsClient/pom.xml @@ -25,12 +25,6 @@ <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> - <dependency> - <groupId>fr.univtln.bruno.samples.jee91</groupId> - <artifactId>utils</artifactId> - <version>1.0-SNAPSHOT</version> - <scope>provided</scope> - </dependency> </dependencies> </project> \ No newline at end of file diff --git a/wsClient/src/main/java/fr/univtln/bruno/samples/jee91/wsclient/WsClient.java b/wsClient/src/main/java/fr/univtln/bruno/samples/jee91/wsclient/WsClient.java index f7278913aa7bbefadb279069feda8a54ca6934a8..bf1e350d04622d4c2be010f939b38f0d3151213e 100644 --- a/wsClient/src/main/java/fr/univtln/bruno/samples/jee91/wsclient/WsClient.java +++ b/wsClient/src/main/java/fr/univtln/bruno/samples/jee91/wsclient/WsClient.java @@ -12,7 +12,6 @@ import java.util.Map; @ClientEndpoint @Slf4j public class WsClient { - Session userSession = null; private MessageHandler messageHandler; private Map<String, Object> properties; @@ -20,18 +19,18 @@ public class WsClient { public WsClient(URI endpointURI) { try { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); - - String pathtoCert = getClass().getClassLoader().getResource("mycert-pub.jks").toURI().getPath(); - - System.getProperties().put("javax.net.debug", "all"); - System.getProperties().put(SSLContextConfigurator.KEY_STORE_FILE, pathtoCert); - System.getProperties().put(SSLContextConfigurator.KEY_STORE_TYPE, "JKS"); - System.getProperties().put(SSLContextConfigurator.TRUST_STORE_FILE, pathtoCert); - System.getProperties().put(SSLContextConfigurator.TRUST_STORE_TYPE, "JKS"); - System.getProperties().put(SSLContextConfigurator.KEY_STORE_PASSWORD, "storepass"); - System.getProperties().put(SSLContextConfigurator.TRUST_STORE_PASSWORD, "storepass"); + var url = getClass().getClassLoader().getResource("mycert-pub.jks"); + System.getProperties().put("javax.net.debug", "ssl"); + if (url != null) { + String pathtoCert = url.toURI().getPath(); + System.getProperties().put(SSLContextConfigurator.KEY_STORE_FILE, pathtoCert); + System.getProperties().put(SSLContextConfigurator.KEY_STORE_TYPE, "JKS"); + System.getProperties().put(SSLContextConfigurator.TRUST_STORE_FILE, pathtoCert); + System.getProperties().put(SSLContextConfigurator.TRUST_STORE_TYPE, "JKS"); + System.getProperties().put(SSLContextConfigurator.KEY_STORE_PASSWORD, "storepass"); + System.getProperties().put(SSLContextConfigurator.TRUST_STORE_PASSWORD, "storepass"); + } final SSLContextConfigurator defaultConfig = new SSLContextConfigurator(); - defaultConfig.retrieve(System.getProperties()); container.connectToServer(this, endpointURI); } catch (Exception e) {