ConditionalGetPlugin.java [plain text]
package org.blojsom.plugin.limiter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.blojsom.blog.BlogEntry;
import org.blojsom.blog.BlogUser;
import org.blojsom.blog.BlojsomConfiguration;
import org.blojsom.blog.BlogComment;
import org.blojsom.plugin.BlojsomPlugin;
import org.blojsom.plugin.BlojsomPluginException;
import org.blojsom.util.BlojsomConstants;
import org.blojsom.util.BlojsomUtils;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;
import java.util.ArrayList;
public class ConditionalGetPlugin implements BlojsomPlugin, BlojsomConstants {
private Log _logger = LogFactory.getLog(ConditionalGetPlugin.class);
private static final String IF_MODIFIED_SINCE_HEADER = "If-Modified-Since";
private static final String IF_NONE_MATCH_HEADER = "If-None-Match";
public ConditionalGetPlugin() {
}
public void init(ServletConfig servletConfig, BlojsomConfiguration blojsomConfiguration) throws BlojsomPluginException {
}
public BlogEntry[] process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlogUser user, Map context, BlogEntry[] entries) throws BlojsomPluginException {
if (entries.length > 0) {
long ifModifiedSinceHeader = -1;
try {
ifModifiedSinceHeader = httpServletRequest.getDateHeader(IF_MODIFIED_SINCE_HEADER);
} catch (Exception e) {
ifModifiedSinceHeader = -1;
}
if ((ifModifiedSinceHeader == -1) && (httpServletRequest.getHeader(IF_NONE_MATCH_HEADER) == null)) {
_logger.debug("No If-Modified-Since or If-None-Match HTTP headers present.");
} else {
ArrayList datesToCheck = new ArrayList(5);
Date[] dates;
BlogComment[] comments;
BlogComment comment;
if (entries[0].getNumComments() > 0) {
comments = entries[0].getCommentsAsArray();
for (int i = comments.length - 1; i >= 0; i--) {
comment = comments[i];
datesToCheck.add(comment.getCommentDate());
}
}
datesToCheck.add(entries[0].getDate());
dates = (Date[]) datesToCheck.toArray(new Date[datesToCheck.size()]);
Date ifModifiedSinceDate = null;
ifModifiedSinceHeader = -1;
try {
ifModifiedSinceHeader = httpServletRequest.getDateHeader(IF_MODIFIED_SINCE_HEADER);
} catch (Exception e) {
ifModifiedSinceHeader = -1;
}
if (ifModifiedSinceHeader != -1) {
ifModifiedSinceDate = new Date(ifModifiedSinceHeader);
}
String ifNoneMatchHeader = null;
if (httpServletRequest.getHeader(IF_NONE_MATCH_HEADER) != null) {
ifNoneMatchHeader = httpServletRequest.getHeader(IF_NONE_MATCH_HEADER);
}
Date latestEntryDate;
for (int i = 0; i < dates.length; i++) {
latestEntryDate = dates[i];
if (ifModifiedSinceDate != null) {
if (latestEntryDate.toString().equals(ifModifiedSinceDate.toString())) {
_logger.debug("Returning 304 response based on If-Modified-Since header");
httpServletResponse.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
break;
} else {
_logger.debug("Latest entry date/If-Modified-Since date: " + latestEntryDate.toString() + "/" + ifModifiedSinceDate.toString());
}
} else if (ifNoneMatchHeader != null) {
String calculatedIfNoneMatchHeader = "\"" + BlojsomUtils.digestString(BlojsomUtils.getISO8601Date(latestEntryDate)) + "\"";
if (ifNoneMatchHeader.equals(calculatedIfNoneMatchHeader)) {
_logger.debug("Returning 304 response based on If-None-Match header");
httpServletResponse.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
break;
} else {
_logger.debug("Calculated ETag/If-None-Match ETag: " + calculatedIfNoneMatchHeader + "/" + ifNoneMatchHeader);
}
} else {
_logger.error("No If-Modified-Since or If-None-Match HTTP headers present and not caught in initial check.");
}
}
}
}
return entries;
}
public void cleanup() throws BlojsomPluginException {
}
public void destroy() throws BlojsomPluginException {
}
}