You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2017/03/25 18:41:03 UTC

[4/9] wicket git commit: WICKET-4201 moving page resolution code to its own class, removing duplicated code, validating inner state when setting page sources

WICKET-4201 moving page resolution code to its own class, removing duplicated code, validating inner state when setting page sources


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

Branch: refs/heads/master
Commit: cc0fe992a9fe83f4617079087532542bda188cb4
Parents: b909ea8
Author: Pedro Henrique Oliveira dos Santos <pe...@apache.org>
Authored: Sat Feb 4 05:01:53 2017 -0200
Committer: Pedro Henrique Oliveira dos Santos <pe...@apache.org>
Committed: Sat Mar 25 14:58:12 2017 -0300

----------------------------------------------------------------------
 .../core/request/handler/PageProvider.java      | 229 +++++++++----------
 .../core/request/mapper/MountedMapperTest.java  |   2 +-
 2 files changed, 109 insertions(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/cc0fe992/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
index e5e1a01..cda486a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageProvider.java
@@ -20,7 +20,6 @@ import org.apache.wicket.Application;
 import org.apache.wicket.core.request.mapper.IPageSource;
 import org.apache.wicket.core.request.mapper.StalePageException;
 import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.pageStore.IPageStore;
 import org.apache.wicket.protocol.http.PageExpiredException;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestMapper;
@@ -56,13 +55,12 @@ public class PageProvider implements IPageProvider, IClusterable
 
 	private IPageSource pageSource;
 
-	private transient IRequestablePage pageInstance;
-	private boolean pageInstanceIsFresh;
-
 	private Class<? extends IRequestablePage> pageClass;
 
 	private PageParameters pageParameters;
 
+	private Provision provision;
+
 	/**
 	 * Creates a new page provider object. Upon calling of {@link #getPageInstance()} this provider
 	 * will return page instance with specified id.
@@ -153,27 +151,32 @@ public class PageProvider implements IPageProvider, IClusterable
 	{
 		Args.notNull(page, "page");
 
-		pageInstance = page;
+		provision = new Provision(page);
 		pageId = page.getPageId();
 		renderCount = page.getRenderCount();
 	}
 
+	private Provision getProvision()
+	{
+		if (provision == null)
+		{
+			provision = new Provision(getPageSource()).resolvePageInstance(pageId, pageClass,
+				pageParameters, renderCount);
+		}
+		return provision;
+	}
+
 	/**
 	 * @see IPageProvider#getPageInstance()
 	 */
 	@Override
 	public IRequestablePage getPageInstance()
 	{
-		if (pageInstance == null)
+		if (!getProvision().didResolvePage() && !getProvision().doesProvideNewPage())
 		{
-			resolvePageInstance(pageId, pageClass, pageParameters, renderCount);
-
-			if (pageInstance == null)
-			{
-				throw new PageExpiredException("Page with id '" + pageId + "' has expired.");
-			}
+			throw new PageExpiredException("Page with id '" + pageId + "' has expired.");
 		}
-		return pageInstance;
+		return getProvision().get();
 	}
 
 	/**
@@ -188,7 +191,7 @@ public class PageProvider implements IPageProvider, IClusterable
 		}
 		else if (isNewPageInstance() == false)
 		{
-			return pageInstance.getPageParameters();
+			return getProvision().get().getPageParameters();
 		}
 		else
 		{
@@ -197,26 +200,24 @@ public class PageProvider implements IPageProvider, IClusterable
 	}
 
 	/**
-	 * The page instance is new only if there is no cached instance or the data stores doesn't have
-	 * a page with that id with the same {@linkplain #pageClass}.
-	 * 
-	 * @see IPageProvider#isNewPageInstance()
+	 * @return don't resolve a page, but can create a new one
 	 */
 	@Override
 	public boolean isNewPageInstance()
 	{
-		boolean isNew = pageInstance == null;
-		if (isNew && pageId != null)
-		{
-			IRequestablePage storedPageInstance = getStoredPage(pageId);
-			if (storedPageInstance != null)
-			{
-				pageInstance = storedPageInstance;
-				isNew = false;
-			}
-		}
+		return !hasPageInstance();
+	}
 
-		return isNew;
+	/**
+	 * @return if provides an identified page
+	 */
+	@Override
+	public final boolean hasPageInstance()
+	{
+		if (pageId != null || provision != null)
+			return getProvision().didResolvePage();
+		else
+			return false;
 	}
 
 	/**
@@ -261,70 +262,6 @@ public class PageProvider implements IPageProvider, IClusterable
 		}
 	}
 
-	private void resolvePageInstance(Integer pageId, Class<? extends IRequestablePage> pageClass,
-		PageParameters pageParameters, Integer renderCount)
-	{
-		IRequestablePage page = null;
-
-		boolean freshCreated = false;
-
-		if (pageId != null)
-		{
-			page = getStoredPage(pageId);
-		}
-
-		if (page == null)
-		{
-			if (pageClass != null)
-			{
-				page = getPageSource().newPageInstance(pageClass, pageParameters);
-				freshCreated = true;
-			}
-		}
-
-		if (page != null && !freshCreated)
-		{
-			if (renderCount != null && page.getRenderCount() != renderCount)
-			{
-				throw new StalePageException(page);
-			}
-		}
-
-		pageInstanceIsFresh = freshCreated;
-		pageInstance = page;
-	}
-
-	/**
-	 * Looks up a page by id from the {@link IPageStore}. <br/>
-	 * If {@linkplain #pageClass} is specified then compares it against the stored instance class
-	 * and returns the found instance only if they match.
-	 * 
-	 * @param pageId
-	 *            the id of the page to look for.
-	 * @return the found page instance by id.
-	 */
-	private IRequestablePage getStoredPage(final int pageId)
-	{
-		IRequestablePage storedPageInstance = getPageSource().getPageInstance(pageId);
-		if (storedPageInstance != null)
-		{
-			if (pageClass == null || pageClass.equals(storedPageInstance.getClass()))
-			{
-				pageInstance = storedPageInstance;
-				pageInstanceIsFresh = false;
-				if (renderCount != null && pageInstance.getRenderCount() != renderCount)
-				{
-					throw new StalePageException(pageInstance);
-				}
-			}
-			else
-			{
-				// the found page class doesn't match the requested one
-				storedPageInstance = null;
-			}
-		}
-		return storedPageInstance;
-	}
 
 	/**
 	 * Detaches the page if it has been loaded (that means either
@@ -334,9 +271,10 @@ public class PageProvider implements IPageProvider, IClusterable
 	@Override
 	public void detach()
 	{
-		if (pageInstance != null)
+		if (provision != null)
 		{
-			pageInstance.detach();
+			provision.detach();
+			provision = null;
 		}
 	}
 
@@ -349,6 +287,11 @@ public class PageProvider implements IPageProvider, IClusterable
 	 */
 	public void setPageSource(IPageSource pageSource)
 	{
+		if (this.provision != null)
+		{
+			throw new IllegalStateException(
+				"A provision was already been done. The provider can be forcefully detached or a new one needs to be used to provide using this page source.");
+		}
 		this.pageSource = pageSource;
 	}
 
@@ -389,48 +332,92 @@ public class PageProvider implements IPageProvider, IClusterable
 	}
 
 	/**
-	 * Checks whether or not the provider has a page instance. This page instance might have been
-	 * passed to this page provider directly or it may have been instantiated or retrieved from the
-	 * page store.
-	 * 
-	 * @return {@code true} iff page instance has been created or retrieved
-	 */
-	@Override
-	public final boolean hasPageInstance()
-	{
-		if (pageInstance == null && pageId != null)
-		{
-			// attempt to load a stored page instance from the page store
-			getStoredPage(pageId);
-		}
-		return pageInstance != null;
-	}
-
-	/**
 	 * Returns whether or not the page instance held by this provider has been instantiated by the
 	 * provider.
 	 * 
-	 * @throws IllegalStateException
-	 *             if this method is called and the provider does not yet have a page instance, ie
-	 *             if {@link #getPageInstance()} has never been called on this provider
 	 * @return {@code true} iff the page instance held by this provider was instantiated by the
 	 *         provider
 	 */
 	@Override
 	public final boolean isPageInstanceFresh()
 	{
-		if (!hasPageInstance())
+		if (this.provision == null)
 		{
 			throw new IllegalStateException("Page instance not yet resolved");
 		}
-		return pageInstanceIsFresh;
+		return getProvision().doesProvideNewPage();
 	}
 
 	@Override
 	public String toString()
 	{
-		return "PageProvider{" + "renderCount=" + renderCount + ", pageId=" + pageId +
-			", pageInstanceIsFresh=" + pageInstanceIsFresh + ", pageClass=" + pageClass +
-			", pageParameters=" + pageParameters + ", pageInstance=" + pageInstance + '}';
+		return "PageProvider{" + "renderCount=" + renderCount + ", pageId=" + pageId
+			+ ", pageClass=" + pageClass + ", pageParameters=" + pageParameters + ", provision="
+			+ provision + '}';
+	}
+
+	private class Provision
+	{
+		private transient IRequestablePage page;
+		private boolean failedToFindStoreddPage;
+		private IPageSource pageSource;
+
+		Provision(IRequestablePage page)
+		{
+			this.page = page;
+		}
+
+		Provision(IPageSource pageSource)
+		{
+			this.pageSource = pageSource;
+		}
+
+		IRequestablePage get()
+		{
+			if (page == null && doesProvideNewPage())
+				page = pageSource.newPageInstance(pageClass, pageParameters);
+			return page;
+		}
+
+		boolean didResolvePage()
+		{
+			return page != null;
+		}
+
+		private boolean doesProvideNewPage()
+		{
+			return failedToFindStoreddPage && pageClass != null;
+		}
+
+		Provision resolvePageInstance(Integer pageId, Class<? extends IRequestablePage> pageClass,
+			PageParameters pageParameters, Integer renderCount)
+		{
+
+			if (pageId != null)
+			{
+				IRequestablePage stored = pageSource.getPageInstance(pageId);
+				if (stored != null && (pageClass == null || pageClass.equals(stored.getClass())))
+				{
+
+					page = stored;
+
+					if (renderCount != null && page.getRenderCount() != renderCount)
+						throw new StalePageException(page);
+				}
+			}
+
+			failedToFindStoreddPage = page == null;
+
+			return this;
+		}
+
+		void detach()
+		{
+			if (page != null)
+			{
+				page.detach();
+			}
+		}
+
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/cc0fe992/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
index 9f85215..fcd8afc 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/MountedMapperTest.java
@@ -714,7 +714,7 @@ public class MountedMapperTest extends AbstractMapperTest
 	@Test
 	public void placeholderEncode4()
 	{
-		PageProvider provider = new PageProvider(new MockPage())
+		PageProvider provider = new PageProvider(MockPage.class)
 		{
 			@Override
 			public boolean isNewPageInstance()