Updated Branches:
  refs/heads/master 5f597c87b -> 406c00ad2

WICKET-4624 requestcyclelistener which registers and retrieves 
pagerequesthandler in a request


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/406c00ad
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/406c00ad
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/406c00ad

Branch: refs/heads/master
Commit: 406c00ad272e4ae65abac6e66a8a78fa6975109e
Parents: 5f597c8
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Tue Jun 26 15:01:06 2012 +0300
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Tue Jun 26 15:01:06 2012 +0300

----------------------------------------------------------------------
 .../request/cycle/PageRequestHandlerTracker.java   |   93 +++++++++++++++
 .../cycle/PageRequestHandlerTrackerTest.java       |   89 ++++++++++++++
 2 files changed, 182 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/406c00ad/wicket-core/src/main/java/org/apache/wicket/request/cycle/PageRequestHandlerTracker.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/request/cycle/PageRequestHandlerTracker.java
 
b/wicket-core/src/main/java/org/apache/wicket/request/cycle/PageRequestHandlerTracker.java
new file mode 100644
index 0000000..7bd96f6
--- /dev/null
+++ 
b/wicket-core/src/main/java/org/apache/wicket/request/cycle/PageRequestHandlerTracker.java
@@ -0,0 +1,93 @@
+package org.apache.wicket.request.cycle;
+
+import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.core.request.handler.IPageRequestHandler;
+import org.apache.wicket.request.IRequestHandler;
+
+/**
+ * Registers and retrieves first and last IPageRequestHandler in a request 
cycle.
+ * Can be used to find out what is the requested page and what is the actual 
response page.
+ *
+ * @since 1.5.8
+ */
+public class PageRequestHandlerTracker extends AbstractRequestCycleListener
+{
+       /**
+        * The key for the first handler
+        */
+       public static final  MetaDataKey<IPageRequestHandler> FIRST_HANDLER_KEY 
= new MetaDataKey<IPageRequestHandler>() {};
+
+       /**
+        * The key for the last handler
+        */
+       public static final MetaDataKey<IPageRequestHandler> LAST_HANDLER_KEY = 
new MetaDataKey<IPageRequestHandler>() {};
+
+       @Override
+       public void onRequestHandlerResolved(RequestCycle cycle, 
IRequestHandler handler)
+       {
+               super.onRequestHandlerResolved(cycle, handler);
+               registerFirstHandler(cycle,handler);
+               registerLastHandler(cycle,handler);
+       }
+
+       @Override
+       public void onRequestHandlerScheduled(RequestCycle cycle, 
IRequestHandler handler)
+       {
+               super.onRequestHandlerResolved(cycle, handler);
+               registerLastHandler(cycle,handler);
+       }
+
+       /**
+        * Registers pagerequesthandler when it's resolved ,keeps up with the 
most recent handler resolved
+        *
+        * @param cycle
+        *      the current request cycle
+        * @param handler
+        *      the request handler to register
+        */
+       private void registerLastHandler(RequestCycle cycle, IRequestHandler 
handler)
+       {
+               if (handler instanceof IPageRequestHandler)
+               {
+                       cycle.setMetaData(LAST_HANDLER_KEY, 
(IPageRequestHandler) handler);
+               }
+       }
+
+       /**
+        * Registers firsthandler if it's not already registered
+        *
+        * @param cycle
+        *      the current request cycle
+        * @param handler
+        *      the request handler to register
+        */
+       private void registerFirstHandler(RequestCycle cycle, IRequestHandler 
handler)
+       {
+               if (handler instanceof IPageRequestHandler && 
getFirstHandler(cycle) == null)
+               {
+                       cycle.setMetaData(FIRST_HANDLER_KEY, 
(IPageRequestHandler)handler);
+               }
+       }
+
+   /**
+       * retrieves last handler from requestcycle
+       *
+       * @param cycle
+       * @return last handler
+       */
+       public static IPageRequestHandler getLastHandler(RequestCycle cycle)
+       {
+               return cycle.getMetaData(LAST_HANDLER_KEY);
+       }
+
+       /**
+        * retrieves first handler from the request cycle
+        *
+        * @param cycle
+        * @return first handler
+        */
+       public static IPageRequestHandler getFirstHandler(RequestCycle cycle)
+       {
+               return cycle.getMetaData(FIRST_HANDLER_KEY);
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/406c00ad/wicket-core/src/test/java/org/apache/wicket/request/cycle/PageRequestHandlerTrackerTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/request/cycle/PageRequestHandlerTrackerTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/PageRequestHandlerTrackerTest.java
new file mode 100644
index 0000000..636d589
--- /dev/null
+++ 
b/wicket-core/src/test/java/org/apache/wicket/request/cycle/PageRequestHandlerTrackerTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.cycle;
+
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.core.request.handler.IPageRequestHandler;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.junit.Test;
+
+/**
+ * @since 1.5.8
+ */
+public class PageRequestHandlerTrackerTest extends WicketTestCase
+{
+       /**
+        * Uses PageRequestHandlerTracker to track the requested page and the 
response page
+        * https://issues.apache.org/jira/browse/WICKET-4624
+        */
+       @Test
+       public void trackPages()
+       {
+               tester.getApplication().getRequestCycleListeners().add(new 
PageRequestHandlerTracker());
+               tester.startPage(new PageA());
+
+       }
+
+       /**
+        * The requested page
+        */
+       private static class PageA extends WebPage implements 
IMarkupResourceStreamProvider
+       {
+               @Override
+               protected void onBeforeRender()
+               {
+                       super.onBeforeRender();
+                       setResponsePage(new PageB());
+               }
+
+               @Override
+               public IResourceStream getMarkupResourceStream(MarkupContainer 
container, Class<?> containerClass)
+               {
+                       return new StringResourceStream("<html/>");
+               }
+       }
+
+       /**
+        * The response page
+        */
+       private static class PageB extends WebPage implements 
IMarkupResourceStreamProvider
+       {
+               @Override
+               protected void onAfterRender()
+               {
+                       super.onAfterRender();
+
+                       RequestCycle cycle = getRequestCycle();
+
+                       IPageRequestHandler firstHandler = 
PageRequestHandlerTracker.getFirstHandler(cycle);
+                       assertEquals(PageA.class, firstHandler.getPageClass());
+
+                       IPageRequestHandler lastHandler = 
PageRequestHandlerTracker.getLastHandler(cycle);
+                       assertEquals(PageB.class, lastHandler.getPageClass());
+               }
+
+               @Override
+               public IResourceStream getMarkupResourceStream(MarkupContainer 
container, Class<?> containerClass)
+               {
+                       return new StringResourceStream("<html/>");
+               }
+       }
+}

Reply via email to