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