package org.jboss.seam.wicket;
import org.apache.wicket.AbortException;
import org.apache.wicket.Component;
import org.apache.wicket.Page;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.application.IComponentOnBeforeRenderListener;
import org.jboss.seam.core.Manager;
import org.jboss.seam.international.StatusMessage;
import org.jboss.seam.international.StatusMessages;
/**
* A listener registered by SeamWebApplication which ensures that a long-running conversation exists when a page
* annotated with NoConversationPage is rendered
*
*/
public class SeamEnforceConversationListener implements IComponentOnBeforeRenderListener
{
public void onBeforeRender(Component component)
{
if (!Manager.instance().isLongRunningConversation())
{
WicketComponent<?> wicketComponent = WicketComponent.getInstance(component.getClass());
if (wicketComponent != null)
{
Class<? extends Page> noConversationPage = wicketComponent.getNoConversationPage();
if (noConversationPage != null)
{
final RequestCycle cycle = RequestCycle.get();
StatusMessages.instance().addFromResourceBundleOrDefault(
StatusMessage.Severity.WARN,
"org.jboss.seam.NoConversation",
"The conversation ended or timed"
);
cycle.redirectTo(component.getPageFactory().newPage(noConversationPage));
throw new AbortException();
}
}
}
}
}