From: <bra...@us...> - 2010-09-28 21:17:55
|
Revision: 3255 http://archive-access.svn.sourceforge.net/archive-access/?rev=3255&view=rev Author: bradtofel Date: 2010-09-28 21:17:49 +0000 (Tue, 28 Sep 2010) Log Message: ----------- Now only accepts GET & HEAD Dates are in GMT Changes format and content of Link headers Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp Modified: trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp =================================================================== --- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp 2010-09-28 21:07:22 UTC (rev 3254) +++ trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/query/Memento.jsp 2010-09-28 21:17:49 UTC (rev 3255) @@ -11,75 +11,153 @@ <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="org.archive.wayback.ResultURIConverter" %> +<%@ page import="java.util.TimeZone" %> +<%@ page import="java.io.PrintWriter"%> <%@ page import="org.archive.wayback.archivalurl.ArchivalUrlResultURIConverter" %> <% + //timegate implementation + String method = request.getMethod(); + // may be there is better place to put this piece of code? + if( !(method.equals("GET")||method.equals("HEAD")) ) { + response.setStatus(405); + response.setHeader("Allow", "GET, HEAD"); + return; + } + response.setHeader("Vary", "negotiate,accept-datetime"); SimpleDateFormat httpformatterl = new SimpleDateFormat( "E, dd MMM yyyy HH:mm:ss z"); + TimeZone tzo = TimeZone.getTimeZone("GMT"); + httpformatterl.setTimeZone(tzo); + SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss"); + formatterk.setTimeZone(tzo); Date now = new Date(); UIResults results = UIResults.extractCaptureQuery(request);//nuzno potom perepisat' WaybackRequest wbRequest = results.getWbRequest(); - //String p_url = wbRequest.getContextPrefix(); String u = wbRequest.getRequestUrl(); - // String agguri = p_url.replace("memento","ore") +"timebundle/" + u; - // String ad = wbRequest.getStartTimestamp(); - // Date sdate = wbRequest.getStartDate(); - //Date pdate = wbRequest.getAnchorDate(); + String dtdate = wbRequest.get("dtconneg"); - Date dt = now; - if (dtdate != null) { - dt = httpformatterl.parse(dtdate); - } CaptureSearchResults cResults = results.getCaptureResults(); CaptureSearchResult res = cResults.getClosest(wbRequest, true); Date closestDate = res.getCaptureDate(); - //String url = res.getRedirectUrl(); + String agguri = results.getContextConfig("aggregationPrefix") + "timebundle/" + u; String timemap = " , <" + results.getContextConfig("aggregationPrefix") + "timemap/link/" + u + ">;rel=\"timemap\"; type=\"text/csv\""; + String origlink = ", <" + u + ">;rel=\"original\""; ArchivalUrlResultURIConverter uriconverter = (ArchivalUrlResultURIConverter) results .getURIConverter(); String uriPrefix = uriconverter.getReplayURIPrefix(); String replayUrl = results.resultToReplayUrl(res); - //alternates header - String qvalue = "1.0"; //just example + StringBuffer sb = new StringBuffer(); - // sb.append("{"); - //sb.append("\"" + u +"\" "+qvalue); - //sb.append(" {dt original}},"); - //calculate X-Archive-Interval - + + String memento = ",<" + replayUrl + + ">;rel=\"memento\";datetime=\"" + + httpformatterl.format(closestDate) + "\""; StringFormatter fmt = results.getWbRequest().getFormatter(); Date f = cResults.getFirstResultDate(); Date l = cResults.getLastResultDate(); - SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss"); - //sb.append("{\"" + uriPrefix +formatterk.format(f)+"/" +u +"\" " +qvalue); - //sb.append(" {dt " + "\""+httpformatterl.format(f) +"\" first}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) + "/" + u + + String mfl = null; + if ( (closestDate.equals(f)) && closestDate.equals(l)) { + + mfl = ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento memento last-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + + } else if (closestDate.equals(f)){ + + mfl = ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento memento\"; datetime=\"" + + httpformatterl.format(f) + "\"" + + ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento\"; datetime=\"" + + httpformatterl.format(l) + "\""; + + } else if (closestDate.equals(l)) { + + mfl = ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento memento\"; datetime=\"" + + httpformatterl.format(l) + "\"" + + ", <" + uriPrefix + formatterk.format(f) + "/" + u + ">;rel=\"first-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); - if (!f.equals(l)) { + + httpformatterl.format(f) + "\""; - // sb.append(","); - // sb.append("{\"" + uriPrefix +formatterk.format(l)+"/" +u +"\" " +qvalue); - // sb.append(" {dt " + "\""+httpformatterl.format(l) +"\" last}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) + "/" + u - + ">;rel=\"last-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); + } else { + + mfl = memento + + ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento\"; datetime=\"" + + httpformatterl.format(l) + "\"" + + ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; } - - //response.setHeader("X-Archive-Interval","{"+httpformatterl.format(f)+"} - {"+httpformatterl.format(l)+"}"); - + + sb = new StringBuffer(mfl); + + if (dtdate==null) dtdate=""; + + + //special handling date unparsable case + if (dtdate.equals("unparsable")) { + String fl= null; + if (f.equals(l)) { + fl=", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"last-memento first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + + } else { + fl = ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento\"; datetime=\"" + + httpformatterl.format(l) + "\""; + fl =fl +", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + } + response.setHeader("TCN", "list"); + response.setStatus(400); + response.setHeader("Link", "<" + agguri + + ">;rel=\"timebundle\"" + origlink + fl + + timemap); + + + + StringBuffer sberr = new StringBuffer(); + sberr.append("<html><head><title>400 Bad Request</title></head><body>" ); + sberr.append("<center><table width='800px'><tr><td><div style='background-color: #e0e0e0; padding: 10px;'><br/>"); + sberr.append("<center><b>Error: 400</b><center>" ); + sberr.append("<center><p>Bad Date Request.</p>" ); + sberr.append("However, we found archived resources available in the following time-range: " ); + sberr.append("<i><blockquote><ul> " ); + + sberr.append("<li>Very first available Memento "+ " at "+ uriPrefix + formatterk.format(f) + "/" + u +"</BR>\n" ); + sberr.append("<li>Most recent available Memento " + " at " + uriPrefix + formatterk.format(f) + "/" + u +"</BR>\n" ); + + + sberr.append("</ul> </blockquote></i>" ); + sberr.append("<br/></div></td></tr>"); + sberr.append("</table>"); + sberr.append("</body></html>"); + PrintWriter pw = response.getWriter(); + response.setContentType("text/html"); + pw.print(sberr.toString()); + pw.flush(); + pw.close(); + return; + } + + // calculate closest values for alternates - CaptureSearchResult closestleft = null; CaptureSearchResult closestright = null; long rclosestDistance = 0; @@ -88,16 +166,14 @@ String anchorDate = null; long maxWindow = -1; - //long wantTime = wbRequest.getReplayDate().getTime(); long wantTime = closestDate.getTime(); - + Iterator<CaptureSearchResult> itr = cResults.iterator(); while (itr.hasNext()) { cur = itr.next(); cur.getCaptureDate(); - //long curDistance = Math.abs(wantTime - cur.getCaptureDate().getTime()); - long curDistance = wantTime - cur.getCaptureDate().getTime(); - // == 0 propuskaem + long curDistance = cur.getCaptureDate().getTime()-wantTime; + // == 0 skip if (curDistance > 0) { if ((closestright == null) || (Math.abs(curDistance) < Math @@ -118,75 +194,38 @@ } - if ((dt.before(f)) || dt.after(now)) { - //if ((pdate.before(f))||pdate.after(now)) { - response.setHeader("TCN", "list"); - response.setStatus(406); - // response.setHeader("Link","<"+agguri+">;rel=\"aggregation\""); - // sb.append("}"); - // response.setHeader("Alternates",sb.toString()); - } else { - // SimpleDateFormat formatterk = new SimpleDateFormat("yyyyMMddHHmmss"); - - // StringBuffer sb = new StringBuffer(); - - // List list = new ArrayList(); - if (closestleft != null) { - if (!closestleft.getCaptureDate().equals(f)) { - // sb.append(","); - // sb.append("{\"" + uriPrefix +formatterk.format(closestleft.getCaptureDate())+"/" +u +"\" "+qvalue); - // sb.append(" {dt " +"\""+httpformatterl.format(closestleft.getCaptureDate()) +"\" prev} {type " + closestleft.getMimeType() +"}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) - + "/" + u - + ">;rel=\"prev-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); - // list.add(closestleft); - } + + + if (closestleft != null) { + if (!(closestleft.getCaptureDate().equals(f))) { + sb.append(", <" + uriPrefix + formatterk.format(closestleft.getCaptureDate()) + + "/" + u + + ">;rel=\"prev-memento\"; datetime=\"" + + httpformatterl.format(closestleft.getCaptureDate()) + "\""); + } else { + int m_index = sb.lastIndexOf("\"first-memento\""); + sb.insert(m_index + 1, "prev-memento "); } - if (closestright != null) { - if (!closestright.getCaptureDate().equals(l)) { - // sb.append(","); - // sb.append("{\"" + uriPrefix +formatterk.format(closestright.getCaptureDate())+"/" +u +"\" " +qvalue); - //sb.append(" {dt " +"\""+httpformatterl.format(closestright.getCaptureDate()) +"\" next} {type " + closestright.getMimeType() +"}}"); - sb.append(", <" + uriPrefix + formatterk.format(f) - + "/" + u - + ">;rel=\"next-memento\"; datetime=\"" - + httpformatterl.format(f) + "\""); - } - - // list.add(closestright); + } + if (closestright != null) { + if (!(closestright.getCaptureDate().equals(l))) { + sb.append(", <" + uriPrefix + formatterk.format(closestright.getCaptureDate()) + + "/" + u + + ">;rel=\"next-memento\"; datetime=\"" + + httpformatterl.format(closestright.getCaptureDate()) + "\""); + } else { + int m_index = sb.lastIndexOf("\"last-memento\""); + sb.insert(m_index + 1, "next-memento "); } + } + + + response.setHeader("Link", "<" + agguri + + ">;rel=\"timebundle\"" + origlink + sb.toString() + + timemap); //added timemap + + response.setHeader("TCN", "choice"); + response.setHeader("Location", replayUrl); + response.sendError(302, "Found"); - // Iterator it = list.iterator(); - //int count=0; - //while (it.hasNext()) { - - // count++; - //CaptureSearchResult alt = (CaptureSearchResult) it.next(); - - // sb.append("{"); - //sb.append("\"" + uriPrefix +formatterk.format(alt.getCaptureDate())+"/" +u +"\" "); - //sb.append("{dt " + httpformatterl.format(alt.getCaptureDate()) +"} {type " + alt.getMimeType() +"}"); - - //sb.append("}"); - //if (count!=list.size()) { - // sb.append(","); } - - //} - - // sb.append("}"); - String origlink = ", <" + u + ">;rel=\"original\""; - String memento = ",<" + replayUrl - + ">;rel=\"memento\";datetime=\"" - + httpformatterl.format(closestDate) + "\""; - response.setHeader("Link", "<" + agguri - + ">;rel=\"timebundle\"" + origlink + sb.toString() - + memento + timemap); //added timemap - // response.setHeader("Alternates",sb.toString()); - response.setHeader("TCN", "choice"); - response.setHeader("Location", replayUrl); - // response.setStatus(302,"Found"); //does'not work - response.sendError(302, "Found"); - - } %> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |