From e6b4cd695cfc6c0d4b0ea53cc403a4384d0f4d69 Mon Sep 17 00:00:00 2001
From: Joaquín Reñé <jrene@curisit.net>
Date: Sun, 19 Apr 2026 15:44:36 +0000
Subject: [PATCH] #4479 - upgrade SecurisServer to Java 21

---
 securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java                  |    9 +++-
 securis/src/main/java/net/curisit/securis/RestServicesApplication.java                    |    2 
 securis/src/main/java/net/curisit/securis/db/listeners/CreationTimestampListener.java     |    2 
 securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java                    |    7 +++
 securis/src/main/webapp/src/app/footer.component.ts                                       |    2 
 securis/src/main/java/net/curisit/securis/db/listeners/ModificationTimestampListener.java |    4 +-
 securis/src/main/java/net/curisit/securis/services/PackResource.java                      |    4 +-
 securis/pom.xml                                                                           |   12 ++++++
 securis/src/main/webapp/WEB-INF/web.xml                                                   |    4 +-
 securis/src/main/java/net/curisit/securis/services/UserResource.java                      |    5 ++
 securis/src/main/java/net/curisit/securis/db/Settings.java                                |   14 +++---
 securis/src/main/webapp/src/app/user.service.ts                                           |    4 +-
 securis/src/main/java/net/curisit/securis/ioc/EntityManagerProvider.java                  |   18 +++------
 13 files changed, 54 insertions(+), 33 deletions(-)

diff --git a/securis/pom.xml b/securis/pom.xml
index cc62f8a..7ee0670 100644
--- a/securis/pom.xml
+++ b/securis/pom.xml
@@ -59,6 +59,11 @@
             <artifactId>resteasy-jackson2-provider</artifactId>
             <version>${resteasy.version}</version>
         </dependency>
+        <dependency>
+		    <groupId>org.jboss.resteasy</groupId>
+		    <artifactId>resteasy-cdi</artifactId>
+		    <version>${resteasy.version}</version>
+		</dependency>
 		<dependency>
 		  <groupId>org.apache.httpcomponents</groupId>
 		  <artifactId>httpmime</artifactId>
@@ -102,11 +107,18 @@
             <version>${hibernate.version}</version>
         </dependency>
         -->
+        <!--
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
             <version>${hibernate.version}</version>
         </dependency>
+        -->
+        <dependency>
+		    <groupId>org.hibernate</groupId>
+		    <artifactId>hibernate-core-jakarta</artifactId>
+		    <version>5.6.15.Final</version>
+		</dependency>			
 
         <!-- Logging -->
         <dependency>
diff --git a/securis/src/main/java/net/curisit/securis/RestServicesApplication.java b/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
index c3dcffe..b6a7ea3 100644
--- a/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
+++ b/securis/src/main/java/net/curisit/securis/RestServicesApplication.java
@@ -8,7 +8,7 @@
 
 import jakarta.ws.rs.core.Application;
 
-///import net.curisit.securis.ioc.RequestsInterceptor;
+/// import net.curisit.securis.ioc.RequestsInterceptor;
 import net.curisit.securis.services.ApiResource;
 import net.curisit.securis.services.ApplicationResource;
 import net.curisit.securis.services.BasicServices;
diff --git a/securis/src/main/java/net/curisit/securis/db/Settings.java b/securis/src/main/java/net/curisit/securis/db/Settings.java
index ed28e2c..1455bee 100644
--- a/securis/src/main/java/net/curisit/securis/db/Settings.java
+++ b/securis/src/main/java/net/curisit/securis/db/Settings.java
@@ -6,13 +6,13 @@
 import java.io.Serializable;
 import java.util.Date;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
 
 import net.curisit.securis.db.common.ModificationTimestampEntity;
 import net.curisit.securis.db.listeners.ModificationTimestampListener;
diff --git a/securis/src/main/java/net/curisit/securis/db/listeners/CreationTimestampListener.java b/securis/src/main/java/net/curisit/securis/db/listeners/CreationTimestampListener.java
index 0e858e3..bd53c19 100644
--- a/securis/src/main/java/net/curisit/securis/db/listeners/CreationTimestampListener.java
+++ b/securis/src/main/java/net/curisit/securis/db/listeners/CreationTimestampListener.java
@@ -5,7 +5,7 @@
 
 import java.util.Date;
 
-import javax.persistence.PrePersist;
+import jakarta.persistence.PrePersist;
 
 import net.curisit.securis.db.common.CreationTimestampEntity;
 
diff --git a/securis/src/main/java/net/curisit/securis/db/listeners/ModificationTimestampListener.java b/securis/src/main/java/net/curisit/securis/db/listeners/ModificationTimestampListener.java
index 937269f..856db96 100644
--- a/securis/src/main/java/net/curisit/securis/db/listeners/ModificationTimestampListener.java
+++ b/securis/src/main/java/net/curisit/securis/db/listeners/ModificationTimestampListener.java
@@ -5,8 +5,8 @@
 
 import java.util.Date;
 
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
 
 import net.curisit.securis.db.common.ModificationTimestampEntity;
 
diff --git a/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java b/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java
index fe4612d..dc560fa 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProducer.java
@@ -19,7 +19,7 @@
 @RequestScoped
 public class EntityManagerProducer {
 
-    private static final Logger LOG = LogManager.getLogger(EntityManagerProducer.class);
+    private static final Logger log = LogManager.getLogger(EntityManagerProducer.class);
 
     @Inject
     private EntityManagerProvider emProvider;
@@ -28,13 +28,16 @@
     @RequestScoped
     public EntityManager produceEntityManager() {
         EntityManager em = emProvider.getEntityManager();
-        LOG.info("Produced EntityManager: {}", em);
+        if (em == null) {
+            throw new IllegalStateException("EntityManagerProvider returned null EntityManager");
+        }
+        log.info("Produced EntityManager: {}", em);
         return em;
     }
 
     public void closeEntityManager(@Disposes EntityManager em) {
         if (em != null && em.isOpen()) {
-            LOG.info("Closing produced EntityManager: {}", em);
+            log.info("Closing produced EntityManager: {}", em);
             em.close();
         }
     }
diff --git a/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProvider.java b/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProvider.java
index 19bdfc8..d4d2e74 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProvider.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/EntityManagerProvider.java
@@ -45,7 +45,7 @@
             log.info("EntityManagerFactory initialized correctly: {}", entityManagerFactory);
         } catch (Exception e) {
             log.error("Error creating EntityManagerFactory for persistence unit 'localdb'", e);
-            entityManagerFactory = null;
+            throw new IllegalStateException("Could not initialize EntityManagerFactory", e);
         }
     }
     
@@ -56,17 +56,11 @@
     * @return a new EntityManager; caller must close it
     */
     public EntityManager getEntityManager() {
-        try {
-            if (entityManagerFactory == null) {
-                log.error("EntityManagerFactory is null");
-                return null;
-            }
-            EntityManager em = entityManagerFactory.createEntityManager();
-            log.info("Created EntityManager: {}", em);
-            return em;
-        } catch (Exception e) {
-            log.error("Error creating EntityManager", e);
-            return null;
+        if (entityManagerFactory == null) {
+            throw new IllegalStateException("EntityManagerFactory is null");
         }
+        EntityManager em = entityManagerFactory.createEntityManager();
+        log.info("Created EntityManager: {}", em);
+        return em;
     }
 }
diff --git a/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java b/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
index 4c55831..64e3e92 100644
--- a/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
+++ b/securis/src/main/java/net/curisit/securis/ioc/RequestsInterceptor.java
@@ -9,6 +9,7 @@
 import java.util.Set;
 
 import jakarta.annotation.Priority;
+import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import jakarta.persistence.EntityManager;
 import jakarta.servlet.http.HttpServletRequest;
@@ -53,6 +54,7 @@
 * Last reviewed by JRA on Oct 5, 2025.
 */
 @Provider
+@ApplicationScoped
 @Priority(Priorities.AUTHENTICATION)
 public class RequestsInterceptor implements ContainerRequestFilter, WriterInterceptor {
 
@@ -82,6 +84,11 @@
     @Override
     public void filter(ContainerRequestContext requestContext) throws IOException {
     	
+    	log.info("RequestsInterceptor instance={}", this);
+    	log.info("Injected tokenHelper={}", tokenHelper);
+    	log.info("Injected cache={}", cache);
+    	log.info("Injected em={}", em);
+    	
     	Method method = resourceInfo != null ? resourceInfo.getResourceMethod() : null;
         if (method == null) {
             log.warn("RequestsInterceptor: resource method is null");
diff --git a/securis/src/main/java/net/curisit/securis/services/PackResource.java b/securis/src/main/java/net/curisit/securis/services/PackResource.java
index 85b784f..5049445 100644
--- a/securis/src/main/java/net/curisit/securis/services/PackResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/PackResource.java
@@ -74,7 +74,7 @@
 	@Inject MetadataHelper metadataHelper;
 	@Inject private LicenseHelper licenseHelper;
 
-	@Context EntityManager em;
+	@Inject EntityManager em;
 
 	/**
 	 * index
@@ -310,7 +310,7 @@
 	 * @throws SeCurisServiceException on invalid state.
 	 */
 	@POST
-	@Path("/{packId}/putonhold}")
+	@Path("/{packId}/putonhold")
 	@EnsureTransaction
 	@Securable(roles = Rol.ADMIN | Rol.ADVANCE)
 	@RolesAllowed(BasicSecurityContext.ROL_ADMIN)
diff --git a/securis/src/main/java/net/curisit/securis/services/UserResource.java b/securis/src/main/java/net/curisit/securis/services/UserResource.java
index 0764f5e..3674d25 100644
--- a/securis/src/main/java/net/curisit/securis/services/UserResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/UserResource.java
@@ -406,6 +406,11 @@
         LOG.info("index session: " + request.getSession());
         LOG.info("login() called. session={}", request.getSession(false));
         LOG.info("login() username='{}'", username);
+        
+        LOG.info("UserResource instance={}", this);
+        LOG.info("Injected em={}", em);
+        LOG.info("Injected tokenHelper={}", tokenHelper);
+        LOG.info("Injected cache={}", cache);
 
         if (username == null || username.trim().isEmpty()) {
             LOG.error("login() username is null or empty");
diff --git a/securis/src/main/webapp/WEB-INF/web.xml b/securis/src/main/webapp/WEB-INF/web.xml
index 61cb287..32393d6 100644
--- a/securis/src/main/webapp/WEB-INF/web.xml
+++ b/securis/src/main/webapp/WEB-INF/web.xml
@@ -36,17 +36,17 @@
         <param-name>resteasy.providers</param-name>
         <param-value>net.curisit.securis.DefaultExceptionHandler</param-value>
     </context-param>
+     
     <context-param>
 	    <param-name>resteasy.servlet.mapping.prefix</param-name>
 	    <param-value>/api</param-value>
 	</context-param>
     
-    <!-- 
 	<context-param>
 		<param-name>resteasy.injector.factory</param-name>
 		<param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
 	</context-param>
-     -->
+     
      
 	<filter>
         <filter-name>DevFilter</filter-name>
diff --git a/securis/src/main/webapp/src/app/footer.component.ts b/securis/src/main/webapp/src/app/footer.component.ts
index 2018eaa..309167b 100644
--- a/securis/src/main/webapp/src/app/footer.component.ts
+++ b/securis/src/main/webapp/src/app/footer.component.ts
@@ -17,7 +17,7 @@
 
   ngOnInit(): void {
             //TODO Move to service
-      this.http.get("api/version", /* workaround to avoid OPTIONS method request*/ new BaseRequestOptions())
+      this.http.get("version", /* workaround to avoid OPTIONS method request*/ new BaseRequestOptions())
         .map((res) => <string>res.json().version)
         .subscribe(
           version => this.securisVersion = version,
diff --git a/securis/src/main/webapp/src/app/user.service.ts b/securis/src/main/webapp/src/app/user.service.ts
index 95273eb..45bb541 100644
--- a/securis/src/main/webapp/src/app/user.service.ts
+++ b/securis/src/main/webapp/src/app/user.service.ts
@@ -27,7 +27,7 @@
     params.append('username', username);
     params.append('password', password);
     let options = new RequestOptions({ headers: new Headers({ "Content-Type": "application/x-www-form-urlencoded" })});
-    return this.http.post('api/user/login', params.toString(), options)
+    return this.http.post('user/login', params.toString(), options)
                     .map((resp) => this.mapLogin(resp))
                     .catch((err) => super.processErrorResponse(err));
   }
@@ -47,7 +47,7 @@
     }
     var token = this.store.get("token");
     let option = new RequestOptions({ headers: new Headers({ 'X-SECURIS-TOKEN': token }) });
-    return this.http.get('api/check', option)
+    return this.http.get('check', option)
                     .map((resp) => this.mapCheck(resp))
                     .catch((err) => super.processErrorResponse(err));
   }

--
Gitblit v1.3.2