Igor,
I actually did figure out a way to get this working without having to do
any (major) hacking. Pretty simple, too, once I figured it out. I just
created a new IndexedParamResourceUrlCodingStrategy class (included
below) and mounted that. For anyone else looking to do this, here is
the relevant code:
// Register the resource with the web application
app.getSharedResources().add("resourceName", customResource);
// Mount the resource
ResourceReference ref = new ResourceReference("resourceName");
app.mount(new IndexedParamResourceUrlCodingStrategy("mountUrl",
ref.getSharedResourceKey()));
That takes care of just about everything. However, right about that
point, you'll likely run into the following bug:
https://issues.apache.org/jira/browse/WICKET-631. I did have to hack
around that a bit, unfortunately. In my DynamicWebResource class, I
added a "cachedParams" ThreadLocal and cache the parameter ValueMap
during setHeaders(WebResponse) in it, because the parameters get wiped
out before getResourceState() is called. Here's the code for that in
case anyone needs it:
public class SomeResource extends DynamicWebResource
{
private static ThreadLocal<ValueMap> cachedParams;
...
/**
* @see
org.apache.wicket.markup.html.DynamicWebResource#setHeaders(org.apache.wicket.protocol.http.WebResponse)
*/
@Override
protected void setHeaders(WebResponse response)
{
super.setHeaders(response);
cachedParams.set(getParameters());
}
...
/**
* @see
org.apache.wicket.markup.html.DynamicWebResource#getResourceState()
*/
@Override
protected ResourceState getResourceState()
{
ValueMap params = cachedParams.get();
...
}
}
And voila! I now have mounted resources with pretty indexed parameters
like the following:
.../myresource/folderparam/folderparam/fileparam
I'm not sure how to go about submitting patches, but the following class
would probably help others looking to do the same out. I stole most of
the code for it wholesale from IndexedParamUrlCodingStrategy, anyways.
/**
* This class is similar to [EMAIL PROTECTED] IndexedParamUrlCodingStrategy},
but for
* [EMAIL PROTECTED] Resource}s, not bookmarkable pages.
*
* NOTE: The code for [EMAIL PROTECTED] #appendParameters(AppendingStringBuffer, Map)} and
* [EMAIL PROTECTED] #decodeParameters(String, Map)} was copied verbatim from
* [EMAIL PROTECTED] IndexedParamUrlCodingStrategy}.
*
* @author Karl M. Davis
*/
public class IndexedParamResourceUrlCodingStrategy extends
SharedResourceRequestTargetUrlCodingStrategy
{
/**
* Constructor.
*
* @param mountPath
* the path to mount the [EMAIL PROTECTED] Resource} at
* @param resourceKey
* the key of the [EMAIL PROTECTED] Resource} (see
* [EMAIL PROTECTED]
ResourceReference#getSharedResourceKey()})
*/
public IndexedParamResourceUrlCodingStrategy(String mountPath,
String resourceKey)
{
super(mountPath, resourceKey);
}
/**
* @see
org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#appendParameters(org.apache.wicket.util.string.AppendingStringBuffer,
* java.util.Map)
*/
protected void appendParameters(AppendingStringBuffer url, Map
parameters)
{
int i = 0;
while (parameters.containsKey(String.valueOf(i)))
{
String value = (String)
parameters.get(String.valueOf(i));
url.append("/").append(urlEncode(value));
i++;
}
String pageMap = (String) parameters
.get(WebRequestCodingStrategy.PAGEMAP);
if (pageMap != null)
{
i++;
url.append("/").append(WebRequestCodingStrategy.PAGEMAP)
.append("/").append(urlEncode(pageMap));
}
if (i != parameters.size())
{
throw new WicketRuntimeException(
"Not all parameters were encoded. Make sure
all parameter names are integers in consecutive order starting with zero. Current
parameter names are: "
+
parameters.keySet().toString());
}
}
/**
* @see
org.apache.wicket.request.target.coding.AbstractRequestTargetUrlCodingStrategy#decodeParameters(java.lang.String,
* java.util.Map)
*/
protected ValueMap decodeParameters(String urlFragment, Map
urlParameters)
{
PageParameters params = new PageParameters();
if (urlFragment == null)
{
return params;
}
if (urlFragment.startsWith("/"))
{
urlFragment = urlFragment.substring(1);
}
String[] parts = urlFragment.split("/");
for (int i = 0; i < parts.length; i++)
{
if (WebRequestCodingStrategy.PAGEMAP.equals(parts[i]))
{
i++;
params.put(WebRequestCodingStrategy.PAGEMAP,
urlDecode(parts[i]));
}
else
{
params.put(String.valueOf(i),
urlDecode(parts[i]));
}
}
return params;
}
}
Enjoy!
Karl M. Davis
Igor Vaynberg wrote:
On 6/30/07, *Karl M. Davis* <[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>> wrote:
Hey there all,
I've got a DynamicWebResource that I'm mounting via
mountSharedResource(...) and creating a ResourceLink to. That
Resource
requires parameters and I'd love for it to operate similar to how
IndexedParamUrlCodingStrategy works, where my parameters are numbered
and look like just an extension of the URL.
For example:
.../myresource/folderparam/folderparam/fileparam
Any way to do that? I've been poking around in
WebRequestCodingStrategy
and it looks like I could override some of the stuff there to get
started, but that looks hackish and rather complicated. I think
that'd
only get me halfway; that would allow me to encode the URLs but I'm
unsure of where I'd need to decode them when the link is clicked on.
I'd appreciate any pointers on this one.
right now we do not support different coding strategies for resorce
mounts, although probably we could pretty easily. please add an rfe to
jira.
-igor
Thanks much in advance,
Karl
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
<mailto:Wicket-user@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/wicket-user
------------------------------------------------------------------------
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
------------------------------------------------------------------------
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user