package lt.inventi.wicket.component.breadcrumb;
import java.io.Serializable;
import java.lang.ref.WeakReference;
import org.apache.wicket.Page;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
import org.apache.wicket.core.request.handler.IPageProvider;
import org.apache.wicket.core.request.handler.PageProvider;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
class BreadcrumbPageProvider implements Serializable {
private final int pageId;
private final Class<? extends IRequestablePage> pageClass;
private final PageParameters params;
private final boolean isBookmarkable;
private transient WeakReference<IRequestablePage> webPage;
public BreadcrumbPageProvider(IRequestablePage page) {
this.webPage = new WeakReference<IRequestablePage>(page);
this.pageId = page.getPageId();
this.pageClass = (page instanceof Page) ? ((Page) page).getPageClass() : page.getClass();
this.params = page.getPageParameters();
this.isBookmarkable = page.isBookmarkable();
}
CharSequence getURL(RequestCycle rc) {
try {
return rc.urlFor(getHandler());
} catch (WicketRuntimeException e) {
if (isBookmarkable) {
return rc.urlFor(new BookmarkablePageRequestHandler(new PageProvider(pageClass, params)));
}
throw new IllegalStateException("Cannot render link for " + pageClass + ", " + pageId + " !", e);
}
}
IRequestHandler getHandler() {
return new RenderPageRequestHandler(getProvider());
}
private IPageProvider getProvider() {
if (webPage != null) {
IRequestablePage page = webPage.get();
if (page != null) {
return new PageProvider(page);
}
webPage = null;
}
// We don't care about render count as it's only used for safeguarding
// against destructive actions (usually performed with AJAX,
// e.g. modifying a list of items on a single page in several browser tabs).
return new PageProvider(pageId, pageClass, params, null);
}
String getId() {
return pageClass.getName() + pageId;
}
Class<?> getPageType() {
return pageClass;
}
@Override
public String toString() {
return pageClass.getSimpleName() + "@" + pageId +
(params == null || params.isEmpty() ? "" : "?" + params);
}
}