Passing / Persisting an object without PageParameters

2010-03-29 Thread Flavius
 
I have a list page and a detail page.  The
list is the results of a search and I put
this in a listview.  The user can then click
each item to view it in the detail.

What I'm doing now is passing the result object
to the detail page so they can continue to 
navigate (next ) the results without having
to go back to the list.  Also, when they return
to the list, it should have the same results they
had (preferrably without requerying the database).

I now want to make the detail page bookmarkable.
So I can pass a string value along that identifies
the detail record to retrieve, but I'm in a quandry
as to how to handle the result object.

I need to put this someplace where the pages can see
it and all I can think of is the session.  I'm 
reluctant to put this on the session because it
will be  1k in size and possibly up to 3k.  That's
a big object to put on the session, especially in 
a clustered environment.

Does anybody have any suggestions as to how to get
the bookmarkable detail page and still have a ref
to this result object?


-
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org



Re: Passing / Persisting an object without PageParameters

2010-03-29 Thread James Carman
Well, what I have done in this situation is I use a breadcrumb:

public class Breadcrumb implements Serializable
{
private final PageReference destination;

public Breadcrumb()
{
this.destination = PageReference.forRequestedPage();
}

public Link createCancelLink(String id)
{
return new CancelLink(id);
}

private class CancelLink extends Link
{
private static final long serialVersionUID = 1L;

public CancelLink(String id)
{
super(id);
}

public void onClick()
{
redirectToDestination();
}
}

public void redirectToDestination()
{
RequestCycle.get().setResponsePage(destination.getPage());
RequestCycle.get().setRedirect(true);
}

public Page getDestinationPage()
{
return destination.getPage();
}
}

public class PageReferenceT extends Page implements Serializable
{
//**
// Fields
//**

private static final long serialVersionUID = 1L;

private final String pageMapName;
private final int number;
private final int version;

public static T extends Page PageReferenceT forPage(T page)
{
page.setStatelessHint(false);
return new PageReferenceT(page.getPageMapName(),
page.getNumericId(), page.getCurrentVersionNumber());
}

public static PageReference? extends Page forRequestedPage()
{
final IRequestTarget target = RequestCycle.get().getRequestTarget();
if(target instanceof IPageRequestTarget)
{
return forPage(((IPageRequestTarget)target).getPage());
}
throw new WicketRuntimeException(Unable to determine calling
page.);
}

private PageReference(String pageMapName, int number, int version)
{
this.pageMapName = pageMapName;
this.number = number;
this.version = version;
}

@Override
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (o == null || getClass() != o.getClass())
{
return false;
}

PageReference that = (PageReference) o;

if (number != that.number)
{
return false;
}
if (version != that.version)
{
return false;
}
if (!pageMapName.equals(that.pageMapName))
{
return false;
}

return true;
}

@Override
public int hashCode()
{
int result = pageMapName.hashCode();
result = 31 * result + number;
result = 31 * result + version;
return result;
}

@SuppressWarnings(unchecked)
public T getPage()
{
return (T) Session.get().getPage(pageMapName,
Integer.toString(number), version);
}
}

The breadcrumb allows you to go back to the exact page where you came from.
I use it along with a page superclass called LoopPage and a link class
called LoopLink:

public class LoopPage extends WebPage
{
protected final Breadcrumb breadcrumb;

public LoopPage()
{
this.breadcrumb = new Breadcrumb();
}

protected void redirectToDestination()
{
breadcrumb.redirectToDestination();
}

protected Page getDestinationPage()
{
return breadcrumb.getDestinationPage();
}
}

public abstract class LoopLink extends SubmitLink
{
public LoopLink(String id)
{
super(id);
setDefaultFormProcessing(false);
}

protected abstract Page getLoopPage();

@Override
public final void onSubmit()
{
setResponsePage(getLoopPage());
setRedirect(true);
}
}

On Mon, Mar 29, 2010 at 10:23 AM, Flavius flav...@silverlion.com wrote:


 I have a list page and a detail page.  The
 list is the results of a search and I put
 this in a listview.  The user can then click
 each item to view it in the detail.

 What I'm doing now is passing the result object
 to the detail page so they can continue to
 navigate (next ) the results without having
 to go back to the list.  Also, when they return
 to the list, it should have the same results they
 had (preferrably without requerying the database).

 I now want to make the detail page bookmarkable.
 So I can pass a string value along that identifies
 the detail record to retrieve, but I'm in a quandry
 as to how to handle the result object.

 I need to put this someplace where the pages can see
 it and all I can think of is the session.  I'm
 reluctant to put this on the session because it
 will be  1k in size and possibly up to 3k.  That's
 a big object to put on the session, especially in
 a clustered environment.

 Does anybody have any suggestions as to how to get
 the