JSR 286 Exercise 4 Solution

CountFilter.java
package org.jasig.census;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.EventRequest;
import javax.portlet.EventResponse;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.filter.ActionFilter;
import javax.portlet.filter.EventFilter;
import javax.portlet.filter.FilterChain;
import javax.portlet.filter.FilterConfig;
import javax.portlet.filter.RenderFilter;
import javax.portlet.filter.ResourceFilter;

public class CountFilter implements RenderFilter, ActionFilter, ResourceFilter, EventFilter {

    public static String RENDER_COUNT = "RENDER_COUNT";
    public static String ACTION_COUNT = "ACTION_COUNT";
    public static String RESOURCE_COUNT = "RESOURCE_COUNT";
    public static String EVENT_COUNT = "EVENT_COUNT";
    
    private static int renderCount = 0;
    private static int actionCount = 0;
    private static int resourceCount = 0;
    private static int eventCount = 0;
    
    public void doFilter(RenderRequest request, RenderResponse response, FilterChain chain)
        throws IOException, PortletException
    {
    	renderCount++;
        request.setAttribute(RENDER_COUNT, renderCount);
        request.setAttribute(ACTION_COUNT, actionCount);
        request.setAttribute(RESOURCE_COUNT, resourceCount);
        request.setAttribute(EVENT_COUNT, eventCount);
        chain.doFilter(request, response);
    }

    public void doFilter(ActionRequest request, ActionResponse response, FilterChain chain)
        throws IOException, PortletException
    {
        actionCount++;
        chain.doFilter(request, response);
    }

    public void doFilter(ResourceRequest request, ResourceResponse response, FilterChain chain)
        throws IOException, PortletException
    {
        resourceCount++;
        chain.doFilter(request, response);
    }

    public void doFilter(EventRequest request, EventResponse response, FilterChain chain)
        throws IOException, PortletException
    {
        eventCount++;
        chain.doFilter(request, response);
    }
    
    private FilterConfig filterConfig;

    public void destroy() {
        filterConfig = null;
    }

    public void init(FilterConfig filterConfig) throws PortletException {
        this.filterConfig = filterConfig;
    }

    public FilterConfig getFilterConfig() {
        return filterConfig;
    }
}
portlet.xml
...
	<filter>
		<description>Counts the number of times each lifecycle is called</description>
		<display-name>Count Filter</display-name>
		<filter-name>CountFilter</filter-name>
		<filter-class>org.jasig.census.CountFilter</filter-class>
		<lifecycle>ACTION_PHASE</lifecycle>
		<lifecycle>RENDER_PHASE</lifecycle>
		<lifecycle>EVENT_PHASE</lifecycle>
		<lifecycle>RESOURCE_PHASE</lifecycle>
	</filter>

	<filter-mapping>
		<filter-name>CountFilter</filter-name>
		<portlet-name>Census*</portlet-name>
	</filter-mapping>
...
list.jsp
...
Render calls: ${RENDER_COUNT}<br/>
Action calls: ${ACTION_COUNT}<br/>
Resource calls: ${RESOURCE_COUNT}<br/>
Event calls: ${EVENT_COUNT}<br/>