From: <bra...@us...> - 2010-10-18 23:05:21
|
Revision: 3286 http://archive-access.svn.sourceforge.net/archive-access/?rev=3286&view=rev Author: bradtofel Date: 2010-10-18 22:23:58 +0000 (Mon, 18 Oct 2010) Log Message: ----------- Feature: Added ReplayRendererDecorator, to simplify creation of things like MementoReplayRendererDecorator, which adds HTTP headers for all replayed resources in a Memento accessPoint. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/MementoReplay.xml Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoReplayRendererDecorator.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/replay/ReplayRendererDecorator.java Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoReplayRendererDecorator.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoReplayRendererDecorator.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoReplayRendererDecorator.java 2010-10-18 22:23:58 UTC (rev 3286) @@ -0,0 +1,225 @@ +/* + * This file is part of the Wayback archival access software + * (http://archive-access.sourceforge.net/projects/wayback/). + * + * Licensed to the Internet Archive (IA) by one or more individual + * contributors. + * + * The IA licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.archive.wayback.memento; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; +import java.util.Properties; +import java.util.TimeZone; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.archive.wayback.ReplayRenderer; +import org.archive.wayback.ResultURIConverter; +import org.archive.wayback.archivalurl.ArchivalUrlResultURIConverter; +import org.archive.wayback.core.CaptureSearchResult; +import org.archive.wayback.core.CaptureSearchResults; +import org.archive.wayback.core.Resource; +import org.archive.wayback.core.WaybackRequest; +import org.archive.wayback.exception.BadContentException; +import org.archive.wayback.exception.WaybackException; +import org.archive.wayback.replay.HttpHeaderProcessor; +import org.archive.wayback.replay.TextReplayRenderer; +import org.archive.wayback.replay.ReplayRendererDecorator; + +/** + * @author brad + * + */ +public class MementoReplayRendererDecorator extends ReplayRendererDecorator { + + public MementoReplayRendererDecorator() { + super(); + } + /** + * @param decorated + * @param httpHeaderProcessor + */ + public MementoReplayRendererDecorator(ReplayRenderer decorated) { + super(decorated); + } + + @Override + public void renderResource(HttpServletRequest httpRequest, + HttpServletResponse httpResponse, WaybackRequest wbRequest, + CaptureSearchResult result, Resource resource, + ResultURIConverter uriConverter, CaptureSearchResults results) + throws ServletException, IOException, WaybackException { + + // add Memento headers: +// UIResults results = UIResults.extractCaptureQuery(request); +// WaybackRequest wbRequest = results.getWbRequest(); +// CaptureSearchResults cResults = results.getCaptureResults(); +// CaptureSearchResult res = cResults.getClosest(); + String u = wbRequest.getRequestUrl(); + 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); + Properties apProps = wbRequest.getAccessPoint().getConfigs(); + ArchivalUrlResultURIConverter aUriConverter = + (ArchivalUrlResultURIConverter) uriConverter; + Date closestDate = result.getCaptureDate(); + String uriPrefix = aUriConverter.getReplayURIPrefix(); + String agguri = apProps.getProperty("aggregationPrefix") + + "timebundle/" + u; + String timemap = " , <" + + apProps.getProperty("aggregationPrefix") + + "timemap/link/" + u + + ">;rel=\"timemap\"; type=\"text/csv\""; + + String timegate = ",<" + uriPrefix + "timegate/" + u + + ">;rel=\"timegate\""; + + Date f = results.getFirstResultDate(); + Date l = results.getLastResultDate(); + + StringBuffer sb = new StringBuffer(); + + httpResponse.setHeader("Memento-Datetime", + httpformatterl.format(result.getCaptureDate())); + + String memento = ",<" + uriPrefix + formatterk.format(closestDate) + + "/" + u + ">;rel=\"memento\";datetime=\"" + + httpformatterl.format(closestDate) + "\""; + 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) + "\""; + mfl = mfl + ", <" + 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) + "\""; + mfl = mfl + ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + } else { + mfl = memento; + + mfl = mfl + ", <" + uriPrefix + formatterk.format(l) + "/" + u + + ">;rel=\"last-memento\"; datetime=\"" + + httpformatterl.format(l) + "\""; + mfl = mfl + ", <" + uriPrefix + formatterk.format(f) + "/" + u + + ">;rel=\"first-memento\"; datetime=\"" + + httpformatterl.format(f) + "\""; + } + + sb = new StringBuffer(mfl); + + // calculate closest values for link header + + CaptureSearchResult closestleft = null; + CaptureSearchResult closestright = null; + long rclosestDistance = 0; + long lclosestDistance = 0; + CaptureSearchResult cur = null; + + long wantTime = closestDate.getTime(); + + Iterator<CaptureSearchResult> itr = results.iterator(); + while (itr.hasNext()) { + cur = itr.next(); + cur.getCaptureDate(); + long curDistance = cur.getCaptureDate().getTime() - wantTime; + // == 0 skip + if (curDistance > 0) { + if ((closestright == null) + || (Math.abs(curDistance) < Math + .abs(rclosestDistance))) { + closestright = cur; + rclosestDistance = Math.abs(curDistance); + } + } + + if (curDistance < 0) { + if ((closestleft == null) + || (Math.abs(curDistance) < Math + .abs(lclosestDistance))) { + closestleft = cur; + lclosestDistance = Math.abs(curDistance); + } + } + + } + + 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(", <" + + 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 "); + + } + + } + + String origlink = ", <" + u + ">;rel=\"original\""; + + httpResponse.setHeader("Link", "<" + agguri + ">;rel=\"timebundle\"" + + origlink + sb.toString() + timemap + timegate); + + decorated.renderResource(httpRequest, httpResponse, wbRequest, result, + resource, uriConverter, results); + } + +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/memento/MementoReplayRendererDecorator.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/replay/ReplayRendererDecorator.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/replay/ReplayRendererDecorator.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/replay/ReplayRendererDecorator.java 2010-10-18 22:23:58 UTC (rev 3286) @@ -0,0 +1,72 @@ +/* + * This file is part of the Wayback archival access software + * (http://archive-access.sourceforge.net/projects/wayback/). + * + * Licensed to the Internet Archive (IA) by one or more individual + * contributors. + * + * The IA licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.archive.wayback.replay; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.archive.wayback.ReplayRenderer; +import org.archive.wayback.ResultURIConverter; +import org.archive.wayback.core.CaptureSearchResult; +import org.archive.wayback.core.CaptureSearchResults; +import org.archive.wayback.core.Resource; +import org.archive.wayback.core.WaybackRequest; +import org.archive.wayback.exception.BadContentException; +import org.archive.wayback.exception.WaybackException; +import org.archive.wayback.replay.charset.CharsetDetector; + +/** + * @author brad + * + */ +public abstract class ReplayRendererDecorator implements ReplayRenderer { + + protected ReplayRenderer decorated = null; + /** + * @return the decorated + */ + public ReplayRenderer getDecorated() { + return decorated; + } + /** + * @param decorated the decorated to set + */ + public void setDecorated(ReplayRenderer decorated) { + this.decorated = decorated; + } + public ReplayRendererDecorator() { + } + /** + * @param httpHeaderProcessor + */ + public ReplayRendererDecorator(ReplayRenderer decorated) { + this.decorated = decorated; + } + + public abstract void renderResource(HttpServletRequest httpRequest, + HttpServletResponse httpResponse, WaybackRequest wbRequest, + CaptureSearchResult result, Resource resource, + ResultURIConverter uriConverter, CaptureSearchResults results) + throws ServletException, IOException, WaybackException; +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/replay/ReplayRendererDecorator.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Modified: trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/MementoReplay.xml =================================================================== --- trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/MementoReplay.xml 2010-10-18 22:17:43 UTC (rev 3285) +++ trunk/archive-access/projects/wayback/wayback-webapp/src/main/webapp/WEB-INF/MementoReplay.xml 2010-10-18 22:23:58 UTC (rev 3286) @@ -17,7 +17,9 @@ <list> <value>/WEB-INF/replay/ArchiveComment.jsp</value> <value>/WEB-INF/replay/Disclaimer.jsp</value> + <!-- <value>/WEB-INF/replay/MementoValidity.jsp</value> + --> </list> </property> </bean> @@ -29,13 +31,6 @@ <property name="selectors"> <list> - <!-- REDIRECT IF NOT EXACT DATE --> - <bean class="org.archive.wayback.replay.selector.DateMismatchSelector"> - <property name="renderer"> - <bean class="org.archive.wayback.archivalurl.ArchivalUrlDateRedirectReplayRenderer" /> - </property> - </bean> - <!-- HTML REPLAY --> <bean class="org.archive.wayback.replay.selector.MimeTypeSelector"> <property name="mimeContains"> @@ -44,7 +39,11 @@ <value>application/xhtml</value> </list> </property> - <property name="renderer" ref="mementoclientsidehtmlreplayrenderer"/> + <property name="renderer"> + <bean class="org.archive.wayback.memento.MementoReplayRendererDecorator"> + <property name="decorated" ref="mementoclientsidehtmlreplayrenderer"/> + </bean> + </property> </bean> <!-- CSS REPLAY --> @@ -54,32 +53,20 @@ <value>text/css</value> </list> </property> - <property name="renderer" ref="archivalcssreplayrenderer"/> - </bean> - - <!-- ASX-MIME REPLAY --> - <bean class="org.archive.wayback.replay.selector.MimeTypeSelector"> - <property name="mimeContains"> - <list> - <value>video/x-ms-asf</value> - </list> + <property name="renderer"> + <bean class="org.archive.wayback.memento.MementoReplayRendererDecorator"> + <property name="decorated" ref="archivalcssreplayrenderer"/> + </bean> </property> - <property name="renderer" ref="archivalasxreplayrenderer"/> </bean> - <!-- ASX-PATH REPLAY --> - <bean class="org.archive.wayback.replay.selector.PathMatchSelector"> - <property name="pathContains"> - <list> - <value>.asx</value> - </list> - </property> - <property name="renderer" ref="archivalasxreplayrenderer"/> - </bean> - <!-- DEFAULT-TRANSPARENT REPLAY --> <bean class="org.archive.wayback.replay.selector.AlwaysMatchSelector"> - <property name="renderer" ref="archivaltransparentreplayrenderer"/> + <property name="renderer"> + <bean class="org.archive.wayback.memento.MementoReplayRendererDecorator"> + <property name="decorated" ref="archivaltransparentreplayrenderer"/> + </bean> + </property> </bean> </list> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |