This is an automated email from the ASF dual-hosted git repository.

vlamp pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git


The following commit(s) were added to refs/heads/master by this push:
     new dca4fd046 TAP5-2749: Incorrect behavior of getIfExists in 
EntityApplicationStatePersistenceStrategy (#36)
dca4fd046 is described below

commit dca4fd046fc222ed27af9f599c8149908c9f7657
Author: Vladimir V. Bychkov <m...@bychkov.name>
AuthorDate: Sun Apr 23 23:51:30 2023 +0200

    TAP5-2749: Incorrect behavior of getIfExists in 
EntityApplicationStatePersistenceStrategy (#36)
    
    * TAP5-2749: fixing incorrect behavior of getIfExists in subclasses of 
SessionApplicationStatePersistenceStrategy
    
    * TAP5-2749: add integration test
    
    * TAP5-2749: use existing test aplication instead of creating new one
    
    * TAP5-2749: Simplified test.
    
    * TAP5-2749: Removed obsolete runTestApp7 task.
    
    ---------
    
    Co-authored-by: Volker Lamp <vl...@apache.org>
---
 .../services/SessionApplicationStatePersistenceStrategy.java     | 7 ++++++-
 .../web/internal/EntityApplicationStatePersistenceStrategy.java  | 8 +++++++-
 tapestry-jpa/build.gradle                                        | 1 -
 .../internal/jpa/EntityApplicationStatePersistenceStrategy.java  | 8 +++++++-
 tapestry-jpa/src/test/app6/SSOEntity.tml                         | 3 ++-
 tapestry-jpa/src/test/java/org/example/app6/pages/SSOEntity.java | 9 +++++++++
 6 files changed, 31 insertions(+), 5 deletions(-)

diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SessionApplicationStatePersistenceStrategy.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SessionApplicationStatePersistenceStrategy.java
index 1840d8eb7..63655a7cd 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SessionApplicationStatePersistenceStrategy.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/SessionApplicationStatePersistenceStrategy.java
@@ -72,11 +72,16 @@ public class SessionApplicationStatePersistenceStrategy 
implements ApplicationSt
 
             Object sso = session.getAttribute(key);
 
-            return sso != null ? (T)sso : null;
+            return transformPersistedValue(sso);
         }
         return null;
     }
 
+    protected <T> T transformPersistedValue(Object value)
+    {
+        return (T) value;
+    }
+
     protected <T> String buildKey(Class<T> ssoClass)
     {
         return PREFIX + ssoClass.getName();
diff --git 
a/tapestry-hibernate/src/main/java/org/apache/tapestry5/hibernate/web/internal/EntityApplicationStatePersistenceStrategy.java
 
b/tapestry-hibernate/src/main/java/org/apache/tapestry5/hibernate/web/internal/EntityApplicationStatePersistenceStrategy.java
index de3be9351..66a9b7b13 100644
--- 
a/tapestry-hibernate/src/main/java/org/apache/tapestry5/hibernate/web/internal/EntityApplicationStatePersistenceStrategy.java
+++ 
b/tapestry-hibernate/src/main/java/org/apache/tapestry5/hibernate/web/internal/EntityApplicationStatePersistenceStrategy.java
@@ -36,6 +36,12 @@ public class EntityApplicationStatePersistenceStrategy 
extends SessionApplicatio
         delegate = new EntityPersistentFieldStrategy(hibernateSession, null);
     }
 
+    @Override
+    protected <T> T transformPersistedValue(Object value)
+    {
+        return value instanceof SessionRestorable ? (T) 
delegate.convertPersistedToApplicationValue(value) : (T) value;
+    }
+
     @Override
     @SuppressWarnings("unchecked")
     public <T> T get(Class<T> ssoClass, ApplicationStateCreator<T> creator)
@@ -44,7 +50,7 @@ public class EntityApplicationStatePersistenceStrategy 
extends SessionApplicatio
 
         if (persistedValue instanceof SessionRestorable)
         {
-            Object restored = 
delegate.convertPersistedToApplicationValue(persistedValue);
+            Object restored = transformPersistedValue(persistedValue);
 
             // Maybe throw an exception instead?
             if (restored == null)
diff --git a/tapestry-jpa/build.gradle b/tapestry-jpa/build.gradle
index b03367ba6..e72805b6a 100644
--- a/tapestry-jpa/build.gradle
+++ b/tapestry-jpa/build.gradle
@@ -38,4 +38,3 @@ task runTestApp6(type:JavaExec) {
     args "-d", "src/test/app6", "-p", "8080"
     classpath += project.sourceSets.test.runtimeClasspath
 }
-  
\ No newline at end of file
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
index 4139243bd..7566ea43d 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
@@ -32,6 +32,12 @@ public class EntityApplicationStatePersistenceStrategy 
extends
         this.entityManagerManager = entityManagerManager;
     }
 
+    @Override
+    protected <T> T transformPersistedValue(Object value)
+    {
+        return value instanceof PersistedEntity ? (T) ((PersistedEntity) 
value).restore(entityManagerManager) : (T) value;
+    }
+
     @Override
     public <T> T get(final Class<T> ssoClass, final ApplicationStateCreator<T> 
creator)
     {
@@ -41,7 +47,7 @@ public class EntityApplicationStatePersistenceStrategy extends
         {
             final PersistedEntity persisted = (PersistedEntity) persistedValue;
 
-            final Object restored = persisted.restore(entityManagerManager);
+            final Object restored = transformPersistedValue(persisted);
 
             // shall we maybe throw an exception instead?
             if (restored == null)
diff --git a/tapestry-jpa/src/test/app6/SSOEntity.tml 
b/tapestry-jpa/src/test/app6/SSOEntity.tml
index f7b0cf152..50147646c 100644
--- a/tapestry-jpa/src/test/app6/SSOEntity.tml
+++ b/tapestry-jpa/src/test/app6/SSOEntity.tml
@@ -2,9 +2,10 @@
 <body>
        <p>entity name: <span id="name">${user?.firstName}</span></p>
        <p>persisted entity class name: <span 
id="persistedEntityClassName">${persistedEntityClassName}</span></p>
+       <p>userIfExists: <span id="userIfExists">${userIfExists}</span></p>
        <p><t:eventlink event="persistEntity">persist entity</t:eventlink></p>
        <p><t:eventlink event="setToNull">set to null</t:eventlink></p>
        <p><t:eventlink event="setToTransient">set to 
transient</t:eventlink></p>
        <p><t:eventlink event="delete">delete</t:eventlink></p>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/tapestry-jpa/src/test/java/org/example/app6/pages/SSOEntity.java 
b/tapestry-jpa/src/test/java/org/example/app6/pages/SSOEntity.java
index 90007a86e..7b91dce2f 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/SSOEntity.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/SSOEntity.java
@@ -20,6 +20,7 @@ import org.apache.tapestry5.annotations.SessionState;
 import org.apache.tapestry5.http.services.Request;
 import org.apache.tapestry5.http.services.Session;
 import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.services.ApplicationStateManager;
 import org.example.app6.entities.User;
 import org.example.app6.services.UserDAO;
 
@@ -35,6 +36,14 @@ public class SSOEntity
     @Inject
     private Request request;
 
+    @Inject
+    ApplicationStateManager manager;
+
+    public User getUserIfExists()
+    {
+        return manager.getIfExists(User.class);
+    }
+
     void onPersistEntity()
     {
         final User user = new User();

Reply via email to