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 <[email protected]>
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());
+ }
+ }
}