KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > roller > presentation > filters > IfPlanetModifiedFilter


1 package org.roller.presentation.filters;
2
3 import java.io.IOException JavaDoc;
4 import java.text.SimpleDateFormat JavaDoc;
5 import java.util.Date JavaDoc;
6
7 import javax.servlet.Filter JavaDoc;
8 import javax.servlet.FilterChain JavaDoc;
9 import javax.servlet.FilterConfig JavaDoc;
10 import javax.servlet.ServletException JavaDoc;
11 import javax.servlet.ServletRequest JavaDoc;
12 import javax.servlet.ServletResponse JavaDoc;
13 import javax.servlet.http.HttpServletRequest JavaDoc;
14 import javax.servlet.http.HttpServletResponse JavaDoc;
15
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18 import org.roller.RollerException;
19 import org.roller.model.Roller;
20 import org.roller.presentation.RollerRequest;
21
22 /**
23  * Entry point filter for Newsfeed Servlets, this filter
24  * Handles If-Modified-Since header using per-user and per-category
25  * last weblog pub time. Returns 304 if requested weblog has not been
26  * modified since. Also, sets Last-Modified on outgoing response.
27  *
28  * @web.filter name="IfPlanetModifiedFilter"
29  * @web.filter-mapping url-pattern="/planetrss/*"
30  *
31  * @author David M Johnson
32  */

33 public class IfPlanetModifiedFilter implements Filter JavaDoc
34 {
35     private static Log mLogger =
36         LogFactory.getFactory().getInstance(IfPlanetModifiedFilter.class);
37
38     SimpleDateFormat JavaDoc dateFormatter = new SimpleDateFormat JavaDoc("EEE MMM d HH:mm:ss z yyyy");
39
40     public IfPlanetModifiedFilter()
41     {
42         super();
43     }
44
45     /**
46      * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
47      */

48     public void init(FilterConfig JavaDoc filterConfig) throws ServletException JavaDoc
49     {
50     }
51
52     /**
53      * @see javax.servlet.Filter#doFilter(
54      * javax.servlet.ServletRequest,
55      * javax.servlet.ServletResponse,
56      * javax.servlet.FilterChain)
57      */

58     public void doFilter(
59         ServletRequest JavaDoc req,
60         ServletResponse JavaDoc res,
61         FilterChain JavaDoc chain)
62         throws IOException JavaDoc, ServletException JavaDoc
63     {
64         HttpServletRequest JavaDoc request = (HttpServletRequest JavaDoc) req;
65         HttpServletResponse JavaDoc response = (HttpServletResponse JavaDoc) res;
66
67         Date JavaDoc updateTime = null;
68         try
69         {
70             updateTime = getLastPublishedDate(request);
71
72             // RSS context loader needs updateTime, so stash it
73
request.setAttribute("updateTime", updateTime);
74
75             // Check the incoming if-modified-since header
76
Date JavaDoc sinceDate =
77                 new Date JavaDoc(request.getDateHeader("If-Modified-Since"));
78
79             if (updateTime != null)
80             {
81                  // convert date (JDK 1.5 workaround)
82
synchronized (dateFormatter)
83                  {
84                      String JavaDoc date = dateFormatter.format(updateTime);
85                      updateTime = new Date JavaDoc(date);
86                  }
87                  if (updateTime.compareTo(sinceDate) <= 0)
88                  {
89                      response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
90                      return;
91                  }
92             }
93             mLogger.debug("Not returning 304 for: "+request.getRequestURI());
94         }
95         catch (RollerException e)
96         {
97             // Thrown by getLastPublishedDate if there is a db-type error
98
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
99             return;
100         }
101         catch (IllegalArgumentException JavaDoc e)
102         {
103             // Thrown by getDateHeader if not in valid format. This can be
104
// safely ignored, the only consequence is that the NOT MODIFIED
105
// response is not set.
106
}
107
108         // Set outgoing last modified header
109
if (updateTime != null)
110         {
111             response.setDateHeader("Last-Modified", updateTime.getTime());
112         }
113
114         chain.doFilter(request, response);
115     }
116
117     public static Date JavaDoc getLastPublishedDate(HttpServletRequest JavaDoc request)
118         throws RollerException
119     {
120         RollerRequest rreq = RollerRequest.getRollerRequest(request);
121         Roller roller = rreq.getRoller();
122         Date JavaDoc lastUpdated = roller.getPlanetManager().getLastUpdated();
123         if (lastUpdated == null)
124         {
125             lastUpdated = new Date JavaDoc();
126             mLogger.warn("Can't get lastUpdate time, using current time instead");
127         }
128         return lastUpdated;
129     }
130
131     /**
132      * @see javax.servlet.Filter#destroy()
133      */

134     public void destroy()
135     {
136     }
137 }
138
Popular Tags