I am trying to figure out how to implement a RequestFilter such that when a session time out occurs, Tapestry can redirect user to my error page saying “Your session has timed out”.
Here is my code, take from examples posted by Taha in the past
public class RequireSessionFilter implements ComponentRequestFilter
private ComponentSource componentSource;
private ApplicationStateManager applicationStateManager;
private Response response;
public RequireSessionFilter() {
super();
private PageRenderLinkSource pageRenderLinkSource;
RequireSessionFilter(ComponentSource componentSource,
Response response,
ApplicationStateManager applicationStateManager,
PageRenderLinkSource pageRenderLinkSource)
this.componentSource = componentSource;
this.response = response;
this.applicationStateManager = applicationStateManager;
this.pageRenderLinkSource = pageRenderLinkSource;
private boolean redirectIfObjectNotInSession(String pageName)
System.out.println("**************** Page Name :"+ pageName);
if(componentSource != null)
Component component = (Component) componentSource.getPage(pageName);
if(component != null && component.getClass().isAnnotationPresent(RequireSession.class))
RequireSession annotation = component.getClass().getAnnotation(RequireSession.class);
if(!applicationStateManager.exists(annotation.value()))
System.out.println("**************** redirect page :"+ annotation.redirectPage());
redirect(annotation.redirectPage());
return true;
return false;
private void redirect(String pageName)
try {
response.sendRedirect(pageRenderLinkSource.createPageRenderLink(pageName));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@Override
public void handlePageRender(PageRenderRequestParameters parameters,
ComponentRequestHandler handler) throws IOException {
if(redirectIfObjectNotInSession(parameters.getLogicalPageName()))
return;
handler.handlePageRender(parameters);
@Override
public void handleComponentEvent(
ComponentEventRequestParameters parameters,
ComponentRequestHandler handler) throws IOException {
if(redirectIfObjectNotInSession(parameters.getActivePageName()))
return;
((ComponentRequestHandler) handler).handleComponentEvent(parameters);
Here is how I defined my annotation
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireSession {
Class<?> value();
String redirectPage();
Now the page that gets the annotation is also what implements a ExceptionReporter
@RequireSession(value = UBForm.class, redirectPage = "Index")
public class UBPage implements ExceptionReporter
….
Here is my AppModule.java
@Contribute(ComponentRequestHandler.class)
public static void contributeRequestFilters(
final OrderedConfiguration<ComponentRequestFilter> filters) {
filters.addInstance("RequireSessionFilter",
RequireSessionFilter.class, "after:ErrorFilter");
public RequestExceptionHandler buildAppRequestExceptionHandler(
final Logger logger,
final ResponseRenderer renderer,
final ComponentSource componentSource)
return new RequestExceptionHandler()
public void handleRequestException(Throwable exception) throws IOException
String cc = componentSource.getActivePage().getClass().getName();
logger.error("Page reported back:"+ cc);
//default
String source = "ExceptionReport";
if (cc.indexOf("UBPage") != -1)
logger.error("Erro page was UBPage");
source = "UBError";
if (exception instanceof OperationException)
logger.error("Error was caused due to timeout");
logger.error("Unexpected runtime exception: " + exception.getMessage(), exception);
ExceptionReporter index = (ExceptionReporter) componentSource.getPage(source);
index.reportException(exception);
renderer.renderPageMarkupResponse(source);
};
public void contributeServiceOverride(
MappedConfiguration<Class, Object> configuration,
@Local
RequestExceptionHandler handler)
configuration.add(RequestExceptionHandler.class, handler);
When I try to go to UBPage, Tapestry is reporting the following exception in the logs
java.lang.NullPointerException
com.navicure.ui.customerapp.services.AppModule$2.handleRequestException(AppModule.java:161)
$RequestExceptionHandler_7bc7ed0ff6bc3.handleRequestException(Unknown Source)
org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:42)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:902)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:892)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
com.navicure.ui.customerapp.services.AppModule$1.service(AppModule.java:117)
$RequestFilter
The error line from above in AppModule is
String cc = componentSource.getActivePage().getClass().getName();
Looks like either componetSource is NULL or getActivePage is NULL
Can someone please help? Am I setting the RequestFilter correctly
when I say
filters.addInstance("RequireSessionFilter",
RequireSessionFilter.class, "after:ErrorFilter");
Here is my code, take from examples posted by Taha in the past
public class RequireSessionFilter implements ComponentRequestFilter
private ComponentSource componentSource;
private ApplicationStateManager applicationStateManager;
private Response response;
public RequireSessionFilter() {
super();
private PageRenderLinkSource pageRenderLinkSource;
RequireSessionFilter(ComponentSource componentSource,
Response response,
ApplicationStateManager applicationStateManager,
PageRenderLinkSource pageRenderLinkSource)
this.componentSource = componentSource;
this.response = response;
this.applicationStateManager = applicationStateManager;
this.pageRenderLinkSource = pageRenderLinkSource;
private boolean redirectIfObjectNotInSession(String pageName)
System.out.println("**************** Page Name :"+ pageName);
if(componentSource != null)
Component component = (Component) componentSource.getPage(pageName);
if(component != null && component.getClass().isAnnotationPresent(RequireSession.class))
RequireSession annotation = component.getClass().getAnnotation(RequireSession.class);
if(!applicationStateManager.exists(annotation.value()))
System.out.println("**************** redirect page :"+ annotation.redirectPage());
redirect(annotation.redirectPage());
return true;
return false;
private void redirect(String pageName)
try {
response.sendRedirect(pageRenderLinkSource.createPageRenderLink(pageName));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@Override
public void handlePageRender(PageRenderRequestParameters parameters,
ComponentRequestHandler handler) throws IOException {
if(redirectIfObjectNotInSession(parameters.getLogicalPageName()))
return;
handler.handlePageRender(parameters);
@Override
public void handleComponentEvent(
ComponentEventRequestParameters parameters,
ComponentRequestHandler handler) throws IOException {
if(redirectIfObjectNotInSession(parameters.getActivePageName()))
return;
((ComponentRequestHandler) handler).handleComponentEvent(parameters);
Here is how I defined my annotation
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireSession {
Class<?> value();
String redirectPage();
Now the page that gets the annotation is also what implements a ExceptionReporter
@RequireSession(value = UBForm.class, redirectPage = "Index")
public class UBPage implements ExceptionReporter
….
Here is my AppModule.java
@Contribute(ComponentRequestHandler.class)
public static void contributeRequestFilters(
final OrderedConfiguration<ComponentRequestFilter> filters) {
filters.addInstance("RequireSessionFilter",
RequireSessionFilter.class, "after:ErrorFilter");
public RequestExceptionHandler buildAppRequestExceptionHandler(
final Logger logger,
final ResponseRenderer renderer,
final ComponentSource componentSource)
return new RequestExceptionHandler()
public void handleRequestException(Throwable exception) throws IOException
String cc = componentSource.getActivePage().getClass().getName();
logger.error("Page reported back:"+ cc);
//default
String source = "ExceptionReport";
if (cc.indexOf("UBPage") != -1)
logger.error("Erro page was UBPage");
source = "UBError";
if (exception instanceof OperationException)
logger.error("Error was caused due to timeout");
logger.error("Unexpected runtime exception: " + exception.getMessage(), exception);
ExceptionReporter index = (ExceptionReporter) componentSource.getPage(source);
index.reportException(exception);
renderer.renderPageMarkupResponse(source);
};
public void contributeServiceOverride(
MappedConfiguration<Class, Object> configuration,
@Local
RequestExceptionHandler handler)
configuration.add(RequestExceptionHandler.class, handler);
When I try to go to UBPage, Tapestry is reporting the following exception in the logs
java.lang.NullPointerException
com.navicure.ui.customerapp.services.AppModule$2.handleRequestException(AppModule.java:161)
$RequestExceptionHandler_7bc7ed0ff6bc3.handleRequestException(Unknown Source)
org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:42)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:902)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:892)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90)
$RequestHandler_7bc7ed0ff6bf2.service(Unknown Source)
com.navicure.ui.customerapp.services.AppModule$1.service(AppModule.java:117)
$RequestFilter
The error line from above in AppModule is
String cc = componentSource.getActivePage().getClass().getName();
Looks like either componetSource is NULL or getActivePage is NULL
Can someone please help? Am I setting the RequestFilter correctly
when I say
filters.addInstance("RequireSessionFilter",
RequireSessionFilter.class, "after:ErrorFilter");