Author: hlship
Date: Sat Feb 27 00:15:54 2010
New Revision: 916878
URL: http://svn.apache.org/viewvc?rev=916878&view=rev
Log:
TAP5-1034: Using URLRewriteRules will fail for component event links if the
page has an activation context
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Link.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PageCallback.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/LinkImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/URLRewriterLinkEncoderInterceptor.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/LinkImplTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Link.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Link.java?rev=916878&r1=916877&r2=916878&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Link.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/Link.java
Sat Feb 27 00:15:54 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2008 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2010 The Apache Software Foundation
//
// Licensed 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
+// 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,
@@ -14,10 +14,10 @@
package org.apache.tapestry5;
-import org.apache.commons.codec.net.URLCodec;
-
import java.util.List;
+import org.apache.commons.codec.net.URLCodec;
+
/**
* A link is the Tapestry representation of a URL or URI that triggers dynamic
behavior. This link is in three parts: a
* path portion, an optional anchor, and a set of query parameters. A request
for a link will ultimately be recognized
@@ -32,7 +32,7 @@
* Returns the names of any additional query parameters for the URI. Query
parameters store less regular or less
* often used values that can not be expressed in the path. They also are
used to store, or link to, persistent
* state.
- *
+ *
* @return list of query parameter names, is alphabetical order
*/
List<String> getParameterNames();
@@ -40,7 +40,7 @@
/**
* Returns the value of a specifically named query parameter, or
<tt>null</tt> if no such query parameter is stored
* in the link.
- *
+ *
* @return the value of the named parameter
*/
String getParameterValue(String name);
@@ -48,18 +48,45 @@
/**
* Adds a parameter value. The value will be added, as is, to the URL. In
many cases, the value should be URL
* encoded via {...@link URLCodec}.
- *
- * @param parameterName the name of the parameter to store
- * @param value the value to store
- * @throws IllegalArgumentException if the link already has a parameter
with the given name
+ *
+ * @param parameterName
+ * the name of the parameter to store
+ * @param value
+ * the value to store
+ * @throws IllegalArgumentException
+ * if the link already has a parameter with the given name
*/
void addParameter(String parameterName, String value);
/**
+ * Removes a parameter value, which is occasionally useful when
transforming a parameter into a portion of
+ * the path.
+ *
+ * @since 5.2.0
+ */
+ void removeParameter(String parameterName);
+
+ /**
+ * Returns the completely unadorned base path. Other methods (such as
{...@link #toURI()}), may append
+ * an anchor or query parameters.
+ *
+ * @since 5.2.0
+ */
+ String getBasePath();
+
+ /**
+ * Creates a copy of this link that has the same parameters, anchor, and
other attributes, but a different
+ * {...@linkplain #getBasePath() base path}.
+ *
+ * @since 5.2.0
+ */
+ Link copyWithBasePath(String basePath);
+
+ /**
* Returns the URI portion of the link. When the link is created for a
form, this will not include query parameters.
- * This is the same value returned from toString(). In some
circumstances, this may be a relative URI (relative to
+ * This is the same value returned from toString(). In some circumstances,
this may be a relative URI (relative to
* the current Request's URI).
- *
+ *
* @return the URI, ready to be added as an element attribute
*/
String toURI();
@@ -71,22 +98,23 @@
/**
* Returns the link anchor. If this link does not have an anchor, this
method returns <tt>null</tt>.
- *
+ *
* @return the link anchor
*/
String getAnchor();
/**
* Sets the link anchor. Null and empty anchors will be ignored when
building the link URI.
- *
- * @param anchor the link anchor
+ *
+ * @param anchor
+ * the link anchor
*/
void setAnchor(String anchor);
/**
* Converts the link to an absolute URI, a complete path, starting with a
leading slash. This is necessary in many
* cases for client-side JavaScript that must send a request to
application via XMLHttpRequest.
- *
+ *
* @return the complete URI (not abbreviated relative to the current
request path)
*/
String toAbsoluteURI();
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PageCallback.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PageCallback.java?rev=916878&r1=916877&r2=916878&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PageCallback.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/PageCallback.java
Sat Feb 27 00:15:54 2010
@@ -67,7 +67,7 @@
if (hasActivationContext())
return String.format("PageCallback[%s %s]", pageName,
activationContextDescription());
- return String.format("PageCallback[%s]");
+ return String.format("PageCallback[%s]", pageName);
}
/** Does the activation context have any values? Used, typically, inside
an override of {...@link #toString()}. */
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/LinkImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/LinkImpl.java?rev=916878&r1=916877&r2=916878&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/LinkImpl.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/LinkImpl.java
Sat Feb 27 00:15:54 2010
@@ -4,7 +4,7 @@
// 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
+// 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,
@@ -27,7 +27,7 @@
{
private Map<String, String> parameters;
- private final String absoluteURI;
+ private final String basePath;
private final boolean optimizable;
@@ -39,16 +39,32 @@
private String anchor;
- public LinkImpl(String absoluteURI, boolean optimizable, boolean forForm,
Response response,
- RequestPathOptimizer optimizer)
+ public LinkImpl(String basePath, boolean optimizable, boolean forForm,
Response response,
+ RequestPathOptimizer optimizer)
{
- this.absoluteURI = absoluteURI;
+ this.basePath = basePath;
this.optimizable = optimizable;
this.forForm = forForm;
this.response = response;
this.optimizer = optimizer;
}
+ public Link copyWithBasePath(String basePath)
+ {
+ Defense.notNull(basePath, "basePath");
+
+ LinkImpl copy = new LinkImpl(basePath, optimizable, forForm, response,
optimizer);
+
+ copy.anchor = anchor;
+
+ for (String name : getParameterNames())
+ {
+ copy.addParameter(name, parameters.get(name));
+ }
+
+ return copy;
+ }
+
public void addParameter(String parameterName, String value)
{
Defense.notBlank(parameterName, "parameterName");
@@ -60,6 +76,19 @@
parameters.put(parameterName, value);
}
+ public String getBasePath()
+ {
+ return basePath;
+ }
+
+ public void removeParameter(String parameterName)
+ {
+ Defense.notBlank(parameterName, "parameterName");
+
+ if (parameters != null)
+ parameters.remove(parameterName);
+ }
+
public String getAnchor()
{
return anchor;
@@ -102,9 +131,7 @@
private String appendAnchor(String path)
{
- return InternalUtils.isBlank(anchor)
- ? path
- : path + "#" + anchor;
+ return InternalUtils.isBlank(anchor) ? path : path + "#" + anchor;
}
/**
@@ -116,22 +143,21 @@
return toURI();
}
-
/**
* Extends the absolute path with any query parameters. Query parameters
are never added to a forForm link.
- *
+ *
* @return absoluteURI appended with query parameters
*/
private String buildURI()
{
if (forForm || parameters == null)
- return absoluteURI;
+ return basePath;
- StringBuilder builder = new StringBuilder(absoluteURI.length() * 2);
+ StringBuilder builder = new StringBuilder(basePath.length() * 2);
- builder.append(absoluteURI);
+ builder.append(basePath);
- String sep = absoluteURI.contains("?") ? "&" : "?";
+ String sep = basePath.contains("?") ? "&" : "?";
for (String name : getParameterNames())
{
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/URLRewriterLinkEncoderInterceptor.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/URLRewriterLinkEncoderInterceptor.java?rev=916878&r1=916877&r2=916878&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/URLRewriterLinkEncoderInterceptor.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/URLRewriterLinkEncoderInterceptor.java
Sat Feb 27 00:15:54 2010
@@ -111,40 +111,26 @@
private Link rewriteIfNeeded(Link link, URLRewriteContext context, boolean
forForm)
{
- SimpleRequestWrapper fakeRequest = new SimpleRequestWrapper(request,
link.toAbsoluteURI());
+ SimpleRequestWrapper fakeRequest = new SimpleRequestWrapper(request,
link.getBasePath());
Request rewritten = urlRewriter.processLink(fakeRequest, context);
// if the original request is equal to the rewritten one, no
// rewriting is needed
- if (fakeRequest != rewritten)
- {
- String originalServerName = request.getServerName();
+ if (fakeRequest == rewritten)
+ return link;
- String rewrittenServerName = rewritten.getServerName();
+ String originalServerName = request.getServerName();
- boolean absolute = originalServerName.equals(rewrittenServerName)
== false;
+ String rewrittenServerName = rewritten.getServerName();
- String newPath = rewritten.getPath();
+ boolean absolute = originalServerName.equals(rewrittenServerName) ==
false;
- String newUrl = absolute ? fullUrl(rewritten) : newPath;
+ String newPath = rewritten.getPath();
- Link replacement = new LinkImpl(newUrl, false, forForm, response,
null);
+ String baseURI = absolute ? fullUrl(rewritten) : newPath;
- copyParameters(link, replacement);
-
- return replacement;
- }
-
- return link;
- }
-
- private void copyParameters(Link link, Link replacement)
- {
- for (String name : link.getParameterNames())
- {
- replacement.addParameter(name, link.getParameterValue(name));
- }
+ return link.copyWithBasePath(baseURI);
}
private String fullUrl(Request request)
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/LinkImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/LinkImplTest.java?rev=916878&r1=916877&r2=916878&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/LinkImplTest.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/LinkImplTest.java
Sat Feb 27 00:15:54 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010 The Apache Software Foundation
//
// Licensed 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
+// 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,
@@ -102,7 +102,6 @@
verify();
}
-
@Test
public void force_absolute_uri()
{
@@ -113,33 +112,65 @@
replay();
-
Link link = new LinkImpl("/ctx/foo", true, false, response, optimizer);
assertEquals(link.toAbsoluteURI(), ENCODED);
-
verify();
}
@Test
public void to_uri_with_added_parameters_and_on_construction_uri()
{
- RequestPathOptimizer optimizer = mockRequestPathOptimizer();
- Response response = mockResponse();
-
- String expectedURI = "/ctx/foo?foo=bar&baz=barney";
- train_encodeURL(response, expectedURI, expectedURI);
-
- replay();
-
-
- Link link = new LinkImpl("/ctx/foo?foo=bar", false, false, response,
optimizer);
- link.addParameter("baz", "barney");
-
- assertEquals(link.toURI(), expectedURI);
-
-
- verify();
+ RequestPathOptimizer optimizer = mockRequestPathOptimizer();
+ Response response = mockResponse();
+
+ String expectedURI = "/ctx/foo?foo=bar&baz=barney";
+ train_encodeURL(response, expectedURI, expectedURI);
+
+ replay();
+
+ Link link = new LinkImpl("/ctx/foo?foo=bar", false, false, response,
optimizer);
+ link.addParameter("baz", "barney");
+
+ assertEquals(link.toURI(), expectedURI);
+
+ verify();
+ }
+
+ @Test
+ public void new_base_uri()
+ {
+ RequestPathOptimizer optimizer = mockRequestPathOptimizer();
+ Response response = mockResponse();
+
+ String expectedURI = "/ctx/baz?baz=barney";
+ train_encodeURL(response, expectedURI, expectedURI);
+
+ replay();
+
+ Link link = new LinkImpl("/ctx/foo", false, false, response,
optimizer);
+ link.addParameter("baz", "barney");
+ link.setAnchor("jacob");
+
+ Link copy = link.copyWithBasePath("/ctx/baz");
+
+ assertEquals(copy.toURI(), expectedURI + "#jacob");
+
+ verify();
+ }
+
+ @Test
+ public void remove_parameter()
+ {
+ Link link = new LinkImpl("/baseURI", false, false, null, null);
+
+ link.addParameter("fred", "flintstone");
+ link.addParameter("barney", "rubble");
+
+ link.removeParameter("fred");
+
+ assertNull(link.getParameterValue("fred"));
+ assertListsEquals(link.getParameterNames(), "barney");
}
}