diff --git a/docker/post-boot-commands.asadmin b/docker/post-boot-commands.asadmin index a934ecdb706612e7f81d6f5d919463392636d0ff..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" My-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/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..b1ee601de102ca32027938e2c9b462d9190eb8bc --- /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 Person newPerson = new Person(); + @Getter + private Person addedPerson = new Person(); + + @Transactional + public void addPerson() { + FacesMessage facesMessage; + personDAO.persist(addedPerson = Person.builder().name(newPerson.getName()).build()); + 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/GrowlView.java b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/GrowlView.java new file mode 100644 index 0000000000000000000000000000000000000000..947c219a14fa122895b710e6a7afc9881105228c --- /dev/null +++ b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/GrowlView.java @@ -0,0 +1,38 @@ +package fr.univtln.bruno.jee91.jsf; + +import jakarta.enterprise.context.RequestScoped; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.FacesContext; +import jakarta.inject.Named; + +@Named +@RequestScoped +public class GrowlView { + + public void addMessage(FacesMessage.Severity severity, String summary, String detail) { + FacesContext.getCurrentInstance(). + addMessage(null, new FacesMessage(severity, summary, detail)); + } + + public void showInfo() { + addMessage(FacesMessage.SEVERITY_INFO, "Info Message", "Message Content"); + } + + public void showWarn() { + addMessage(FacesMessage.SEVERITY_WARN, "Warn Message", "Message Content"); + } + + public void showError() { + addMessage(FacesMessage.SEVERITY_ERROR, "Error Message", "Message Content"); + } + + public void showSticky() { + FacesContext.getCurrentInstance().addMessage("sticky-key", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sticky Message", "Message Content")); + } + + public void showMultiple() { + addMessage(FacesMessage.SEVERITY_INFO, "Message 1", "Message Content"); + addMessage(FacesMessage.SEVERITY_INFO, "Message 2", "Message Content"); + addMessage(FacesMessage.SEVERITY_INFO, "Message 3", "Message Content"); + } +} \ No newline at end of file diff --git a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/SampleBean.java b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java similarity index 94% rename from jsf/src/main/java/fr/univtln/bruno/jee91/jsf/SampleBean.java rename to jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java index b1304efaf78ee6ab308670edf94d9f2ccd8cfa9c..ac1d482773b1c7c8bab248b238552ed49afc9cdf 100644 --- a/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/SampleBean.java +++ b/jsf/src/main/java/fr/univtln/bruno/jee91/jsf/ViewPersonBean.java @@ -10,7 +10,7 @@ import java.util.List; @Named @RequestScoped -public class SampleBean { +public class ViewPersonBean { @Inject PersonDAO personDAO; @@ -24,4 +24,5 @@ public class SampleBean { public List<Person> getPersons() { return personDAO.findAll(); } + } diff --git a/jsf/src/main/resources/META-INF/persistence.xml b/jsf/src/main/resources/META-INF/persistence.xml index 18fe3bac73127e9a827bed24e72d412c334bdcc5..e900259cf5ea473bb81e5f25c9f8716ceb87f03f 100644 --- a/jsf/src/main/resources/META-INF/persistence.xml +++ b/jsf/src/main/resources/META-INF/persistence.xml @@ -6,7 +6,7 @@ <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" /> diff --git a/jsf/src/main/webapp/WEB-INF/web.xml b/jsf/src/main/webapp/WEB-INF/web.xml index ab57d6889f0874de41e6c31c358ffc0edc9a6bd6..cffeb3b2ed648e1cbc8628e1be4c1f1cf89594df 100644 --- a/jsf/src/main/webapp/WEB-INF/web.xml +++ b/jsf/src/main/webapp/WEB-INF/web.xml @@ -3,10 +3,10 @@ xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> - <context-param> + <!--context-param> <param-name>jakarta.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> - </context-param> + </context-param--> <servlet> <servlet-name>Faces Servlet</servlet-name> @@ -26,4 +26,19 @@ <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/growl.xhtml b/jsf/src/main/webapp/growl.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..32909b8fe32b1f41c1a1918355e318934408bf80 --- /dev/null +++ b/jsf/src/main/webapp/growl.xhtml @@ -0,0 +1,37 @@ +<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 /> + +<div class="card"> + <h:form> + <p:growl id="growl" showDetail="true"/> + <p:growl id="growl-sticky" for="sticky-key" showDetail="true" sticky="true"/> + + <h5 class="p-mt-0">Severities</h5> + <p:commandButton actionListener="#{growlView.showInfo}" update="growl" value="Info" styleClass="p-mr-2" + style="width: 10rem"/> + <p:commandButton actionListener="#{growlView.showWarn}" update="growl" value="Warn" + styleClass="p-mr-2 ui-button-warning" style="width: 10rem"/> + <p:commandButton actionListener="#{growlView.showError}" update="growl" value="Error" + styleClass="ui-button-danger" style="width: 10rem"/> + + <h5>Multiple</h5> + <p:commandButton actionListener="#{growlView.showMultiple}" update="growl" value="Multiple" style="width: 10rem" + styleClass="ui-button-outlined"/> + + <h5>Sticky</h5> + <p:commandButton actionListener="#{growlView.showSticky}" update="growl-sticky" value="Info" + style="width: 10rem" styleClass="ui-button-help"/> + </h:form> +</div> +</h:body> +</html> \ No newline at end of file diff --git a/jsf/src/main/webapp/index.xhtml b/jsf/src/main/webapp/index.xhtml index 1dd50f9cff9fe62337690d46bf11dcc3e12b84b2..96067ea6fbebfd298b40549fe32a1c3bb3ff9884 100644 --- a/jsf/src/main/webapp/index.xhtml +++ b/jsf/src/main/webapp/index.xhtml @@ -1,46 +1,26 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:h="http://xmlns.jcp.org/jsf/html" + xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" - xmlns:p="http://primefaces.org/ui" -> + xmlns:p="http://primefaces.org/ui"> <h:head> - <title>Hello World JSF 3</title> + </h:head> <h:body> - <h3 style="text-align: center">#{sampleBean.message}</h3> - - <h:dataTable value="#{sampleBean.persons}" var="person" - styleClass="order-table" - headerClass="order-table-header" - rowClasses="order-table-odd-row,order-table-even-row"> - <h:column> - <f:facet name="header">UUID</f:facet> - #{person.uuid} - </h:column> - - <h:column> - <f:facet name="header">Name</f:facet> - #{person.name} - </h:column> - </h:dataTable> + <h3 style="text-align: center">#{viewPersonBean.message}</h3> - <h:form> - <div class="card"> - <p:dataTable var="person" value="#{sampleBean.persons}"> - <p:column headerText="UUID"> - <h:outputText value="#{person.uuid}" /> - </p:column> + <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:form> + <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