started to migrate to Jakarta EE 10

This commit is contained in:
Joern Muehlencord
2023-10-25 13:10:38 +02:00
parent 66be348fd3
commit 55655a5de2
37 changed files with 321 additions and 363 deletions

View File

@ -15,7 +15,8 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<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"> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.muehlencord.shared</groupId> <groupId>de.muehlencord.shared</groupId>
@ -30,6 +31,48 @@ limitations under the License.
<name>shared-db</name> <name>shared-db</name>
<dependencies> <dependencies>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<!-- CDI and annotations -->
<dependency>
<groupId>jakarta.inject</groupId>
<artifactId>jakarta.inject-api</artifactId>
</dependency>
<dependency>
<groupId>jakarta.interceptor</groupId>
<artifactId>jakarta.interceptor-api</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- Testing -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<!-- Dev Tools -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- unsorted -->
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
@ -47,50 +90,7 @@ limitations under the License.
<groupId>com.fasterxml.jackson.datatype</groupId> <groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId> <artifactId>jackson-datatype-jsr310</artifactId>
</dependency> </dependency>
<!-- Testing -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<!-- Dev Tools -->
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
<build>
<plugins>
<!-- create EJB version 3.1 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>3.1</ejbVersion>
<excludes>
<exclude>**/persistence.xml</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

View File

@ -15,22 +15,20 @@
*/ */
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.Query;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Order;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.persistence.EntityGraph;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
/** /**
* *
@ -52,7 +50,6 @@ public abstract class AbstractController<T extends Serializable> extends CommonA
* @param id the primary key of the entity to search for. * @param id the primary key of the entity to search for.
* @return the found entity instance or null if the entity does not exist * @return the found entity instance or null if the entity does not exist
*/ */
@Lock(LockType.READ)
public T find(Object id) { public T find(Object id) {
return em.find(entityClass, id); return em.find(entityClass, id);
} }
@ -66,7 +63,6 @@ public abstract class AbstractController<T extends Serializable> extends CommonA
* Typically this is the name of the 1:n set or list. * Typically this is the name of the 1:n set or list.
* @return the found entity instance or null if the entity does not exist * @return the found entity instance or null if the entity does not exist
*/ */
@Lock(LockType.READ)
public T find(Object id, String... subGraphItems) { public T find(Object id, String... subGraphItems) {
EntityGraph<T> graph = this.em.createEntityGraph(entityClass); EntityGraph<T> graph = this.em.createEntityGraph(entityClass);
for (String subGraphItem : subGraphItems) { for (String subGraphItem : subGraphItems) {
@ -79,7 +75,6 @@ public abstract class AbstractController<T extends Serializable> extends CommonA
return em.find(entityClass, id, hints); return em.find(entityClass, id, hints);
} }
@Lock(LockType.READ)
public List<T> find(String queryName, Map<String, Object> parameterMap) { public List<T> find(String queryName, Map<String, Object> parameterMap) {
Query query = em.createNamedQuery(queryName); Query query = em.createNamedQuery(queryName);
parameterMap.entrySet().forEach(entry -> query.setParameter(entry.getKey(), entry.getValue())); parameterMap.entrySet().forEach(entry -> query.setParameter(entry.getKey(), entry.getValue()));
@ -91,7 +86,6 @@ public abstract class AbstractController<T extends Serializable> extends CommonA
* *
* @return a list of all entities. * @return a list of all entities.
*/ */
@Lock(LockType.READ)
public List<T> findAll() throws ControllerException { public List<T> findAll() throws ControllerException {
return findAll(new ArrayList<>()); return findAll(new ArrayList<>());
} }
@ -102,7 +96,6 @@ public abstract class AbstractController<T extends Serializable> extends CommonA
* @param orderFields the list of field names to order the result by. * @param orderFields the list of field names to order the result by.
* @return a list of all entities. * @return a list of all entities.
*/ */
@Lock(LockType.READ)
public List<T> findAll(String... orderFields) throws ControllerException { public List<T> findAll(String... orderFields) throws ControllerException {
return findAll(Arrays.asList(orderFields)); return findAll(Arrays.asList(orderFields));
} }
@ -112,7 +105,6 @@ public abstract class AbstractController<T extends Serializable> extends CommonA
* @param orderFields the list of field names to order the result by. * @param orderFields the list of field names to order the result by.
* @return a list of all entities. * @return a list of all entities.
*/ */
@Lock(LockType.READ)
public List<T> findAll(List<String> orderFields) throws ControllerException { public List<T> findAll(List<String> orderFields) throws ControllerException {
return findAll(entityClass, orderFields); return findAll(entityClass, orderFields);
} }
@ -125,7 +117,6 @@ public abstract class AbstractController<T extends Serializable> extends CommonA
* @param orderFields the fields to order the result by. * @param orderFields the fields to order the result by.
* @return a list of found entities. * @return a list of found entities.
*/ */
@Lock(LockType.READ)
public List<T> find(Map<String, Object> filters, List<String> orderFields) { public List<T> find(Map<String, Object> filters, List<String> orderFields) {
final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<T> criteria = cb.createQuery(entityClass); final CriteriaQuery<T> criteria = cb.createQuery(entityClass);

View File

@ -19,10 +19,11 @@ import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import jakarta.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import javax.inject.Qualifier;
/** /**
* *

View File

@ -15,14 +15,15 @@
*/ */
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import javax.annotation.Priority; import static jakarta.transaction.Transactional.TxType.REQUIRED;
import javax.inject.Inject;
import javax.interceptor.AroundInvoke; import jakarta.annotation.Priority;
import javax.interceptor.Interceptor; import jakarta.inject.Inject;
import javax.interceptor.InvocationContext; import jakarta.interceptor.AroundInvoke;
import javax.persistence.EntityManager; import jakarta.interceptor.Interceptor;
import javax.transaction.Transactional; import jakarta.interceptor.InvocationContext;
import static javax.transaction.Transactional.TxType.REQUIRED; import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -19,13 +19,13 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.validation.constraints.NotNull;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;

View File

@ -16,9 +16,20 @@
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import de.muehlencord.shared.util.DateUtil; import de.muehlencord.shared.util.DateUtil;
import jakarta.inject.Inject;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Order;
import jakarta.persistence.criteria.Path;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import jakarta.transaction.Transactional;
import jakarta.transaction.Transactional.TxType;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -28,21 +39,6 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
import javax.persistence.EntityGraph;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.transaction.Transactional;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -64,7 +60,6 @@ public abstract class CommonAbstractController {
this.em = em; this.em = em;
} }
@Lock(LockType.READ)
public <T extends Serializable> T find(Class<T> clazz, Object id) { public <T extends Serializable> T find(Class<T> clazz, Object id) {
return em.find(clazz, id); return em.find(clazz, id);
} }
@ -79,7 +74,6 @@ public abstract class CommonAbstractController {
return graph; return graph;
} }
@Lock(LockType.READ)
public <T extends Serializable> T find(Class<T> clazz, Object id, String... subGraphItems) { public <T extends Serializable> T find(Class<T> clazz, Object id, String... subGraphItems) {
EntityGraph graph = getEntityGraph(clazz, subGraphItems); EntityGraph graph = getEntityGraph(clazz, subGraphItems);
Map hints = new HashMap<>(); Map hints = new HashMap<>();
@ -89,12 +83,10 @@ public abstract class CommonAbstractController {
return entity; return entity;
} }
@Lock(LockType.READ)
public <T extends Serializable> List<T> find(Class<T> clazz, Map<String, Object> filters, List<String> orderFields, String... subGraphItems) { public <T extends Serializable> List<T> find(Class<T> clazz, Map<String, Object> filters, List<String> orderFields, String... subGraphItems) {
return find(clazz, filters, orderFields, 0, 0, subGraphItems); return find(clazz, filters, orderFields, 0, 0, subGraphItems);
} }
@Lock(LockType.READ)
public <T extends Serializable> List<T> find(Class<T> clazz, Map<String, Object> filters, List<String> orderFields, int limit, int offset, String... subGraphItems) { public <T extends Serializable> List<T> find(Class<T> clazz, Map<String, Object> filters, List<String> orderFields, int limit, int offset, String... subGraphItems) {
final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<T> criteria = cb.createQuery(clazz); final CriteriaQuery<T> criteria = cb.createQuery(clazz);
@ -118,12 +110,10 @@ public abstract class CommonAbstractController {
return query.getResultList(); return query.getResultList();
} }
@Lock(LockType.READ)
public <T extends Serializable> List<T> find(Class<T> clazz, List<SearchFilter> filters, List<String> orderFields, String... subGraphItems) throws ControllerException { public <T extends Serializable> List<T> find(Class<T> clazz, List<SearchFilter> filters, List<String> orderFields, String... subGraphItems) throws ControllerException {
return find(clazz, filters, orderFields, 0, 0); return find(clazz, filters, orderFields, 0, 0);
} }
@Lock(LockType.READ)
public <T extends Serializable> List<T> find(Class<T> clazz, List<SearchFilter> filters, List<String> orderFields, int limit, int offset, String... subGraphItems) throws ControllerException { public <T extends Serializable> List<T> find(Class<T> clazz, List<SearchFilter> filters, List<String> orderFields, int limit, int offset, String... subGraphItems) throws ControllerException {
final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<T> criteria = cb.createQuery(clazz); final CriteriaQuery<T> criteria = cb.createQuery(clazz);
@ -157,7 +147,6 @@ public abstract class CommonAbstractController {
* @return a list of all entities found * @return a list of all entities found
* @throws ControllerException if the search cannot be executed. * @throws ControllerException if the search cannot be executed.
*/ */
@Lock(LockType.READ)
public <T extends Serializable> List<T> findAll(Class<T> entityClass) throws ControllerException { public <T extends Serializable> List<T> findAll(Class<T> entityClass) throws ControllerException {
return findAll(entityClass, new ArrayList<>()); return findAll(entityClass, new ArrayList<>());
} }
@ -170,7 +159,6 @@ public abstract class CommonAbstractController {
* @return a list of all entities found * @return a list of all entities found
* @throws ControllerException if the search cannot be executed. * @throws ControllerException if the search cannot be executed.
*/ */
@Lock(LockType.READ)
public <T extends Serializable> List<T> findAll(Class<T> entityClass, String... orderFields) throws ControllerException { public <T extends Serializable> List<T> findAll(Class<T> entityClass, String... orderFields) throws ControllerException {
return findAll(entityClass, Arrays.asList(orderFields)); return findAll(entityClass, Arrays.asList(orderFields));
} }
@ -183,7 +171,6 @@ public abstract class CommonAbstractController {
* @return a list of all entities found * @return a list of all entities found
* @throws ControllerException if the search cannot be executed. * @throws ControllerException if the search cannot be executed.
*/ */
@Lock(LockType.READ)
public <T extends Serializable> List<T> findAll(Class<T> entityClass, List<String> orderFields) throws ControllerException { public <T extends Serializable> List<T> findAll(Class<T> entityClass, List<String> orderFields) throws ControllerException {
final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<T> criteria = cb.createQuery(entityClass); final CriteriaQuery<T> criteria = cb.createQuery(entityClass);
@ -239,9 +226,7 @@ public abstract class CommonAbstractController {
* @return the entity after it has been written to the database. * @return the entity after it has been written to the database.
* @throws ControllerException if the the creation or update of the entity fails. * @throws ControllerException if the the creation or update of the entity fails.
*/ */
@TransactionAttribute(TransactionAttributeType.REQUIRED) @Transactional(TxType.REQUIRED)
@Transactional
@Lock(LockType.WRITE)
public <T extends IdentifiableEntity> T createOrUpdate(T entity, String createdBy) throws ControllerException { public <T extends IdentifiableEntity> T createOrUpdate(T entity, String createdBy) throws ControllerException {
if (entity.getId() == null) { if (entity.getId() == null) {
create(entity, createdBy); create(entity, createdBy);
@ -260,9 +245,7 @@ public abstract class CommonAbstractController {
* @return the entity after it has been written to the database. * @return the entity after it has been written to the database.
* @throws ControllerException if the the creation fails * @throws ControllerException if the the creation fails
*/ */
@TransactionAttribute(TransactionAttributeType.REQUIRED) @Transactional(TxType.REQUIRED)
@Transactional
@Lock(LockType.WRITE)
public <T> T create(T entity, String createdBy) throws ControllerException { public <T> T create(T entity, String createdBy) throws ControllerException {
if (Auditable.class.isAssignableFrom(entity.getClass())) { if (Auditable.class.isAssignableFrom(entity.getClass())) {
Audit audit = ((Auditable) entity).getAudit(); Audit audit = ((Auditable) entity).getAudit();
@ -324,9 +307,7 @@ public abstract class CommonAbstractController {
* @return the entity after it has been written to the database. * @return the entity after it has been written to the database.
* @throws ControllerException if the the updates fails * @throws ControllerException if the the updates fails
*/ */
@TransactionAttribute(TransactionAttributeType.REQUIRED) @Transactional(TxType.REQUIRED)
@Transactional
@Lock(LockType.WRITE)
public <T extends Serializable> T update(T entity, String updatedBy) throws ControllerException { public <T extends Serializable> T update(T entity, String updatedBy) throws ControllerException {
T currentEntity = executeUpdate(entity, updatedBy); T currentEntity = executeUpdate(entity, updatedBy);
if (EndDateable.class.isAssignableFrom(entity.getClass())) { if (EndDateable.class.isAssignableFrom(entity.getClass())) {
@ -348,9 +329,7 @@ public abstract class CommonAbstractController {
* @param deletedBy the username to apply write into the audit history * @param deletedBy the username to apply write into the audit history
* @throws ControllerException if the deletion fails. * @throws ControllerException if the deletion fails.
*/ */
@TransactionAttribute(TransactionAttributeType.REQUIRED) @Transactional(TxType.REQUIRED)
@Transactional
@Lock(LockType.WRITE)
public <T extends Serializable> void delete(T entity, String deletedBy) throws ControllerException { public <T extends Serializable> void delete(T entity, String deletedBy) throws ControllerException {
// if the entity is endDateable just set the validToDate to now intead of executing the deletion // if the entity is endDateable just set the validToDate to now intead of executing the deletion
if (EndDateable.class.isAssignableFrom(entity.getClass())) { if (EndDateable.class.isAssignableFrom(entity.getClass())) {

View File

@ -15,17 +15,19 @@
*/ */
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import javax.ejb.ApplicationException;
import lombok.Getter;
/** /**
* Generic exception if an exception inside a Controller class occurs * Generic exception if an exception inside a Controller class occurs
* *
* @author Joern Muehlencord (joern@muehlencord.de) * @author Joern Muehlencord (joern@muehlencord.de)
*/ */
@ApplicationException(rollback = true) @Getter
public class ControllerException extends Exception { public class ControllerException extends Exception {
private static final long serialVersionUID = 5190280225284514859L; private static final long serialVersionUID = 5190280225284514859L;
public static final int INTERNAL_ERROR = 0; public static final int INTERNAL_ERROR = 0;
public static final int CAUSE_ALREADY_EXISTS = 1; public static final int CAUSE_ALREADY_EXISTS = 1;
public static final int CAUSE_NOT_FOUND = 2; public static final int CAUSE_NOT_FOUND = 2;
@ -60,12 +62,4 @@ public class ControllerException extends Exception {
this.causeCode = causeCode; this.causeCode = causeCode;
} }
/**
* returns the cause code
*
* @return the cause code
*/
public int getCauseCode() {
return causeCode;
}
} }

View File

@ -16,14 +16,15 @@
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import de.muehlencord.shared.util.DateUtil; import de.muehlencord.shared.util.DateUtil;
import jakarta.persistence.Id;
import java.beans.IntrospectionException; import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.io.Serializable; import java.io.Serializable;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import javax.persistence.Id;
import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.lang3.SerializationUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
@ -32,7 +33,7 @@ import org.slf4j.LoggerFactory;
*/ */
public class EntityUtil { public class EntityUtil {
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(EntityUtil.class); private static final Logger logger = LoggerFactory.getLogger(EntityUtil.class);
public static Field getIdField(Class<?> entity) { public static Field getIdField(Class<?> entity) {
if (entity == null) { if (entity == null) {
@ -63,8 +64,8 @@ public class EntityUtil {
if (field == null) { if (field == null) {
return entity; return entity;
} }
if (LOGGER.isDebugEnabled()) { if (logger.isDebugEnabled()) {
LOGGER.debug("id column of {} is {}", entity.getClass().getSimpleName(), field.getName()); logger.debug("id column of {} is {}", entity.getClass().getSimpleName(), field.getName());
} }
try { try {

View File

@ -1,11 +1,11 @@
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import jakarta.persistence.Basic;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import java.io.Serializable; import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass @MappedSuperclass
public abstract class NumericallyIdentifiedEntity implements Serializable { public abstract class NumericallyIdentifiedEntity implements Serializable {

View File

@ -1,29 +0,0 @@
/*
* Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.muehlencord.shared.db;
import javax.ejb.Stateless;
/**
*
* @author Joern Muehlencord (joern@muehlencord.de)
*/
@Stateless
public class StandardController extends CommonAbstractController {
}

View File

@ -15,14 +15,14 @@
*/ */
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
/** /**
* *

View File

@ -15,16 +15,16 @@
*/ */
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQueries;
import jakarta.persistence.NamedQuery;
import jakarta.persistence.Table;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.io.Serializable; import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/** /**
* *

View File

@ -15,21 +15,21 @@
*/ */
package de.muehlencord.shared.db; package de.muehlencord.shared.db;
import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQueries;
import jakarta.persistence.NamedQuery;
import jakarta.persistence.Table;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.io.Serializable; import java.io.Serializable;
import java.util.UUID; import java.util.UUID;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/** /**
* *

View File

@ -15,7 +15,8 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
--> -->
<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"> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<artifactId>shared</artifactId> <artifactId>shared</artifactId>
@ -30,24 +31,10 @@ limitations under the License.
<name>shared-jeeutil</name> <name>shared-jeeutil</name>
<dependencies> <dependencies>
<!-- Faces Support -->
<dependency> <dependency>
<groupId>io.fusionauth</groupId> <groupId>org.glassfish</groupId>
<artifactId>fusionauth-jwt</artifactId> <artifactId>jakarta.faces</artifactId>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.primefaces</groupId> <groupId>org.primefaces</groupId>
@ -55,18 +42,43 @@ limitations under the License.
<type>jar</type> <type>jar</type>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- jakarta api -->
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<dependency>
<groupId>jakarta.interceptor</groupId>
<artifactId>jakarta.interceptor-api</artifactId>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- unsorted -->
<dependency>
<groupId>io.fusionauth</groupId>
<artifactId>fusionauth-jwt</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>3.1</ejbVersion>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

View File

@ -15,8 +15,8 @@
*/ */
package de.muehlencord.shared.jeeutil; package de.muehlencord.shared.jeeutil;
import javax.faces.application.FacesMessage; import jakarta.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity; import jakarta.faces.application.FacesMessage.Severity;
/** /**
* *

View File

@ -15,9 +15,9 @@
*/ */
package de.muehlencord.shared.jeeutil; package de.muehlencord.shared.jeeutil;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import java.util.List; import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
/** /**
* Helper class for java faces application. * Helper class for java faces application.

View File

@ -15,8 +15,8 @@
*/ */
package de.muehlencord.shared.jeeutil; package de.muehlencord.shared.jeeutil;
import jakarta.faces.application.FacesMessage;
import java.io.Serializable; import java.io.Serializable;
import javax.faces.application.FacesMessage;
/** /**
* *

View File

@ -15,7 +15,7 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
/** /**
* *

View File

@ -15,6 +15,7 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import jakarta.ws.rs.core.Response;
import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.XmlRootElement;
@ -22,7 +23,6 @@ import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Locale; import java.util.Locale;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import javax.ws.rs.core.Response;
/** /**
* *

View File

@ -16,9 +16,9 @@
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import java.util.Locale; import java.util.Locale;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
/** /**
* *

View File

@ -15,12 +15,12 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import jakarta.inject.Inject;
import jakarta.interceptor.AroundInvoke;
import jakarta.interceptor.InvocationContext;
import jakarta.validation.ConstraintViolationException;
import jakarta.ws.rs.core.Response;
import java.util.Locale; import java.util.Locale;
import javax.inject.Inject;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.validation.ConstraintViolationException;
import javax.ws.rs.core.Response;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@ -15,10 +15,10 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.BadRequestException; import jakarta.ws.rs.BadRequestException;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import jakarta.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,12 +15,12 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Path;
import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.XmlRootElement;
import java.util.Iterator; import java.util.Iterator;
import javax.validation.ConstraintViolation;
import javax.validation.Path;
/** /**
* *

View File

@ -15,19 +15,19 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.GenericEntity;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Request;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Variant;
import jakarta.ws.rs.ext.ExceptionMapper;
import jakarta.ws.rs.ext.Provider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Variant;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,10 +15,10 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.ForbiddenException; import jakarta.ws.rs.ForbiddenException;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import jakarta.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,10 +15,10 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.NotAcceptableException; import jakarta.ws.rs.NotAcceptableException;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import jakarta.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,10 +15,10 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.NotAllowedException; import jakarta.ws.rs.NotAllowedException;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import jakarta.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,10 +15,10 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.NotAuthorizedException; import jakarta.ws.rs.NotAuthorizedException;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import jakarta.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,10 +15,10 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.NotFoundException; import jakarta.ws.rs.NotFoundException;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import jakarta.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,10 +15,10 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import javax.ws.rs.NotSupportedException; import jakarta.ws.rs.NotSupportedException;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper; import jakarta.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider; import jakarta.ws.rs.ext.Provider;
/** /**
* *

View File

@ -15,9 +15,9 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import jakarta.xml.bind.annotation.adapters.XmlAdapter; import jakarta.xml.bind.annotation.adapters.XmlAdapter;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
/** /**
* @author Joern Muehlencord (joern@muehlencord.de) * @author Joern Muehlencord (joern@muehlencord.de)

View File

@ -15,12 +15,12 @@
*/ */
package de.muehlencord.shared.jeeutil.restexfw; package de.muehlencord.shared.jeeutil.restexfw;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import java.util.Set; import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
/** /**
* *

View File

@ -15,16 +15,16 @@
*/ */
package de.muehlencord.shared.jeeutil.validator; package de.muehlencord.shared.jeeutil.validator;
import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import org.primefaces.validate.bean.ClientConstraint;
/** /**
* *
@ -33,7 +33,8 @@ import org.primefaces.validate.bean.ClientConstraint;
@Target({METHOD, FIELD, ANNOTATION_TYPE}) @Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME) @Retention(RUNTIME)
@Constraint(validatedBy = EmailConstraintValidator.class) @Constraint(validatedBy = EmailConstraintValidator.class)
@ClientConstraint(resolvedBy = EmailClientValidationConstraint.class) // FIXME - broken ClientValidationConstraint from Primefaces 13 still uses javax.xx
//@ClientConstraint(resolvedBy = EmailClientValidationConstraint.class)
@Documented @Documented
public @interface Email { public @interface Email {

View File

@ -15,21 +15,20 @@
*/ */
package de.muehlencord.shared.jeeutil.validator; package de.muehlencord.shared.jeeutil.validator;
import jakarta.validation.metadata.ConstraintDescriptor;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.validation.metadata.ConstraintDescriptor;
import org.primefaces.validate.bean.ClientValidationConstraint;
/** /**
* * FIXME - broken ClientValidationConstraint from Primefaces 13 still uses javax.xx
* @author Joern Muehlencord (joern@muehlencord.de) * @author Joern Muehlencord (joern@muehlencord.de)
*/ */
public class EmailClientValidationConstraint implements ClientValidationConstraint { public class EmailClientValidationConstraint { // {implements ClientValidationConstraint {
public static final String MESSAGE_METADATA = "data-p-email-msg"; public static final String MESSAGE_METADATA = "data-p-email-msg";
@Override // @Override
public Map<String, Object> getMetadata(ConstraintDescriptor constraintDescriptor) { public Map<String, Object> getMetadata(ConstraintDescriptor<?> constraintDescriptor) {
Map<String, Object> metadata = new HashMap<>(); Map<String, Object> metadata = new HashMap<>();
Map<?, ?> attrs = constraintDescriptor.getAttributes(); Map<?, ?> attrs = constraintDescriptor.getAttributes();
Object message = attrs.get("message"); Object message = attrs.get("message");
@ -40,7 +39,7 @@ public class EmailClientValidationConstraint implements ClientValidationConstrai
return metadata; return metadata;
} }
@Override // @Override
public String getValidatorId() { public String getValidatorId() {
return Email.class.getSimpleName(); return Email.class.getSimpleName();
} }

View File

@ -15,9 +15,9 @@
*/ */
package de.muehlencord.shared.jeeutil.validator; package de.muehlencord.shared.jeeutil.validator;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/** /**
* *

View File

@ -15,14 +15,14 @@
*/ */
package de.muehlencord.shared.jeeutil.validator; package de.muehlencord.shared.jeeutil.validator;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.component.UIComponent;
import jakarta.faces.context.FacesContext;
import jakarta.faces.validator.FacesValidator;
import jakarta.faces.validator.Validator;
import jakarta.faces.validator.ValidatorException;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
/** /**
* *

96
pom.xml
View File

@ -83,23 +83,35 @@ limitations under the License.
<jackson.version>2.14.2</jackson.version> <jackson.version>2.14.2</jackson.version>
<lombok.version>1.18.26</lombok.version> <lombok.version>1.18.26</lombok.version>
<junit.version>5.9.2</junit.version> <junit.version>5.9.2</junit.version>
<primefaces.version>12.0.0</primefaces.version>
<adminfaces-template.version>1.6.1</adminfaces-template.version>
<omnifaces.version>4.0.1</omnifaces.version>
<poi.version>5.2.3</poi.version> <poi.version>5.2.3</poi.version>
<commons-net.version>3.9.0</commons-net.version> <commons-net.version>3.9.0</commons-net.version>
<commons-lang.version>3.12.0</commons-lang.version>
<gson.version>2.10.1</gson.version> <gson.version>2.10.1</gson.version>
<fusionauth.version>5.2.2</fusionauth.version> <fusionauth.version>5.2.2</fusionauth.version>
<bouncycastle.version>1.70</bouncycastle.version> <bouncycastle.version>1.70</bouncycastle.version>
<hibernate.version>6.1.7.Final</hibernate.version> <hibernate.version>6.1.7.Final</hibernate.version>
<com-sun-mail.version>1.6.2</com-sun-mail.version>
<jakarta-faces.version>4.0.4</jakarta-faces.version>
<joinfaces.version>5.1.4</joinfaces.version>
<jakarta.interceptor-api.version>2.1.0</jakarta.interceptor-api.version>
<jakarta-inject-api.version>2.0.0</jakarta-inject-api.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
<dependency>
<groupId>org.joinfaces</groupId>
<artifactId>joinfaces-dependencies</artifactId>
<version>${joinfaces.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency> <dependency>
<artifactId>shared-db</artifactId> <artifactId>shared-db</artifactId>
<groupId>de.muehlencord.shared</groupId> <groupId>de.muehlencord.shared</groupId>
<type>ejb</type>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>
@ -112,11 +124,8 @@ limitations under the License.
<groupId>de.muehlencord.shared</groupId> <groupId>de.muehlencord.shared</groupId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<artifactId>commons-codec</artifactId> <!-- Apache Commons -->
<groupId>commons-codec</groupId>
<version>1.15</version>
</dependency>
<dependency> <dependency>
<artifactId>commons-net</artifactId> <artifactId>commons-net</artifactId>
<groupId>commons-net</groupId> <groupId>commons-net</groupId>
@ -125,13 +134,10 @@ limitations under the License.
<dependency> <dependency>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<version>3.12.0</version> <version>${commons-lang.version}</version>
</dependency>
<dependency>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
<version>2.11.0</version>
</dependency> </dependency>
<!-- logging -->
<dependency> <dependency>
<artifactId>slf4j-api</artifactId> <artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
@ -148,16 +154,36 @@ limitations under the License.
<version>${slf4j.version}</version> <version>${slf4j.version}</version>
</dependency> </dependency>
<!-- mail -->
<dependency> <dependency>
<artifactId>javax.mail</artifactId> <artifactId>javax.mail</artifactId>
<groupId>com.sun.mail</groupId> <groupId>com.sun.mail</groupId>
<version>1.6.2</version> <version>${com-sun-mail.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<artifactId>ews-java-api</artifactId> <artifactId>ews-java-api</artifactId>
<groupId>com.microsoft.ews-java-api</groupId> <groupId>com.microsoft.ews-java-api</groupId>
<version>2.0</version> <version>2.0</version>
</dependency> </dependency>
<!-- Faces -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.faces</artifactId>
<version>${jakarta-faces.version}</version>
</dependency>
<dependency>
<groupId>jakarta.interceptor</groupId>
<artifactId>jakarta.interceptor-api</artifactId>
<version>${jakarta.interceptor-api.version}</version>
</dependency>
<dependency>
<groupId>jakarta.inject</groupId>
<artifactId>jakarta.inject-api</artifactId>
<version>${jakarta-inject-api.version}</version>
</dependency>
<!-- mixed tools -->
<dependency> <dependency>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
@ -180,17 +206,7 @@ limitations under the License.
<groupId>com.fasterxml.jackson.datatype</groupId> <groupId>com.fasterxml.jackson.datatype</groupId>
<version>${jackson.version}</version> <version>${jackson.version}</version>
</dependency> </dependency>
<dependency>
<artifactId>javaee-api</artifactId>
<groupId>javax</groupId>
<version>8.0.1</version>
</dependency>
<dependency>
<artifactId>javaee-web-api</artifactId>
<groupId>javax</groupId>
<scope>provided</scope>
<version>8.0.1</version>
</dependency>
<dependency> <dependency>
<artifactId>scrypt</artifactId> <artifactId>scrypt</artifactId>
<groupId>com.lambdaworks</groupId> <groupId>com.lambdaworks</groupId>
@ -208,21 +224,6 @@ limitations under the License.
<type>jar</type> <type>jar</type>
<version>${hibernate.version}</version> <version>${hibernate.version}</version>
</dependency> </dependency>
<dependency>
<artifactId>primefaces</artifactId>
<groupId>org.primefaces</groupId>
<version>${primefaces.version}</version>
</dependency>
<dependency>
<artifactId>admin-template</artifactId>
<groupId>com.github.adminfaces</groupId>
<version>${adminfaces-template.version}</version>
</dependency>
<dependency>
<artifactId>omnifaces</artifactId>
<groupId>org.omnifaces</groupId>
<version>${omnifaces.version}</version>
</dependency>
<dependency> <dependency>
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
@ -387,10 +388,11 @@ limitations under the License.
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId> <artifactId>maven-release-plugin</artifactId>
<configuration> <configuration>
<tagNameFormat>v@{project.version}</tagNameFormat> <tagNameFormat>v@{project.version}</tagNameFormat>
@ -398,8 +400,14 @@ limitations under the License.
<version>2.5.3</version> <version>2.5.3</version>
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-surefire-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.1</version>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>