From: <bra...@us...> - 2008-07-22 02:45:26
|
Revision: 2480 http://archive-access.svn.sourceforge.net/archive-access/?rev=2480&view=rev Author: bradtofel Date: 2008-07-22 02:45:34 +0000 (Tue, 22 Jul 2008) Log Message: ----------- REFACTOR: SelectorDispatcher now used instead of hard-coded old Dispatcher, split old HTML ReplayRenderer into ClientSide and ServerSide HTMLReplayRenderer, refactored ASX and CSS ReplayRenderers to inherit from Common TextReplayRenderer base class. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java Removed Paths: ------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java 2008-07-22 02:42:56 UTC (rev 2479) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java 2008-07-22 02:45:34 UTC (rev 2480) @@ -1,7 +1,6 @@ package org.archive.wayback.archivalurl; import java.io.IOException; -import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -12,39 +11,28 @@ import org.archive.wayback.core.CaptureSearchResult; import org.archive.wayback.core.CaptureSearchResults; import org.archive.wayback.core.WaybackRequest; -import org.archive.wayback.exception.BadContentException; -import org.archive.wayback.replay.HTMLPage; -import org.archive.wayback.replay.HttpHeaderOperation; +import org.archive.wayback.replay.TextDocument; +import org.archive.wayback.replay.TextReplayRenderer; +import org.archive.wayback.replay.HttpHeaderProcessor; -public class ArchivalUrlASXReplayRenderer extends ArchivalUrlReplayRenderer { +public class ArchivalUrlASXReplayRenderer extends TextReplayRenderer { + + /** + * @param httpHeaderProcessor + */ + public ArchivalUrlASXReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { + super(httpHeaderProcessor); + } + /* (non-Javadoc) - * @see org.archive.wayback.ReplayRenderer#renderResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.SearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.SearchResults) + * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#updatePage(org.archive.wayback.replay.HTMLPage, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.CaptureSearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.CaptureSearchResults) */ - public void renderResource(HttpServletRequest httpRequest, + @Override + protected void updatePage(TextDocument page, HttpServletRequest httpRequest, HttpServletResponse httpResponse, WaybackRequest wbRequest, CaptureSearchResult result, Resource resource, ResultURIConverter uriConverter, CaptureSearchResults results) - throws ServletException, IOException, BadContentException { - - - HttpHeaderOperation.copyHTTPMessageHeader(resource, httpResponse); - - Map<String,String> headers = HttpHeaderOperation.processHeaders( - resource, result, uriConverter, this); - - // Load content into an HTML page, and resolve embedded HREF urls: - HTMLPage page = new HTMLPage(resource,result,uriConverter); - page.readFully(); - + throws ServletException, IOException { page.resolveASXRefUrls(); - - // set the corrected length: - int bytes = page.getBytes().length; - headers.put(HTTP_LENGTH_HEADER, String.valueOf(bytes)); - - // send back the headers: - HttpHeaderOperation.sendHeaders(headers, httpResponse); - - page.writeToOutputStream(httpResponse.getOutputStream()); } } Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java 2008-07-22 02:42:56 UTC (rev 2479) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java 2008-07-22 02:45:34 UTC (rev 2480) @@ -1,7 +1,6 @@ package org.archive.wayback.archivalurl; import java.io.IOException; -import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -12,37 +11,29 @@ import org.archive.wayback.core.CaptureSearchResult; import org.archive.wayback.core.CaptureSearchResults; import org.archive.wayback.core.WaybackRequest; -import org.archive.wayback.exception.BadContentException; -import org.archive.wayback.replay.HTMLPage; -import org.archive.wayback.replay.HttpHeaderOperation; +import org.archive.wayback.replay.TextDocument; +import org.archive.wayback.replay.TextReplayRenderer; +import org.archive.wayback.replay.HttpHeaderProcessor; -public class ArchivalUrlCSSReplayRenderer extends ArchivalUrlReplayRenderer { +public class ArchivalUrlCSSReplayRenderer extends TextReplayRenderer { + + /** + * @param httpHeaderProcessor + */ + public ArchivalUrlCSSReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { + super(httpHeaderProcessor); + } + /* (non-Javadoc) - * @see org.archive.wayback.ReplayRenderer#renderResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.SearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.SearchResults) + * @see org.archive.wayback.replay.HTMLReplayRenderer#updatePage(org.archive.wayback.replay.HTMLPage, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.CaptureSearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.CaptureSearchResults) */ - public void renderResource(HttpServletRequest httpRequest, + @Override + protected void updatePage(TextDocument page, HttpServletRequest httpRequest, HttpServletResponse httpResponse, WaybackRequest wbRequest, CaptureSearchResult result, Resource resource, ResultURIConverter uriConverter, CaptureSearchResults results) - throws ServletException, IOException, BadContentException { - HttpHeaderOperation.copyHTTPMessageHeader(resource, httpResponse); + throws ServletException, IOException { - Map<String,String> headers = HttpHeaderOperation.processHeaders( - resource, result, uriConverter, this); - - // Load content into an HTML page, and resolve @import URLs: - HTMLPage page = new HTMLPage(resource,result,uriConverter); - page.readFully(); - page.resolveCSSUrls(); - - // set the corrected length: - int bytes = page.getBytes().length; - headers.put(HTTP_LENGTH_HEADER, String.valueOf(bytes)); - - // send back the headers: - HttpHeaderOperation.sendHeaders(headers, httpResponse); - - page.writeToOutputStream(httpResponse.getOutputStream()); } } Deleted: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java 2008-07-22 02:42:56 UTC (rev 2479) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayDispatcher.java 2008-07-22 02:45:34 UTC (rev 2480) @@ -1,165 +0,0 @@ -/* ArchivalUrlReplayRendererDispatcher - * - * $Id$ - * - * Created on 11:38:02 AM Aug 9, 2007. - * - * Copyright (C) 2007 Internet Archive. - * - * This file is part of wayback-core. - * - * wayback-core is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * any later version. - * - * wayback-core is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser Public License for more details. - * - * You should have received a copy of the GNU Lesser Public License - * along with wayback-core; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package org.archive.wayback.archivalurl; - -import java.util.List; - -import org.archive.wayback.ReplayDispatcher; -import org.archive.wayback.ReplayRenderer; -import org.archive.wayback.core.Resource; -import org.archive.wayback.core.CaptureSearchResult; -import org.archive.wayback.core.WaybackRequest; -import org.archive.wayback.replay.DateRedirectReplayRenderer; - -/** - * - * - * @author brad - * @version $Date$, $Revision$ - */ -public class ArchivalUrlReplayDispatcher implements ReplayDispatcher { - - /** - * MIME type of documents which should be marked up with javascript to - * rewrite URLs inside document - */ - private final static String TEXT_HTML_MIME = "text/html"; - private final static String TEXT_XHTML_MIME = "application/xhtml"; - private final static String TEXT_CSS_MIME = "text/css"; - private final static String ASX_MIME = "video/x-ms-asf"; - private final static String ASX_EXTENSION = ".asx"; - - - // TODO: make this configurable - private final static long MAX_HTML_MARKUP_LENGTH = 1024 * 1024 * 5; - - private ReplayRenderer transparent = - new ArchivalUrlTransparentReplayRenderer(); - - private ReplayRenderer redirect = new DateRedirectReplayRenderer(); - private ArchivalUrlReplayRenderer archivalHTML = - new ArchivalUrlReplayRenderer(); - private ArchivalUrlCSSReplayRenderer archivalCSS = - new ArchivalUrlCSSReplayRenderer(); - private ArchivalUrlASXReplayRenderer archivalASX = - new ArchivalUrlASXReplayRenderer(); - - /* (non-Javadoc) - * @see org.archive.wayback.ReplayDispatcher#getRenderer(org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.SearchResult, org.archive.wayback.core.Resource) - */ - public ReplayRenderer getRenderer(WaybackRequest wbRequest, - CaptureSearchResult result, Resource resource) { - - // if the result is not for the exact date requested, redirect to the - // exact date. some capture dates are not 14 digits, only compare as - // many digits as are in the result date: - String reqDateStr = wbRequest.getReplayTimestamp(); - String resDateStr = result.getCaptureTimestamp(); - if(!resDateStr.equals(reqDateStr.substring(0, resDateStr.length()))) { - return redirect; - } - - // only bother attempting markup on pages smaller than some size: - if (resource.getRecordLength() < MAX_HTML_MARKUP_LENGTH) { - - String resultMime = result.getMimeType(); - // HTML and XHTML docs get marked up as HTML - if (-1 != resultMime.indexOf(TEXT_HTML_MIME)) { - return archivalHTML; - } - if (-1 != resultMime.indexOf(TEXT_XHTML_MIME)) { - return archivalHTML; - } - // CSS docs get marked up as CSS - if (-1 != resultMime.indexOf(TEXT_CSS_MIME)) { - return archivalCSS; - } - if (-1 != resultMime.indexOf(ASX_MIME)) { - return archivalASX; - } - String resultPath = result.getUrlKey(); - resultPath = resultPath.substring(resultPath.indexOf('/')); - int queryIdx = resultPath.indexOf('?'); - if(queryIdx > 0) { - resultPath = resultPath.substring(0,queryIdx-1); - } - if(resultPath.endsWith(ASX_EXTENSION)) { - return archivalASX; - } - } - - // everything else goes transparently: - return transparent; - } - - /** - * @return - * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#getJsInserts() - */ - public List<String> getJsInserts() { - return archivalHTML.getJsInserts(); - } - - /** - * @return - * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#getJspInserts() - */ - public List<String> getJspInserts() { - return archivalHTML.getJspInserts(); - } - - /** - * @param jsInserts - * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#setJsInserts(java.util.List) - */ - public void setJsInserts(List<String> jsInserts) { - archivalHTML.setJsInserts(jsInserts); - } - - /** - * @param jspInserts - * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#setJspInserts(java.util.List) - */ - public void setJspInserts(List<String> jspInserts) { - archivalHTML.setJspInserts(jspInserts); - } - - /** - * @return - * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#isServerSideRendering() - */ - public boolean isServerSideRendering() { - return archivalHTML.isServerSideRendering(); - } - - /** - * @param isServerSideRendering - * @see org.archive.wayback.archivalurl.ArchivalUrlReplayRenderer#setServerSideRendering(boolean) - */ - public void setServerSideRendering(boolean isServerSideRendering) { - archivalHTML.setServerSideRendering(isServerSideRendering); - archivalCSS.setServerSideRendering(isServerSideRendering); - } -} Deleted: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java 2008-07-22 02:42:56 UTC (rev 2479) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlReplayRenderer.java 2008-07-22 02:45:34 UTC (rev 2480) @@ -1,202 +0,0 @@ -/* ArchivalUrlReplayRenderer - * - * $Id$ - * - * Created on 6:11:00 PM Aug 8, 2007. - * - * Copyright (C) 2007 Internet Archive. - * - * This file is part of wayback-core. - * - * wayback-core is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser Public License as published by - * the Free Software Foundation; either version 2.1 of the License, or - * any later version. - * - * wayback-core is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser Public License for more details. - * - * You should have received a copy of the GNU Lesser Public License - * along with wayback-core; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package org.archive.wayback.archivalurl; - -import java.io.IOException; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -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.Resource; -import org.archive.wayback.core.CaptureSearchResult; -import org.archive.wayback.core.CaptureSearchResults; -import org.archive.wayback.core.WaybackRequest; -import org.archive.wayback.exception.BadContentException; -import org.archive.wayback.replay.HTMLPage; -import org.archive.wayback.replay.HttpHeaderProcessor; -import org.archive.wayback.replay.HttpHeaderOperation; -import org.archive.wayback.util.url.UrlOperations; - -/** - * ReplayRenderer responsible for marking up HTML pages so they replay in - * ArchivalUrl context: - * resolve in page URLs - * add HTML comment and javascript to modify URLs client-side to point back - * to this context - * - * @author brad - * @version $Date$, $Revision$ - */ -public class ArchivalUrlReplayRenderer implements ReplayRenderer, HttpHeaderProcessor { - - - private List<String> jsInserts = null; - private List<String> jspInserts = null; - private boolean serverSideRendering = false; - - /* (non-Javadoc) - * @see org.archive.wayback.ReplayRenderer#renderResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.SearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.SearchResults) - */ - public void renderResource(HttpServletRequest httpRequest, - HttpServletResponse httpResponse, WaybackRequest wbRequest, - CaptureSearchResult result, Resource resource, - ResultURIConverter uriConverter, CaptureSearchResults results) - throws ServletException, IOException, BadContentException { - - StringBuilder toInsert = new StringBuilder(300); - - HttpHeaderOperation.copyHTTPMessageHeader(resource, httpResponse); - - Map<String,String> headers = HttpHeaderOperation.processHeaders( - resource, result, uriConverter, this); - - - // Load content into an HTML page, and resolve load-time URLs: - HTMLPage page = new HTMLPage(resource,result,uriConverter); - page.readFully(); - - if(serverSideRendering) { - page.resolveAllPageUrls(); - } else { - page.resolvePageUrls(); - } - if(jsInserts != null) { - Iterator<String> itr = jsInserts.iterator(); - while(itr.hasNext()) { - toInsert.append(page.getJSIncludeString(itr.next())); - } - } - if(jspInserts != null) { - Iterator<String> itr = jspInserts.iterator(); - while(itr.hasNext()) { - toInsert.append(page.includeJspString(itr.next(), httpRequest, - httpResponse, wbRequest, results, result, resource)); - } - } - - // insert the new content: - if(serverSideRendering) { - page.insertAtStartOfBody(toInsert.toString()); - } else { - page.insertAtEndOfBody(toInsert.toString()); - } - - // set the corrected length: - int bytes = page.getBytes().length; - headers.put(HTTP_LENGTH_HEADER, String.valueOf(bytes)); - // Tomcat will always send a charset... It's trying to be smarter than - // we are. If the original page didn't include a "charset" as part of - // the "Content-Type" HTTP header, then Tomcat will use the default.. - // who knows what that is, or what that will do to the page.. - // let's try explicitly setting it to what we used: - httpResponse.setCharacterEncoding(page.getCharSet()); - - // send back the headers: - HttpHeaderOperation.sendHeaders(headers, httpResponse); - - page.writeToOutputStream(httpResponse.getOutputStream()); - } - - /* (non-Javadoc) - * @see org.archive.wayback.replay.HttpHeaderProcessor#filter(java.util.Map, java.lang.String, java.lang.String, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.SearchResult) - */ - public void filter(Map<String, String> output, String key, String value, - ResultURIConverter uriConverter, CaptureSearchResult result) { - - String keyUp = key.toUpperCase(); - - // omit Content-Length header - if (keyUp.equals(HTTP_LENGTH_HEADER_UP)) { - return; - } - - // rewrite Location header URLs - if (keyUp.startsWith(HTTP_LOCATION_HEADER_UP) || - keyUp.startsWith(HTTP_CONTENT_BASE_HEADER_UP)) { - - String baseUrl = result.getOriginalUrl(); - String cd = result.getCaptureTimestamp(); - // by the spec, these should be absolute already, but just in case: - String u = UrlOperations.resolveUrl(baseUrl, value); - - output.put(key, uriConverter.makeReplayURI(cd,u)); - } else if(keyUp.startsWith(HTTP_CONTENT_TYPE_HEADER_UP)) { - output.put("X-Wayback-Orig-" + key,value); - output.put(key,value); - } else { - // others go out as-is: - - output.put(key, value); - } - } - - /** - * @return the jsInserts - */ - public List<String> getJsInserts() { - return jsInserts; - } - - /** - * @param jsInserts the jsInserts to set - */ - public void setJsInserts(List<String> jsInserts) { - this.jsInserts = jsInserts; - } - - /** - * @return the jspInserts - */ - public List<String> getJspInserts() { - return jspInserts; - } - - /** - * @param jspInserts the jspInserts to set - */ - public void setJspInserts(List<String> jspInserts) { - this.jspInserts = jspInserts; - } - - /** - * @return the isServerSideRendering - */ - public boolean isServerSideRendering() { - return serverSideRendering; - } - - /** - * @param isServerSideRendering the isServerSideRendering to set - */ - public void setServerSideRendering(boolean serverSideRendering) { - this.serverSideRendering = serverSideRendering; - } -} Deleted: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java 2008-07-22 02:42:56 UTC (rev 2479) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlTransparentReplayRenderer.java 2008-07-22 02:45:34 UTC (rev 2480) @@ -1,45 +0,0 @@ -package org.archive.wayback.archivalurl; - -import java.util.Map; - -import org.archive.wayback.ResultURIConverter; -import org.archive.wayback.core.CaptureSearchResult; -import org.archive.wayback.replay.TransparentReplayRenderer; -import org.archive.wayback.util.url.UrlOperations; - -/** - * Slight extension to TransparentReplayRenderer, which rewrites Location and - * Content-Base HTTP headers as they go out. - * - * @author brad - * @version $Date$, $Revision$ - */ -public class ArchivalUrlTransparentReplayRenderer -extends TransparentReplayRenderer { - - /* (non-Javadoc) - * @see org.archive.wayback.replay.HeaderFilter#filter(java.util.Map, java.lang.String, java.lang.String, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.SearchResult) - */ - public void filter(Map<String, String> output, String key, String value, - ResultURIConverter uriConverter, CaptureSearchResult result) { - - String keyUp = key.toUpperCase(); - - // rewrite Location header URLs - if (keyUp.startsWith(HTTP_LOCATION_HEADER_UP) || - keyUp.startsWith(HTTP_CONTENT_BASE_HEADER_UP)) { - - String baseUrl = result.getOriginalUrl(); - String cd = result.getCaptureTimestamp(); - // by the spec, these should be absolute already, but just in case: - String u = UrlOperations.resolveUrl(baseUrl, value); - - output.put(key, uriConverter.makeReplayURI(cd,u)); - - } else { - // others go out as-is: - - output.put(key, value); - } - } -} Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java 2008-07-22 02:45:34 UTC (rev 2480) @@ -0,0 +1,86 @@ +/* ClientSideHTMLReplayRenderer + * + * $Id$ + * + * Created on 2:23:03 PM Jul 18, 2008. + * + * Copyright (C) 2008 Internet Archive. + * + * This file is part of wayback. + * + * wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package org.archive.wayback.archivalurl; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +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.replay.TextDocument; +import org.archive.wayback.replay.TextReplayRenderer; +import org.archive.wayback.replay.HttpHeaderProcessor; + +/** + * + * + * @author brad + * @version $Date$, $Revision$ + */ +public class ClientSideHTMLReplayRenderer extends TextReplayRenderer { + /** + * @param httpHeaderProcessor + */ + public ClientSideHTMLReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { + super(httpHeaderProcessor); + } + + /* (non-Javadoc) + * @see org.archive.wayback.replay.HTMLReplayRenderer#updatePage(org.archive.wayback.replay.HTMLPage, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.CaptureSearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.CaptureSearchResults) + */ + @Override + protected void updatePage(TextDocument page, HttpServletRequest httpRequest, + HttpServletResponse httpResponse, WaybackRequest wbRequest, + CaptureSearchResult result, Resource resource, + ResultURIConverter uriConverter, CaptureSearchResults results) + throws ServletException, IOException { + + List<String> jspInserts = getJspInserts(); + + StringBuilder toInsert = new StringBuilder(300); + + page.resolvePageUrls(); + + // hope we're configured to use ClientSideJSInsert.jsp! + if(jspInserts != null) { + Iterator<String> itr = jspInserts.iterator(); + while(itr.hasNext()) { + toInsert.append(page.includeJspString(itr.next(), httpRequest, + httpResponse, wbRequest, results, result, resource)); + } + } + + // insert the new content: + page.insertAtEndOfBody(toInsert.toString()); + } +} Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java 2008-07-22 02:45:34 UTC (rev 2480) @@ -0,0 +1,84 @@ +/* ServerSideHTMLReplayRenderer + * + * $Id$ + * + * Created on 2:21:16 PM Jul 18, 2008. + * + * Copyright (C) 2008 Internet Archive. + * + * This file is part of wayback. + * + * wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package org.archive.wayback.archivalurl; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +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.replay.TextDocument; +import org.archive.wayback.replay.TextReplayRenderer; +import org.archive.wayback.replay.HttpHeaderProcessor; + +/** + * + * + * @author brad + * @version $Date$, $Revision$ + */ +public class ServerSideHTMLReplayRenderer extends TextReplayRenderer { + /** + * @param httpHeaderProcessor + */ + public ServerSideHTMLReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { + super(httpHeaderProcessor); + } + + /* (non-Javadoc) + * @see org.archive.wayback.replay.HTMLReplayRenderer#updatePage(org.archive.wayback.replay.HTMLPage, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.archive.wayback.core.WaybackRequest, org.archive.wayback.core.CaptureSearchResult, org.archive.wayback.core.Resource, org.archive.wayback.ResultURIConverter, org.archive.wayback.core.CaptureSearchResults) + */ + @Override + protected void updatePage(TextDocument page, HttpServletRequest httpRequest, + HttpServletResponse httpResponse, WaybackRequest wbRequest, + CaptureSearchResult result, Resource resource, + ResultURIConverter uriConverter, CaptureSearchResults results) + throws ServletException, IOException { + + List<String> jspInserts = getJspInserts(); + + StringBuilder toInsert = new StringBuilder(300); + + page.resolveAllPageUrls(); + if(jspInserts != null) { + Iterator<String> itr = jspInserts.iterator(); + while(itr.hasNext()) { + toInsert.append(page.includeJspString(itr.next(), httpRequest, + httpResponse, wbRequest, results, result, resource)); + } + } + + // insert the new content: + page.insertAtStartOfBody(toInsert.toString()); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2009-05-20 02:20:50
|
Revision: 2719 http://archive-access.svn.sourceforge.net/archive-access/?rev=2719&view=rev Author: bradtofel Date: 2009-05-20 02:20:42 +0000 (Wed, 20 May 2009) Log Message: ----------- FEATURE: Now parses archival URL flags (cs_, js_, im_) from the datespec of archival URLs, enabling better handling of specific content types based on how they are included in HTML pages: We no longer need rely on the mime type of pages to determine how we mark them up as they are replayed. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2009-05-20 02:18:23 UTC (rev 2718) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2009-05-20 02:20:42 UTC (rev 2719) @@ -42,6 +42,11 @@ * @version $Date$, $Revision$ */ public class ArchivalUrlRequestParser extends CompositeRequestParser { + public final static String FLAG_DELIM = "_"; + public final static String JS_CONTEXT = "js"; + public final static String CSS_CONTEXT = "cs"; + public final static String IMG_CONTEXT = "im"; + protected RequestParser[] getRequestParsers() { RequestParser[] theParsers = { new ReplayRequestParser(this), Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2009-05-20 02:18:23 UTC (rev 2718) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2009-05-20 02:20:42 UTC (rev 2719) @@ -27,6 +27,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.archive.wayback.archivalurl.ArchivalUrlRequestParser; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.requestparser.BaseRequestParser; import org.archive.wayback.requestparser.PathRequestParser; @@ -41,10 +42,11 @@ */ public class ReplayRequestParser extends PathRequestParser { /** - * Regex which parses Archival URL replay requests into timestamp + url + * Regex which parses Archival URL replay requests into: + * timestamp, flags, & url */ - private final Pattern WB_REQUEST_REGEX = Pattern - .compile("^(\\d{1,14})/(.*)$"); + public final static Pattern WB_REQUEST_REGEX = Pattern + .compile("^(\\d{1,14})(([a-z]{2}_)*)/(.*)$"); /** * @param wrapped @@ -60,7 +62,9 @@ if (matcher != null && matcher.matches()) { wbRequest = new WaybackRequest(); String dateStr = matcher.group(1); - urlStr = matcher.group(2); + urlStr = matcher.group(4); + String flags = matcher.group(2); + assignFlags(wbRequest,flags); // The logic of the classic WM wrt timestamp bounding: // if 14-digits are specified, assume min-max range boundaries @@ -71,6 +75,11 @@ String startDate = null; String endDate = null; + if (dateStr.length() == 12) { + // assume this is one of those old old alexa ARCs which has + // some 12-digit dates. Pad with "00"; + dateStr = dateStr.concat("00"); + } if (dateStr.length() == 14) { startDate = getEarliestTimestamp(); endDate = getLatestTimestamp(); @@ -100,4 +109,23 @@ return wbRequest; } + /** + * @param wbRequest + * @param flagsStr : "js_", "", "cs_", "cs_js_" + */ + private void assignFlags(WaybackRequest wbRequest, String flagsStr) { + if(flagsStr != null) { + String[] flags = flagsStr.split( + ArchivalUrlRequestParser.FLAG_DELIM); + for(String flag: flags) { + if(flag.equals(ArchivalUrlRequestParser.CSS_CONTEXT)) { + wbRequest.setCSSContext(true); + } else if(flag.equals(ArchivalUrlRequestParser.JS_CONTEXT)) { + wbRequest.setJSContext(true); + } else if(flag.equals(ArchivalUrlRequestParser.IMG_CONTEXT)) { + wbRequest.setIMGContext(true); + } + } + } + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2009-10-23 00:58:51
|
Revision: 2828 http://archive-access.svn.sourceforge.net/archive-access/?rev=2828&view=rev Author: bradtofel Date: 2009-10-23 00:58:43 +0000 (Fri, 23 Oct 2009) Log Message: ----------- FEATURE: now parses "charset detection mode" flag ("cm#_") to specify different strategies. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2009-10-23 00:46:31 UTC (rev 2827) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2009-10-23 00:58:43 UTC (rev 2828) @@ -46,6 +46,7 @@ public final static String JS_CONTEXT = "js"; public final static String CSS_CONTEXT = "cs"; public final static String IMG_CONTEXT = "im"; + public final static String CHARSET_MODE = "cm"; protected RequestParser[] getRequestParsers() { RequestParser[] theParsers = { Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2009-10-23 00:46:31 UTC (rev 2827) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2009-10-23 00:58:43 UTC (rev 2828) @@ -46,7 +46,7 @@ * timestamp, flags, & url */ public final static Pattern WB_REQUEST_REGEX = Pattern - .compile("^(\\d{1,14})(([a-z]{2}_)*)/(.*)$"); + .compile("^(\\d{1,14})(([a-z]{2}[0-9]*_)*)/(.*)$"); /** * @param wrapped @@ -124,6 +124,11 @@ wbRequest.setJSContext(true); } else if(flag.equals(ArchivalUrlRequestParser.IMG_CONTEXT)) { wbRequest.setIMGContext(true); + } else if(flag.startsWith(ArchivalUrlRequestParser.CHARSET_MODE)) { + String modeString = flag.substring( + ArchivalUrlRequestParser.CHARSET_MODE.length()); + int mode = Integer.parseInt(modeString); + wbRequest.setCharsetMode(mode); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2009-11-05 23:50:24
|
Revision: 2882 http://archive-access.svn.sourceforge.net/archive-access/?rev=2882&view=rev Author: bradtofel Date: 2009-11-05 23:50:17 +0000 (Thu, 05 Nov 2009) Log Message: ----------- INITIAL REV: SAX based, configurable server side rewriting of HTML content. Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java 2009-11-05 23:50:17 UTC (rev 2882) @@ -0,0 +1,52 @@ +/* ArchivalUrlContextResultURIConverterFactory + * + * $Id$: + * + * Created on Nov 5, 2009. + * + * Copyright (C) 2006 Internet Archive. + * + * This file is part of Wayback. + * + * Wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * Wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with Wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package org.archive.wayback.archivalurl; + +import org.archive.wayback.ResultURIConverter; +import org.archive.wayback.replay.html.ContextResultURIConverterFactory; + +/** + * @author brad + * + */ +public class ArchivalUrlContextResultURIConverterFactory + implements ContextResultURIConverterFactory { + private ArchivalUrlResultURIConverter converter = null; + public ArchivalUrlContextResultURIConverterFactory( + ArchivalUrlResultURIConverter converter) { + this.converter = converter; + } + /* (non-Javadoc) + * @see org.archive.wayback.replay.html.ContextResultURIConverterFactory#getContextConverter(java.lang.String) + */ + public ResultURIConverter getContextConverter(String flags) { + if(flags == null) { + return converter; + } + return new ArchivalUrlSpecialContextResultURIConverter(converter,flags); + } + +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java 2009-11-05 23:50:17 UTC (rev 2882) @@ -0,0 +1,174 @@ +/* ArchivalUrlSAXRewriteReplayRenderer + * + * $Id$ + * + * Created on 12:15:33 PM Feb 12, 2009. + * + * Copyright (C) 2009 Internet Archive. + * + * This file is part of wayback. + * + * wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package org.archive.wayback.archivalurl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Map; + +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.WaybackException; +import org.archive.wayback.replay.HttpHeaderOperation; +import org.archive.wayback.replay.HttpHeaderProcessor; +import org.archive.wayback.replay.JSPExecutor; +import org.archive.wayback.replay.charset.CharsetDetector; +import org.archive.wayback.replay.charset.StandardCharsetDetector; +import org.archive.wayback.replay.html.ReplayParseEventDelegator; +import org.archive.wayback.replay.html.ReplayParseContext; +import org.archive.wayback.util.htmllex.ContextAwareLexer; +import org.htmlparser.Node; +import org.htmlparser.lexer.Lexer; +import org.htmlparser.lexer.Page; +import org.htmlparser.util.ParserException; + +public class ArchivalUrlSAXRewriteReplayRenderer implements ReplayRenderer { + private ReplayParseEventDelegator delegator = null; + private HttpHeaderProcessor httpHeaderProcessor; + private CharsetDetector charsetDetector = new StandardCharsetDetector(); + private final static String OUTPUT_CHARSET = "utf-8"; + + public ArchivalUrlSAXRewriteReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { + this.httpHeaderProcessor = httpHeaderProcessor; + } + + // assume this is only called for appropriate doc types: html + public void renderResource(HttpServletRequest httpRequest, + HttpServletResponse httpResponse, WaybackRequest wbRequest, + CaptureSearchResult result, Resource resource, + ResultURIConverter uriConverter, CaptureSearchResults results) + throws ServletException, IOException, WaybackException { + + // copy the HTTP response code: + HttpHeaderOperation.copyHTTPMessageHeader(resource, httpResponse); + + // transform the original headers according to our headerProcessor: + Map<String,String> headers = HttpHeaderOperation.processHeaders( + resource, result, uriConverter, httpHeaderProcessor); + + // prepare several objects for the parse: + + // a JSPExecutor: + JSPExecutor jspExec = new JSPExecutor(uriConverter, httpRequest, + httpResponse, wbRequest, results, result, resource); + + // The URL of the page, for resolving in-page relative URLs: + URL url = null; + try { + url = new URL(result.getOriginalUrl()); + } catch (MalformedURLException e1) { + // TODO: this shouldn't happen... + throw new IOException(e1); + } + + // To make sure we get the length, we have to buffer it all up... + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + ArchivalUrlContextResultURIConverterFactory fact = + new ArchivalUrlContextResultURIConverterFactory( + (ArchivalUrlResultURIConverter) uriConverter); + // set up the context: + ReplayParseContext context = + new ReplayParseContext(fact,url,result.getCaptureTimestamp()); + context.setOutputCharset(OUTPUT_CHARSET); + context.setOutputStream(baos); + context.setJspExec(jspExec); + + // determine the character set used to encode the document bytes: + String charSet = charsetDetector.getCharset(resource, wbRequest); + + // and finally, parse, using the special lexer that knows how to + // handle javascript blocks containing unescaped HTML entities: + Page lexPage = new Page(resource,charSet); + ContextAwareLexer lex = new ContextAwareLexer(new Lexer(lexPage), + context); + Node node; + try { + while((node = lex.nextNode()) != null) { + delegator.handleNode(context, node); + } + delegator.handleParseComplete(context); + } catch (ParserException e) { + e.printStackTrace(); + throw new IOException(e); + } + + // At this point, baos contains the utf-8 encoded bytes of our result: + byte[] utf8Bytes = baos.toByteArray(); + // set the corrected length: + headers.put(HttpHeaderOperation.HTTP_LENGTH_HEADER, + String.valueOf(utf8Bytes.length)); + headers.put("X-Wayback-Guessed-Charset", charSet); + + // send back the headers: + HttpHeaderOperation.sendHeaders(headers, httpResponse); + // Tomcat will always send a charset... It's trying to be smarter than + // we are. If the original page didn't include a "charset" as part of + // the "Content-Type" HTTP header, then Tomcat will use the default.. + // who knows what that is, or what that will do to the page.. + // let's try explicitly setting it to what we used: + httpResponse.setCharacterEncoding(OUTPUT_CHARSET); + + httpResponse.getOutputStream().write(utf8Bytes); + } + + /** + * @return the charsetDetector + */ + public CharsetDetector getCharsetDetector() { + return charsetDetector; + } + + /** + * @param charsetDetector the charsetDetector to set + */ + public void setCharsetDetector(CharsetDetector charsetDetector) { + this.charsetDetector = charsetDetector; + } + + /** + * @return the delegator + */ + public ReplayParseEventDelegator getDelegator() { + return delegator; + } + + /** + * @param delegator the delegator to set + */ + public void setDelegator(ReplayParseEventDelegator delegator) { + this.delegator = delegator; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java 2009-11-05 23:50:17 UTC (rev 2882) @@ -0,0 +1,63 @@ +/* ArchivalUrlSpecialContextResultURIConverter + * + * $Id$ + * + * Created on 12:15:33 PM Feb 12, 2009. + * + * Copyright (C) 2009 Internet Archive. + * + * This file is part of wayback. + * + * wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package org.archive.wayback.archivalurl; + +import org.archive.wayback.ResultURIConverter; + +/** + * + * + * @author brad + * @version $Date$, $Revision$ + */ + +public class ArchivalUrlSpecialContextResultURIConverter +implements ResultURIConverter { + + + private String replayURIPrefix = null; + private String context; + + public ArchivalUrlSpecialContextResultURIConverter( + ArchivalUrlResultURIConverter converter, String context) { + replayURIPrefix = converter.getReplayURIPrefix(); + this.context = context; + } + + /* (non-Javadoc) + * @see org.archive.wayback.ResultURIConverter#makeReplayURI(java.lang.String, java.lang.String) + */ + public String makeReplayURI(String datespec, String url) { + String suffix = datespec + context + "/" + url; + if(replayURIPrefix == null) { + return suffix; + } else { + if(url.startsWith(replayURIPrefix)) { + return url; + } + return replayURIPrefix + suffix; + } + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2009-11-08 01:59:41
|
Revision: 2918 http://archive-access.svn.sourceforge.net/archive-access/?rev=2918&view=rev Author: bradtofel Date: 2009-11-08 01:59:29 +0000 (Sun, 08 Nov 2009) Log Message: ----------- JAVADOC: updated javadoc for public methods Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlJSReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDatePrefixQueryRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDateRangeQueryRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDatePrefixQueryRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDateRangeQueryRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlASXReplayRenderer.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -39,10 +39,14 @@ import org.archive.wayback.replay.TextReplayRenderer; import org.archive.wayback.replay.HttpHeaderProcessor; +/** + * @author brad + * + */ public class ArchivalUrlASXReplayRenderer extends TextReplayRenderer { /** - * @param httpHeaderProcessor + * @param httpHeaderProcessor which should process HTTP headers */ public ArchivalUrlASXReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { super(httpHeaderProcessor); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlCSSReplayRenderer.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -41,10 +41,16 @@ import org.archive.wayback.replay.TextReplayRenderer; import org.archive.wayback.replay.HttpHeaderProcessor; +/** + * ReplayRenderer which attempts to rewrite URLs found within a text/css + * document to load from this context. + * @author brad + * + */ public class ArchivalUrlCSSReplayRenderer extends TextReplayRenderer { /** - * @param httpHeaderProcessor + * @param httpHeaderProcessor which should process HTTP headers */ public ArchivalUrlCSSReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { super(httpHeaderProcessor); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlContextResultURIConverterFactory.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -29,12 +29,17 @@ import org.archive.wayback.replay.html.ContextResultURIConverterFactory; /** + * Factory which creates a context specific ArchivalUrlResultURIConverter, + * given a base ArchivalUrlResultURIConverter and the flags to add. * @author brad * */ public class ArchivalUrlContextResultURIConverterFactory implements ContextResultURIConverterFactory { private ArchivalUrlResultURIConverter converter = null; + /** + * @param converter base ArchivalURLURLConverter to wrap + */ public ArchivalUrlContextResultURIConverterFactory( ArchivalUrlResultURIConverter converter) { this.converter = converter; Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlJSReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlJSReplayRenderer.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlJSReplayRenderer.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -45,15 +45,17 @@ import org.archive.wayback.util.Timestamp; /** + * ReplayRenderer which attempts to rewrite absolute URLs within a + * text/javascript document to make them load correctly from an ArchivalURL + * AccessPoint. * - * * @author brad * @version $Date$, $Revision$ */ public class ArchivalUrlJSReplayRenderer extends TextReplayRenderer { /** - * @param httpHeaderProcessor + * @param httpHeaderProcessor which should process HTTP headers */ public ArchivalUrlJSReplayRenderer( HttpHeaderProcessor httpHeaderProcessor) { Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -42,10 +42,26 @@ * @version $Date$, $Revision$ */ public class ArchivalUrlRequestParser extends CompositeRequestParser { + /** + * delimiter character for datespec flags + */ public final static String FLAG_DELIM = "_"; + /** + * text/javascript context + */ public final static String JS_CONTEXT = "js"; + /** + * text/css context + */ public final static String CSS_CONTEXT = "cs"; + /** + * image/* context + */ public final static String IMG_CONTEXT = "im"; + /** + * Charset detection strategy context - should be followed by an integer + * indicating which strategy to use + */ public final static String CHARSET_MODE = "cm"; protected RequestParser[] getRequestParsers() { Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSAXRewriteReplayRenderer.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -54,12 +54,22 @@ import org.htmlparser.lexer.Page; import org.htmlparser.util.ParserException; +/** + * ReplayRenderer which attempts to rewrite text/html documents so URLs + * references within the document load from the correct ArchivalURL AccessPoint. + * + * @author brad + * + */ public class ArchivalUrlSAXRewriteReplayRenderer implements ReplayRenderer { private ReplayParseEventDelegator delegator = null; private HttpHeaderProcessor httpHeaderProcessor; private CharsetDetector charsetDetector = new StandardCharsetDetector(); private final static String OUTPUT_CHARSET = "utf-8"; + /** + * @param httpHeaderProcessor which should process HTTP headers + */ public ArchivalUrlSAXRewriteReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { this.httpHeaderProcessor = httpHeaderProcessor; } Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlSpecialContextResultURIConverter.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -27,8 +27,9 @@ import org.archive.wayback.ResultURIConverter; /** + * wrapper around an ArchivalUrlResultURIConverter, adding flags after the + * datespec for a specific context ("js_" for javascript, "cs_" for CSS, etc) * - * * @author brad * @version $Date$, $Revision$ */ @@ -40,6 +41,11 @@ private String replayURIPrefix = null; private String context; + /** + * @param converter ArchivalUrlResultURIConverter to wrap + * @param context flags indicating the context of URLs created by this + * object + */ public ArchivalUrlSpecialContextResultURIConverter( ArchivalUrlResultURIConverter converter, String context) { replayURIPrefix = converter.getReplayURIPrefix(); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ClientSideHTMLReplayRenderer.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -42,14 +42,16 @@ import org.archive.wayback.replay.HttpHeaderProcessor; /** + * Classic ReplayRenderer which uses a combination of server-side modification + * and embedded javascript to rewrite URLs within an HTML page to make embedded + * URLs point back to a specific ArchivalURL AccessPoint. * - * * @author brad * @version $Date$, $Revision$ */ public class ClientSideHTMLReplayRenderer extends TextReplayRenderer { /** - * @param httpHeaderProcessor + * @param httpHeaderProcessor which should process HTTP headers */ public ClientSideHTMLReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { super(httpHeaderProcessor); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ServerSideHTMLReplayRenderer.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -42,14 +42,15 @@ import org.archive.wayback.replay.HttpHeaderProcessor; /** + * ArchivalUrl ReplayRenderer which uses a series of RegEx's to rewrite embedded + * URLs to point back into a specific ArchivalUrl AccessPoint. * - * * @author brad * @version $Date$, $Revision$ */ public class ServerSideHTMLReplayRenderer extends TextReplayRenderer { /** - * @param httpHeaderProcessor + * @param httpHeaderProcessor which should process HTTP headers */ public ServerSideHTMLReplayRenderer(HttpHeaderProcessor httpHeaderProcessor) { super(httpHeaderProcessor); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDatePrefixQueryRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDatePrefixQueryRequestParser.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDatePrefixQueryRequestParser.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -41,7 +41,7 @@ */ public class PathDatePrefixQueryRequestParser extends PathRequestParser { /** - * @param wrapped + * @param wrapped BaseRequestParser which provides general configuration */ public PathDatePrefixQueryRequestParser(BaseRequestParser wrapped) { super(wrapped); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDateRangeQueryRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDateRangeQueryRequestParser.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathDateRangeQueryRequestParser.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -42,7 +42,7 @@ public class PathDateRangeQueryRequestParser extends PathRequestParser { /** - * @param wrapped + * @param wrapped BaseRequestParser which provides general configuration */ public PathDateRangeQueryRequestParser(BaseRequestParser wrapped) { super(wrapped); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDatePrefixQueryRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDatePrefixQueryRequestParser.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDatePrefixQueryRequestParser.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -41,7 +41,7 @@ */ public class PathPrefixDatePrefixQueryRequestParser extends PathRequestParser { /** - * @param wrapped + * @param wrapped BaseRequestParser which provides general configuration */ public PathPrefixDatePrefixQueryRequestParser(BaseRequestParser wrapped) { super(wrapped); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDateRangeQueryRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDateRangeQueryRequestParser.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/PathPrefixDateRangeQueryRequestParser.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -41,7 +41,7 @@ */ public class PathPrefixDateRangeQueryRequestParser extends PathRequestParser { /** - * @param wrapped + * @param wrapped BaseRequestParser which provides general configuration */ public PathPrefixDateRangeQueryRequestParser(BaseRequestParser wrapped) { super(wrapped); Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2009-11-08 01:33:37 UTC (rev 2917) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2009-11-08 01:59:29 UTC (rev 2918) @@ -49,7 +49,7 @@ .compile("^(\\d{1,14})(([a-z]{2}[0-9]*_)*)/(.*)$"); /** - * @param wrapped + * @param wrapped BaseRequestParser which provides general configuration */ public ReplayRequestParser(BaseRequestParser wrapped) { super(wrapped); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2010-04-27 22:06:36
|
Revision: 3073 http://archive-access.svn.sourceforge.net/archive-access/?rev=3073&view=rev Author: bradtofel Date: 2010-04-27 22:06:30 +0000 (Tue, 27 Apr 2010) Log Message: ----------- INITIAL REV: new Archival URL RequestParser component implementation, which allows requests without a datespec, and redirects the client to a replay request for the supplied URL, for the current timestamp Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/DatelessReplayRequestParser.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2010-04-27 22:03:42 UTC (rev 3072) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2010-04-27 22:06:30 UTC (rev 3073) @@ -25,6 +25,7 @@ package org.archive.wayback.archivalurl; import org.archive.wayback.RequestParser; +import org.archive.wayback.archivalurl.requestparser.DatelessReplayRequestParser; import org.archive.wayback.archivalurl.requestparser.PathDatePrefixQueryRequestParser; import org.archive.wayback.archivalurl.requestparser.PathDateRangeQueryRequestParser; import org.archive.wayback.archivalurl.requestparser.PathPrefixDatePrefixQueryRequestParser; @@ -76,7 +77,8 @@ new PathPrefixDatePrefixQueryRequestParser(this), new PathPrefixDateRangeQueryRequestParser(this), new OpenSearchRequestParser(this), - new FormRequestParser(this) + new FormRequestParser(this), + new DatelessReplayRequestParser(this) }; return theParsers; } Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/DatelessReplayRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/DatelessReplayRequestParser.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/DatelessReplayRequestParser.java 2010-04-27 22:06:30 UTC (rev 3073) @@ -0,0 +1,106 @@ +/* DatelessReplayRequestParser + * + * $Id$: + * + * Created on Apr 26, 2010. + * + * Copyright (C) 2006 Internet Archive. + * + * This file is part of Wayback. + * + * Wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * Wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with Wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package org.archive.wayback.archivalurl.requestparser; + +import java.net.MalformedURLException; +import java.net.URL; + +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.PathRequestParser; +import org.archive.wayback.util.Timestamp; +import org.archive.wayback.util.url.UrlOperations; +import org.archive.wayback.webapp.AccessPoint; + + +/** + * @author brad + * + */ +public class DatelessReplayRequestParser extends PathRequestParser { + + /** + * @param wrapped the BaseRequestParser being wrapped + */ + public DatelessReplayRequestParser(BaseRequestParser wrapped) { + super(wrapped); + } + + public WaybackRequest parse(String requestPath, AccessPoint accessPoint) + throws BetterRequestException, BadQueryException { + /* + * + * We're trying to catch requests without a datespec, in which case, + * we just redirect to the same request, inserting today's datespec, + * and then we'll let the normal redirection occur. + * + * The one tricky point is that we don't want to defeat the + * server-relative redirection handling, so we want to do some + * inspection to make sure it actually looks like an URL, and not like: + * + * images/foo.gif + * redirect.php?blargity=blargblarg + * + * What would be perfect is if the user supplied http:// at the front. + * + * So, we'll assume that if we see that, we either match, or throw a + * BadQueryException. + * + */ + + String scheme = UrlOperations.urlToScheme(requestPath); + if(scheme == null) { + try { + URL u = new URL(UrlOperations.HTTP_SCHEME + requestPath); + // does the authority look legit? + if(u.getUserInfo() != null) { + throw new BadQueryException("Unable to handle URLs with user information"); + } + if(UrlOperations.isAuthority(u.getAuthority())) { + // ok, we're going to assume this is good: + String nowTS = Timestamp.currentTimestamp().getDateStr(); + String newUrl = + accessPoint.getUriConverter().makeReplayURI(nowTS, requestPath); + throw new BetterRequestException(newUrl); + } + } catch(MalformedURLException e) { + // eat it silently + } + } else { + // OK, we're going to assume this is a replay request, sans timestamp, + // ALWAYS redirect: + + String nowTS = Timestamp.currentTimestamp().getDateStr(); + String newUrl = + accessPoint.getUriConverter().makeReplayURI(nowTS, requestPath); + throw new BetterRequestException(newUrl); + } + return null; + } + +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/DatelessReplayRequestParser.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2010-06-05 01:20:22
|
Revision: 3151 http://archive-access.svn.sourceforge.net/archive-access/?rev=3151&view=rev Author: bradtofel Date: 2010-06-05 01:20:16 +0000 (Sat, 05 Jun 2010) Log Message: ----------- Started refactoring some common ArchivalUrl code into it's own class: ArchivalUrl (finally!!) subclassed FormRequestParser, with specialized ArchivalUrl version, which just throws a BetterRequestException to bounce the user to a "prettier" form of their request. Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java Added Paths: ----------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ArchivalUrlFormRequestParser.java Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java 2010-06-05 01:20:16 UTC (rev 3151) @@ -0,0 +1,95 @@ +/* ArchivalUrl + * + * $Id$: + * + * Created on Jun 4, 2010. + * + * Copyright (C) 2006 Internet Archive. + * + * This file is part of Wayback. + * + * Wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * Wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with Wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package org.archive.wayback.archivalurl; + +import org.archive.wayback.core.WaybackRequest; +import org.archive.wayback.util.url.UrlOperations; + +/** + * @author brad + * + */ +public class ArchivalUrl { + public final static String STAR = "*"; + private WaybackRequest wbRequest; +// public ArchivalUrl(String path) { +// +// } + public ArchivalUrl(WaybackRequest wbRequest) { + this.wbRequest = wbRequest; + } + + public String toString() { + if(wbRequest.isReplayRequest()) { + return toReplayString(wbRequest.getRequestUrl()); + } else if(wbRequest.isCaptureQueryRequest()) { + return toQueryString(wbRequest.getRequestUrl()); + } + return toPrefixQueryString(wbRequest.getRequestUrl()); + } + public String toPrefixQueryString(String url) { + return toQueryString("url" + STAR); + } + public String toQueryString(String url) { + String datespec = STAR; + if((wbRequest.getStartTimestamp() != null) && + (wbRequest.getEndTimestamp() != null)) { + datespec = String.format("%s-%s%s", + wbRequest.getStartTimestamp(),wbRequest.getEndTimestamp(), + STAR); + } + return toString(datespec,url); + } + + public String toReplayString(String url) { + return toString(wbRequest.getReplayTimestamp(),url); + } + + public String toString(String datespec, String url) { + StringBuilder sb = + new StringBuilder(url.length() + datespec.length()+10); + sb.append(datespec); + if(wbRequest.isCSSContext()) { + sb.append(ArchivalUrlRequestParser.CSS_CONTEXT); + sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + } + if(wbRequest.isJSContext()) { + sb.append(ArchivalUrlRequestParser.JS_CONTEXT); + sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + } + if(wbRequest.isIMGContext()) { + sb.append(ArchivalUrlRequestParser.IMG_CONTEXT); + sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + } + if(wbRequest.isIdentityContext()) { + sb.append(ArchivalUrlRequestParser.IDENTITY_CONTEXT); + sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + } + sb.append("/"); + sb.append(UrlOperations.stripDefaultPortFromUrl(url)); + return sb.toString(); + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2010-06-05 01:16:53 UTC (rev 3150) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2010-06-05 01:20:16 UTC (rev 3151) @@ -25,6 +25,7 @@ package org.archive.wayback.archivalurl; import org.archive.wayback.RequestParser; +import org.archive.wayback.archivalurl.requestparser.ArchivalUrlFormRequestParser; import org.archive.wayback.archivalurl.requestparser.DatelessReplayRequestParser; import org.archive.wayback.archivalurl.requestparser.PathDatePrefixQueryRequestParser; import org.archive.wayback.archivalurl.requestparser.PathDateRangeQueryRequestParser; @@ -77,7 +78,7 @@ new PathPrefixDatePrefixQueryRequestParser(this), new PathPrefixDateRangeQueryRequestParser(this), new OpenSearchRequestParser(this), - new FormRequestParser(this), + new ArchivalUrlFormRequestParser(this), new DatelessReplayRequestParser(this) }; return theParsers; Added: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ArchivalUrlFormRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ArchivalUrlFormRequestParser.java (rev 0) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ArchivalUrlFormRequestParser.java 2010-06-05 01:20:16 UTC (rev 3151) @@ -0,0 +1,73 @@ +/* ArchivalUrlFormRequestParser + * + * $Id$: + * + * Created on Jun 4, 2010. + * + * Copyright (C) 2006 Internet Archive. + * + * This file is part of Wayback. + * + * Wayback is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * any later version. + * + * Wayback is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with Wayback; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package org.archive.wayback.archivalurl.requestparser; + +import javax.servlet.http.HttpServletRequest; + +import org.archive.wayback.archivalurl.ArchivalUrl; +import org.archive.wayback.core.WaybackRequest; +import org.archive.wayback.exception.BetterRequestException; +import org.archive.wayback.requestparser.BaseRequestParser; +import org.archive.wayback.requestparser.FormRequestParser; +import org.archive.wayback.webapp.AccessPoint; + +/** + * @author brad + * + */ +public class ArchivalUrlFormRequestParser extends FormRequestParser { + /** + * @param wrapped BaseRequestParser to wrap + */ + public ArchivalUrlFormRequestParser(BaseRequestParser wrapped) { + super(wrapped); + } + public WaybackRequest parse(HttpServletRequest httpRequest, + AccessPoint accessPoint) throws BetterRequestException { + WaybackRequest wbRequest = super.parse(httpRequest, accessPoint); + if(wbRequest != null) { + String replayTimestamp = wbRequest.getReplayTimestamp(); + if((replayTimestamp != null) && replayTimestamp.length() == 0) { + // lets call it a star query: + // TODO: should we clone? + wbRequest.setStartTimestamp(null); + wbRequest.setEndTimestamp(null); + } + String requestPath = + accessPoint.translateRequestPathQuery(httpRequest); + ArchivalUrl aUrl = new ArchivalUrl(wbRequest); + String bestPath = aUrl.toString(); + if(!bestPath.equals(requestPath)) { + String betterURI = (wbRequest.isReplayRequest() ? + accessPoint.getReplayPrefix() : + accessPoint.getQueryPrefix()) + + bestPath; + throw new BetterRequestException(betterURI); + } + } + return wbRequest; + } +} Property changes on: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ArchivalUrlFormRequestParser.java ___________________________________________________________________ Added: svn:keywords + Author Date Revision Id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bra...@us...> - 2011-05-25 01:37:54
|
Revision: 3452 http://archive-access.svn.sourceforge.net/archive-access/?rev=3452&view=rev Author: bradtofel Date: 2011-05-25 01:37:48 +0000 (Wed, 25 May 2011) Log Message: ----------- REFACTOR: moved flag assignment and parsing code into ArchivalUrl Modified Paths: -------------- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlDateRedirectReplayRenderer.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java 2011-05-25 01:37:10 UTC (rev 3451) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrl.java 2011-05-25 01:37:48 UTC (rev 3452) @@ -61,37 +61,106 @@ public String toReplayString(String url) { return toString(wbRequest.getReplayTimestamp(),url); } + public String getDateSpec() { + return getDateSpec(wbRequest.getReplayTimestamp()); + } - public String toString(String datespec, String url) { + /** + * Given a date, create a new datespec + flags + * which represent the same options as requested by the WaybackRequest + * @param timestamp the 14-digit timestamp to use + * @return a String representing the flags on the WaybackRequest for the + * specified date + */ + public String getDateSpec(String datespec) { int dateLen = 0; if(datespec != null) { dateLen = datespec.length(); } StringBuilder sb = - new StringBuilder(url.length() + dateLen +10); + new StringBuilder(dateLen +10); if(dateLen > 0) { sb.append(datespec); } + if(wbRequest.isCSSContext()) { sb.append(ArchivalUrlRequestParser.CSS_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + dateLen++; } if(wbRequest.isJSContext()) { sb.append(ArchivalUrlRequestParser.JS_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + dateLen++; } if(wbRequest.isIMGContext()) { sb.append(ArchivalUrlRequestParser.IMG_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + dateLen++; } if(wbRequest.isIdentityContext()) { sb.append(ArchivalUrlRequestParser.IDENTITY_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + dateLen++; } - if(dateLen > 0) { + if(wbRequest.isIFrameWrapperContext()) { + sb.append(ArchivalUrlRequestParser.IFRAME_WRAPPED_CONTEXT); + sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + dateLen++; + } + if(wbRequest.isFrameWrapperContext()) { + sb.append(ArchivalUrlRequestParser.FRAME_WRAPPED_CONTEXT); + sb.append(ArchivalUrlRequestParser.FLAG_DELIM); + dateLen++; + } + return sb.toString(); + } + + public String toString(String datespec, String url) { + int dateLen = 0; + if(datespec != null) { + dateLen = datespec.length(); + } + StringBuilder sb = + new StringBuilder(url.length() + dateLen +10); + String dateSpec = getDateSpec(datespec); + sb.append(dateSpec); + if(dateSpec.length() > 0) { sb.append("/"); } sb.append(UrlOperations.stripDefaultPortFromUrl(url)); return sb.toString(); } + + /** + * @param wbRequest + * @param flagsStr : "js_", "", "cs_", "cs_js_" + */ + public static void assignFlags(WaybackRequest wbRequest, String flagsStr) { + if(flagsStr != null) { + String[] flags = flagsStr.split( + ArchivalUrlRequestParser.FLAG_DELIM); + for(String flag: flags) { + if(flag.equals(ArchivalUrlRequestParser.CSS_CONTEXT)) { + wbRequest.setCSSContext(true); + } else if(flag.equals(ArchivalUrlRequestParser.JS_CONTEXT)) { + wbRequest.setJSContext(true); + } else if(flag.equals(ArchivalUrlRequestParser.IMG_CONTEXT)) { + wbRequest.setIMGContext(true); + } else if(flag.equals(ArchivalUrlRequestParser.IDENTITY_CONTEXT)) { + wbRequest.setIdentityContext(true); + } else if(flag.equals(ArchivalUrlRequestParser.FRAME_WRAPPED_CONTEXT)) { + wbRequest.setFrameWrapperContext(true); + } else if(flag.equals(ArchivalUrlRequestParser.IFRAME_WRAPPED_CONTEXT)) { + wbRequest.setIFrameWrapperContext(true); + } else if(flag.startsWith(ArchivalUrlRequestParser.CHARSET_MODE)) { + String modeString = flag.substring( + ArchivalUrlRequestParser.CHARSET_MODE.length()); + int mode = Integer.parseInt(modeString); + wbRequest.setCharsetMode(mode); + } + } + } + } + } Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlDateRedirectReplayRenderer.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlDateRedirectReplayRenderer.java 2011-05-25 01:37:10 UTC (rev 3451) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlDateRedirectReplayRenderer.java 2011-05-25 01:37:48 UTC (rev 3452) @@ -52,41 +52,9 @@ // redirect to the better version: String url = result.getOriginalUrl(); - String captureDate = makeFlagDateSpec( - result.getCaptureTimestamp(),wbRequest); - - String betterURI = uriConverter.makeReplayURI(captureDate,url); + ArchivalUrl aUrl = new ArchivalUrl(wbRequest); + String dateSpec = aUrl.getDateSpec(result.getCaptureTimestamp()); + String betterURI = uriConverter.makeReplayURI(dateSpec,url); httpResponse.sendRedirect(betterURI); } - - /** - * Given a date, and a WaybackRequest object, create a new datespec + flags - * which represent the same options as requested by the WaybackRequest - * @param timestamp the 14-digit timestamp to use - * @param request the WaybackRequest from which o get extra request option - * flags - * @return a String representing the flags on the WaybackRequest for the - * specified date - */ - public static String makeFlagDateSpec(String timestamp, WaybackRequest request) { - StringBuilder sb = new StringBuilder(); - sb.append(timestamp); - if(request.isCSSContext()) { - sb.append(ArchivalUrlRequestParser.CSS_CONTEXT); - sb.append(ArchivalUrlRequestParser.FLAG_DELIM); - } - if(request.isJSContext()) { - sb.append(ArchivalUrlRequestParser.JS_CONTEXT); - sb.append(ArchivalUrlRequestParser.FLAG_DELIM); - } - if(request.isIMGContext()) { - sb.append(ArchivalUrlRequestParser.IMG_CONTEXT); - sb.append(ArchivalUrlRequestParser.FLAG_DELIM); - } - if(request.isIdentityContext()) { - sb.append(ArchivalUrlRequestParser.IDENTITY_CONTEXT); - sb.append(ArchivalUrlRequestParser.FLAG_DELIM); - } - return sb.toString(); - } } Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2011-05-25 01:37:10 UTC (rev 3451) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/ArchivalUrlRequestParser.java 2011-05-25 01:37:48 UTC (rev 3452) @@ -60,6 +60,14 @@ */ public final static String IDENTITY_CONTEXT = "id"; /** + * frame-wrapper context + */ + public final static String FRAME_WRAPPED_CONTEXT = "fw"; + /** + * iframe-wrapped context + */ + public final static String IFRAME_WRAPPED_CONTEXT = "if"; + /** * Charset detection strategy context - should be followed by an integer * indicating which strategy to use */ Modified: trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java =================================================================== --- trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2011-05-25 01:37:10 UTC (rev 3451) +++ trunk/archive-access/projects/wayback/wayback-core/src/main/java/org/archive/wayback/archivalurl/requestparser/ReplayRequestParser.java 2011-05-25 01:37:48 UTC (rev 3452) @@ -22,6 +22,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.archive.wayback.archivalurl.ArchivalUrl; import org.archive.wayback.archivalurl.ArchivalUrlRequestParser; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.exception.BetterRequestException; @@ -62,7 +63,7 @@ String dateStr = matcher.group(1); urlStr = matcher.group(4); String flags = matcher.group(2); - assignFlags(wbRequest,flags); + ArchivalUrl.assignFlags(wbRequest,flags); // The logic of the classic WM wrt timestamp bounding: // if 14-digits are specified, assume min-max range boundaries @@ -134,30 +135,5 @@ return wbRequest; } - /** - * @param wbRequest - * @param flagsStr : "js_", "", "cs_", "cs_js_" - */ - private void assignFlags(WaybackRequest wbRequest, String flagsStr) { - if(flagsStr != null) { - String[] flags = flagsStr.split( - ArchivalUrlRequestParser.FLAG_DELIM); - for(String flag: flags) { - if(flag.equals(ArchivalUrlRequestParser.CSS_CONTEXT)) { - wbRequest.setCSSContext(true); - } else if(flag.equals(ArchivalUrlRequestParser.JS_CONTEXT)) { - wbRequest.setJSContext(true); - } else if(flag.equals(ArchivalUrlRequestParser.IMG_CONTEXT)) { - wbRequest.setIMGContext(true); - } else if(flag.equals(ArchivalUrlRequestParser.IDENTITY_CONTEXT)) { - wbRequest.setIdentityContext(true); - } else if(flag.startsWith(ArchivalUrlRequestParser.CHARSET_MODE)) { - String modeString = flag.substring( - ArchivalUrlRequestParser.CHARSET_MODE.length()); - int mode = Integer.parseInt(modeString); - wbRequest.setCharsetMode(mode); - } - } - } - } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |