A ExpiresFilter.java Reference

This appendix shows the contents of the ExpiresFilter.java file.

package iwc;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

/**
 * The expires filter adds the expires HTTP header based on the deployment policy.
 * Many sites have a fixed deployment schedule where deployments take place 
 * based on timed regular intervals. This filter adds the expires header of the
 * next possible deployment time, to support browser caching. 
 * @author Chris Webster
 */
public class ExpiresFilter implements Filter {

        private FilterConfig filterConfig;
        private String expires;
        private long nextDeploymentTime;

        public ExpiresFilter() {
                expires = nextDeploymentTime();
        }

        private String nextDeploymentTime() {
                // assume next deployment is M-F at 09:45
                Calendar c = Calendar.getInstance();

                int dayOffset = 1;
                
                if (c.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
                        dayOffset+=2;
                }
                
                if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
                        dayOffset++;
                }
                
                c.add(Calendar.DAY_OF_MONTH, dayOffset);
                c.set(c.get(Calendar.YEAR)+2, c.get(Calendar.MONTH), 
                      c.get(Calendar.DAY_OF_MONTH), 9, 45);
                
                nextDeploymentTime = c.getTimeInMillis();
                
                String pattern = "EEE, dd MMM yyyy HH:mm:ss z";
                SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
                return sdf.format(c.getTime());
        }
        
        private void addCacheHeaders(ServletRequest request, ServletResponse response)
                throws IOException, ServletException {
                
                HttpServletResponse sr = (HttpServletResponse) response;
                sr.setHeader("Expires", expires);
                long now = (new Date()).getTime();
                
                long expireTime = nextDeploymentTime - now;
                expireTime /= 1000;
                sr.setHeader("Cache-Control", "max-age="+
                        Long.toString(expireTime)+";public;must-revalidate;");
        }

        /**
         *
         * @param request The servlet request we are processing
         * @param response The servlet response we are creating
         * @param chain The filter chain we are processing
         *
         * @exception IOException if an input/output error occurs
         * @exception ServletException if a servlet error occurs
         */
        public void doFilter(ServletRequest request, ServletResponse response,
                                                  FilterChain chain)
                throws IOException, ServletException {

                addCacheHeaders(request, response);
                chain.doFilter(request, response);
        }

        /**
         * Return the filter configuration object for this filter.
         */
        private FilterConfig getFilterConfig() {
                return filterConfig;
        }

        /**
         * Set the filter configuration object for this filter.
         *
         * @param filterConfig The filter configuration object
         */
        private void setFilterConfig(FilterConfig filterConfig) {
                this.filterConfig = filterConfig;
        }

        /**
         * Destroy method for this filter 
         *
         */
        public void destroy() {
        }

        /**
         * Init method for this filter 
         *
         */
        public void init(FilterConfig filterConfig) {
                setFilterConfig(filterConfig);
        }

        /**
         * Return a String representation of this object.
         */
        @Override
        public String toString() {
                if (getFilterConfig() == null) {
                        return ("ExpiresFilter()");
                }
                StringBuffer sb = new StringBuffer("ExpiresFilter(");
                sb.append(getFilterConfig());
                sb.append(")");
                return (sb.toString());

        }

        
}