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