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

svenmeier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new c3a3e78  WICKET-6558 no lock after detach
c3a3e78 is described below

commit c3a3e789018f854af1037df6ed7a5f23b0e155c3
Author: Sven Meier <svenme...@apache.org>
AuthorDate: Wed Aug 14 11:13:19 2019 +0200

    WICKET-6558 no lock after detach
    
    this closes #380
---
 .../main/java/org/apache/wicket/Application.java   | 19 +++--------
 .../src/main/java/org/apache/wicket/Session.java   | 13 ++++++++
 .../wicket/util/tester/BaseWicketTester.java       | 24 +++++++++-----
 .../wicket/protocol/http/WebSessionTest.java       | 37 +++++++++++++++++++---
 4 files changed, 65 insertions(+), 28 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java 
b/wicket-core/src/main/java/org/apache/wicket/Application.java
index dde8c38..d9b726a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Application.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
@@ -1569,23 +1569,12 @@ public abstract class Application implements 
UnboundListener, IEventSink, IMetad
                        @Override
                        public void onDetach(final RequestCycle requestCycle)
                        {
-                               IPageManager pageManager;
-                               
-                               if (Session.exists())
-                               {
-                                       pageManager = 
Session.get().getPageManager();
-                               } else {
-                                       pageManager = internalGetPageManager();
-                               }
-                               pageManager.detach();
+                               internalGetPageManager().detach();
 
-                               if (Application.exists())
+                               IRequestLogger requestLogger = 
getRequestLogger();
+                               if (requestLogger != null)
                                {
-                                       IRequestLogger requestLogger = 
Application.get().getRequestLogger();
-                                       if (requestLogger != null)
-                                       {
-                                               
requestLogger.requestTime((System.currentTimeMillis() - 
requestCycle.getStartTime()));
-                                       }
+                                       
requestLogger.requestTime((System.currentTimeMillis() - 
requestCycle.getStartTime()));
                                }
                        }
                });
diff --git a/wicket-core/src/main/java/org/apache/wicket/Session.java 
b/wicket-core/src/main/java/org/apache/wicket/Session.java
index ac37e44..2376267 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Session.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Session.java
@@ -113,6 +113,12 @@ public abstract class Session implements IClusterable, 
IEventSink, IMetadataCont
        /** Logging object */
        private static final Logger log = 
LoggerFactory.getLogger(Session.class);
 
+       /** records if pages have been unlocked for the current request */
+       private static final MetaDataKey<Boolean> PAGES_UNLOCKED = new 
MetaDataKey<>()
+       {
+               private static final long serialVersionUID = 1L;
+       };
+       
        /** records if session has been invalidated by the current request */
        private static final MetaDataKey<Boolean> SESSION_INVALIDATED = new 
MetaDataKey<>()
        {
@@ -670,6 +676,9 @@ public abstract class Session implements IClusterable, 
IEventSink, IMetadataCont
        {
                detachFeedback();
 
+               pageAccessSynchronizer.get().unlockAllPages();
+               RequestCycle.get().setMetaData(PAGES_UNLOCKED, true);
+
                if (isSessionInvalidated())
                {
                        invalidateNow();
@@ -915,6 +924,10 @@ public abstract class Session implements IClusterable, 
IEventSink, IMetadataCont
         */
        public final IPageManager getPageManager()
        {
+               if 
(Boolean.TRUE.equals(RequestCycle.get().getMetaData(PAGES_UNLOCKED))) {
+                       throw new WicketRuntimeException("The request has been 
processed. Access to pages is no longer allowed");
+               }
+               
                IPageManager manager = 
Application.get().internalGetPageManager();
                return pageAccessSynchronizer.get().adapt(manager);
        }
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java 
b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index 3cf02f9..c643baa 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -25,6 +25,7 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.nio.charset.Charset;
 import java.text.ParseException;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -123,14 +124,12 @@ import 
org.apache.wicket.request.mapper.IRequestMapperDelegate;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.settings.ApplicationSettings;
 import org.apache.wicket.settings.RequestCycleSettings.RenderStrategy;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Classes;
 import org.apache.wicket.util.lang.Generics;
 import org.apache.wicket.util.resource.StringResourceStream;
 import org.apache.wicket.util.string.Strings;
-import java.time.Duration;
 import org.apache.wicket.util.visit.IVisit;
 import org.apache.wicket.util.visit.IVisitor;
 import org.slf4j.Logger;
@@ -495,12 +494,21 @@ public class BaseWicketTester
         */
        protected void cleanupFeedbackMessages(IFeedbackMessageFilter filter)
        {
-               ApplicationSettings applicationSettings = 
application.getApplicationSettings();
-               IFeedbackMessageFilter old = 
applicationSettings.getFeedbackMessageCleanupFilter();
-               applicationSettings.setFeedbackMessageCleanupFilter(filter);
-               getLastRenderedPage().detach();
-               getSession().detach();
-               applicationSettings.setFeedbackMessageCleanupFilter(old);
+               
+               IVisitor<Component, Void> clearer = new IVisitor<Component, 
Void>()
+               {
+                       @Override
+                       public void component(Component component, IVisit<Void> 
visit)
+                       {
+                               if (component.hasFeedbackMessage()) {
+                                       
component.getFeedbackMessages().clear(filter);
+                               }
+                       }
+               };
+               clearer.component(getLastRenderedPage(), null);
+               getLastRenderedPage().visitChildren(clearer);
+               
+               getSession().getFeedbackMessages().clear(filter);
        }
 
        /**
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebSessionTest.java 
b/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebSessionTest.java
index c775d19..2eb05a7 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebSessionTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/protocol/http/WebSessionTest.java
@@ -19,10 +19,12 @@ package org.apache.wicket.protocol.http;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.Locale;
 
 import org.apache.wicket.Session;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.mock.MockWebRequest;
 import org.apache.wicket.protocol.http.mock.MockHttpSession;
@@ -54,23 +56,48 @@ class WebSessionTest
                WebSession session = new WebSession(request);
                assertEquals(locale, session.getLocale());
        }
-       
+
        @Test
        public void changeSessionId() throws Exception
        {
                WicketTester tester = new WicketTester(new MockApplication());
                MockHttpSession httpSession = 
(MockHttpSession)tester.getRequest().getSession();
                Session session = tester.getSession();
-               
+
                httpSession.setTemporary(false);
                session.bind();
-               
+
                String oldId = session.getId();
                assertNotNull(oldId);
-               
+
                session.changeSessionId();
                String newId = session.getId();
-               
+
                assertNotEquals(oldId, newId);
        }
+
+       /**
+        * WICKET-6558
+        */
+       @Test
+       public void lockAfterDetach() throws Exception
+       {
+               WicketTester tester = new WicketTester(new MockApplication());
+
+               Session session = tester.getSession();
+
+               session.getPageManager();
+               
+               session.detach();
+
+               try
+               {
+                       session.getPageManager();
+                       fail();
+               }
+               catch (WicketRuntimeException ex)
+               {
+                       assertEquals("The request has been processed. Access to 
pages is no longer allowed", ex.getMessage());
+               }
+       }
 }

Reply via email to