package org.archive.wayback.memento; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.exception.BadQueryException; import org.archive.wayback.exception.BetterRequestException; import org.archive.wayback.requestparser.BaseRequestParser; import org.archive.wayback.requestparser.WrappedRequestParser; import org.archive.wayback.webapp.AccessPoint; import org.archive.wayback.util.Timestamp; /** * * Class which parses TimeMap requests (/timemap/FORMAT/URL) * * @author brad * */ public class TimeMapRequestParser extends WrappedRequestParser implements MementoConstants { private static final Logger LOGGER = Logger .getLogger(TimeMapRequestParser.class.getName()); // ludab nov30 2012 public final static Pattern WB_REQUEST_REGEX = Pattern .compile("^(\\d{1,14})(([a-z]{2}[0-9]*_)*)/(.*)$"); /** * @param wrapped * BaseRequestParser holding config */ public TimeMapRequestParser(BaseRequestParser wrapped) { super(wrapped); } @Override public WaybackRequest parse(HttpServletRequest httpRequest, AccessPoint accessPoint) throws BadQueryException, BetterRequestException { if (!accessPoint.isEnableMemento()) { return null; } String requestPath = accessPoint.translateRequestPathQuery(httpRequest); LOGGER.fine("requestpath:" + requestPath); if (requestPath.startsWith(TIMEMAP)) { String urlStrplus = null, format = null, urlStr = null; int index = requestPath.indexOf("/"); if (index >= 0) { urlStrplus = requestPath.substring(index + 1); index = urlStrplus.indexOf("/"); if (index >= 0) { format = urlStrplus.substring(0, index); urlStr = urlStrplus.substring(index + 1); } else { format = urlStrplus; } } if (urlStr == null) { //Support CDX server query urlStr = httpRequest.getParameter("url"); } if (format == null) { format = httpRequest.getParameter("output"); } if (urlStr == null) { return null; } LOGGER.fine(String.format("Parsed format(%s) URL(%s)", format, urlStr)); WaybackRequest wbRequest = new WaybackRequest(); // ludab changes nov 30 2012 to add timemap paging Matcher matcher = WB_REQUEST_REGEX.matcher(urlStr); String startDate = getEarliestTimestamp(); if (matcher != null && matcher.matches()) { String dateStr = matcher.group(1); urlStr = matcher.group(4); wbRequest.put(PAGE_STARTS, dateStr); if (dateStr.length() == 0) { startDate = getEarliestTimestamp(); } else { startDate = Timestamp.parseAfter(dateStr).getDateStr(); } } if (wbRequest.getStartTimestamp() == null) { // ludab nov30 timemap paging wbRequest.setStartTimestamp(startDate); // wbRequest.setStartTimestamp(getEarliestTimestamp()); } wbRequest.setAnchorTimestamp(getLatestTimestamp()); if (wbRequest.getEndTimestamp() == null) { wbRequest.setEndTimestamp(getLatestTimestamp()); } wbRequest.setCaptureQueryRequest(); wbRequest.setMementoTimemapFormat(format); wbRequest.setRequestUrl(urlStr); int pagemax = MementoUtils.getPageMaxRecord(accessPoint); if (pagemax == 0) { wbRequest.setResultsPerPage(getMaxRecords()); } else { wbRequest.setResultsPerPage(pagemax); } return wbRequest; } return null; } }