You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2008/10/28 06:00:20 UTC

svn commit: r708433 - in /wicket/trunk/wicket/src/main/java/org/apache/wicket: Page.java PageId.java RequestCycle.java protocol/http/request/WebRequestCodingStrategy.java request/target/component/PageIdRequestTarget.java

Author: ivaynberg
Date: Mon Oct 27 22:00:20 2008
New Revision: 708433

URL: http://svn.apache.org/viewvc?rev=708433&view=rev
Log:
experimental support for building a url to a stateful page using minimum required step (PageId). useful for building navigation usecases which require stacks or lists of pages ala breadcrumbs

Added:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/PageId.java   (with props)
    wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/component/PageIdRequestTarget.java   (with props)
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java?rev=708433&r1=708432&r2=708433&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Page.java Mon Oct 27 22:00:20 2008
@@ -416,7 +416,8 @@
 	 * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT CALL.
 	 * 
 	 * This method is called when a component was rendered standalone. If it is a <code>
-	 * MarkupContainer</code> then the rendering for that container is checked.
+	 * MarkupContainer</code>
+	 * then the rendering for that container is checked.
 	 * 
 	 * @param component
 	 * 
@@ -1621,4 +1622,14 @@
 			"Page does not support markup. This error can happen if you have extended Page directly, instead extend WebPage");
 	}
 
+	/**
+	 * Gets page instance's unique identifier
+	 * 
+	 * @return instance unique identifier
+	 */
+	public PageId getPageId()
+	{
+		return new PageId(pageMapName, numericId, getCurrentVersionNumber());
+	}
+
 }

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/PageId.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/PageId.java?rev=708433&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/PageId.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/PageId.java Mon Oct 27 22:00:20 2008
@@ -0,0 +1,122 @@
+/*
+ * 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;
+
+
+/**
+ * Unique identifier of a page instance
+ * 
+ * @author igor.vaynberg
+ */
+public final class PageId implements IClusterable
+{
+	private static final long serialVersionUID = 1L;
+
+	private final String pageMapName;
+	private final int number;
+	private final int version;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param pageMapName
+	 * @param number
+	 * @param version
+	 */
+	PageId(String pageMapName, int number, int version)
+	{
+		this.pageMapName = pageMapName;
+		this.number = number;
+		this.version = version;
+	}
+
+	/**
+	 * Gets pageMapName.
+	 * 
+	 * @return pageMapName
+	 */
+	public String getPageMapName()
+	{
+		return pageMapName;
+	}
+
+
+	/**
+	 * Gets pageId.
+	 * 
+	 * @return pageId
+	 */
+	public int getPageNumber()
+	{
+		return number;
+	}
+
+
+	/**
+	 * Gets pageVersion.
+	 * 
+	 * @return pageVersion
+	 */
+	public int getPageVersion()
+	{
+		return version;
+	}
+
+
+	/**
+	 * @see java.lang.Object#hashCode()
+	 */
+	@Override
+	public int hashCode()
+	{
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + number;
+		result = prime * result + ((pageMapName == null) ? 0 : pageMapName.hashCode());
+		result = prime * result + version;
+		return result;
+	}
+
+	/**
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	@Override
+	public boolean equals(Object obj)
+	{
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		PageId other = (PageId)obj;
+		if (number != other.number)
+			return false;
+		if (pageMapName == null)
+		{
+			if (other.pageMapName != null)
+				return false;
+		}
+		else if (!pageMapName.equals(other.pageMapName))
+			return false;
+		if (version != other.version)
+			return false;
+		return true;
+	}
+
+
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/PageId.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java?rev=708433&r1=708432&r2=708433&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/RequestCycle.java Mon Oct 27 22:00:20 2008
@@ -35,6 +35,7 @@
 import org.apache.wicket.request.target.component.ComponentRequestTarget;
 import org.apache.wicket.request.target.component.IBookmarkablePageRequestTarget;
 import org.apache.wicket.request.target.component.IPageRequestTarget;
+import org.apache.wicket.request.target.component.PageIdRequestTarget;
 import org.apache.wicket.request.target.component.PageRequestTarget;
 import org.apache.wicket.request.target.component.listener.BehaviorRequestTarget;
 import org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget;
@@ -977,6 +978,20 @@
 	}
 
 	/**
+	 * Returns a URL that references the page pointed to by <code>id</code>
+	 * 
+	 * @see PageIdRequestTarget for more details
+	 * 
+	 * @param id
+	 *            page id
+	 * @return url pointing to the page
+	 */
+	public final CharSequence urlFor(final PageId id)
+	{
+		return urlFor(new PageIdRequestTarget(id));
+	}
+
+	/**
 	 * Returns a URL that references a shared resource through the provided resource reference.
 	 * 
 	 * @param resourceReference

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java?rev=708433&r1=708432&r2=708433&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/request/WebRequestCodingStrategy.java Mon Oct 27 22:00:20 2008
@@ -31,6 +31,7 @@
 import org.apache.wicket.IRequestTarget;
 import org.apache.wicket.IResourceListener;
 import org.apache.wicket.Page;
+import org.apache.wicket.PageId;
 import org.apache.wicket.PageMap;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.Request;
@@ -54,8 +55,10 @@
 import org.apache.wicket.request.target.component.BookmarkableListenerInterfaceRequestTarget;
 import org.apache.wicket.request.target.component.IBookmarkablePageRequestTarget;
 import org.apache.wicket.request.target.component.IPageRequestTarget;
+import org.apache.wicket.request.target.component.PageIdRequestTarget;
 import org.apache.wicket.request.target.component.listener.IListenerInterfaceRequestTarget;
 import org.apache.wicket.request.target.resource.ISharedResourceRequestTarget;
+import org.apache.wicket.util.lang.Objects;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 import org.apache.wicket.util.string.PrependingStringBuffer;
 import org.apache.wicket.util.string.Strings;
@@ -257,6 +260,10 @@
 				(ISharedResourceRequestTarget)requestTarget) : url);
 			sharedResourceURL = true;
 		}
+		else if (requestTarget instanceof PageIdRequestTarget)
+		{
+			url = encode(requestCycle, (PageIdRequestTarget)requestTarget);
+		}
 		else if (requestTarget instanceof IListenerInterfaceRequestTarget)
 		{
 			if (url == null)
@@ -835,6 +842,50 @@
 		}
 	}
 
+
+	/**
+	 * Encode a pageid request target.
+	 * 
+	 * @param requestCycle
+	 *            the current request cycle
+	 * @param requestTarget
+	 *            the target to encode
+	 * @return the encoded url
+	 */
+	protected CharSequence encode(RequestCycle requestCycle, PageIdRequestTarget requestTarget)
+	{
+		final PageId id = requestTarget.getPageId();
+
+		// Start string buffer for url
+		final AppendingStringBuffer url = new AppendingStringBuffer(64);
+		url.append('?');
+		url.append(INTERFACE_PARAMETER_NAME);
+		url.append('=');
+
+		// add pagemap
+		if (!Objects.equal(PageMap.DEFAULT_NAME, id.getPageMapName()))
+		{
+			url.append(id.getPageMapName());
+		}
+		url.append(Component.PATH_SEPARATOR);
+
+		// add page id
+		url.append(id.getPageNumber());
+		url.append(Component.PATH_SEPARATOR);
+
+		// add version
+		url.append(id.getPageVersion());
+		url.append(Component.PATH_SEPARATOR);
+
+		// add listener interface (noop because we default to redirect listener which is default)
+		url.append(Component.PATH_SEPARATOR);
+
+		// behavior id (noop because we dont care aboute behaviors
+		url.append(Component.PATH_SEPARATOR);
+
+		return url;
+	}
+
 	/**
 	 * Encode a listener interface target.
 	 * 

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/component/PageIdRequestTarget.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/component/PageIdRequestTarget.java?rev=708433&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/component/PageIdRequestTarget.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/component/PageIdRequestTarget.java Mon Oct 27 22:00:20 2008
@@ -0,0 +1,101 @@
+/*
+ * 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.target.component;
+
+import org.apache.wicket.IRequestTarget;
+import org.apache.wicket.Page;
+import org.apache.wicket.PageId;
+import org.apache.wicket.RequestCycle;
+
+/**
+ * Target that navigates to a page pointed to by its id. The great benefit of this target over the
+ * PageRequestTarget is that no reference to the actual page is needed, which greatly facilitates
+ * navigational usecases where a list or a stack of page references is needed (ie breadcrumbs).
+ * 
+ * @see PageId
+ * 
+ * @author igor.vaynberg
+ */
+public class PageIdRequestTarget implements IRequestTarget
+{
+	private final PageId id;
+
+	/**
+	 * Constructor
+	 * 
+	 * Even though a page is passed in, only a reference to its {@link PageId} is kept
+	 * 
+	 * @param page
+	 */
+	public PageIdRequestTarget(Page page)
+	{
+		if (page == null)
+		{
+			throw new IllegalArgumentException("Argument `page` cannot be null");
+		}
+		id = page.getPageId();
+	}
+
+	/**
+	 * Constructor
+	 * 
+	 * @param pageId
+	 */
+	public PageIdRequestTarget(PageId pageId)
+	{
+		if (pageId == null)
+		{
+			throw new IllegalArgumentException("Argument `pageId` cannot be null");
+		}
+
+		id = pageId;
+	}
+
+
+	/**
+	 * @return id page id
+	 */
+	public final PageId getPageId()
+	{
+		return id;
+	}
+
+	/** {@inheritDoc} */
+	public void respond(RequestCycle requestCycle)
+	{
+		Page page = requestCycle.getSession().getPage(id.getPageMapName(), "" + id.getPageNumber(),
+			id.getPageVersion());
+
+		// Should page be redirected to?
+		if (requestCycle.isRedirect())
+		{
+			// Redirect to the page
+			requestCycle.redirectTo(page);
+		}
+		else
+		{
+			// Let page render itself
+			page.renderPage();
+		}
+	}
+
+	/** {@inheritDoc} */
+	public void detach(RequestCycle requestCycle)
+	{
+	}
+
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/target/component/PageIdRequestTarget.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain