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();