You can subscribe to this list here.
2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(10) |
Sep
(36) |
Oct
(339) |
Nov
(103) |
Dec
(152) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(141) |
Feb
(102) |
Mar
(125) |
Apr
(203) |
May
(57) |
Jun
(30) |
Jul
(139) |
Aug
(46) |
Sep
(64) |
Oct
(105) |
Nov
(34) |
Dec
(162) |
2007 |
Jan
(81) |
Feb
(57) |
Mar
(141) |
Apr
(72) |
May
(9) |
Jun
(1) |
Jul
(144) |
Aug
(88) |
Sep
(40) |
Oct
(43) |
Nov
(34) |
Dec
(20) |
2008 |
Jan
(44) |
Feb
(45) |
Mar
(16) |
Apr
(36) |
May
(8) |
Jun
(77) |
Jul
(177) |
Aug
(66) |
Sep
(8) |
Oct
(33) |
Nov
(13) |
Dec
(37) |
2009 |
Jan
(2) |
Feb
(5) |
Mar
(8) |
Apr
|
May
(36) |
Jun
(19) |
Jul
(46) |
Aug
(8) |
Sep
(1) |
Oct
(66) |
Nov
(61) |
Dec
(10) |
2010 |
Jan
(13) |
Feb
(16) |
Mar
(38) |
Apr
(76) |
May
(47) |
Jun
(32) |
Jul
(35) |
Aug
(45) |
Sep
(20) |
Oct
(61) |
Nov
(24) |
Dec
(16) |
2011 |
Jan
(22) |
Feb
(34) |
Mar
(11) |
Apr
(8) |
May
(24) |
Jun
(23) |
Jul
(11) |
Aug
(42) |
Sep
(81) |
Oct
(48) |
Nov
(21) |
Dec
(20) |
2012 |
Jan
(30) |
Feb
(25) |
Mar
(4) |
Apr
(6) |
May
(1) |
Jun
(5) |
Jul
(5) |
Aug
(8) |
Sep
(6) |
Oct
(6) |
Nov
|
Dec
|
From: Brad <bra...@us...> - 2005-10-18 02:31:09
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/localresourcestore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/java/org/archive/wayback/localresourcestore Added Files: LocalARCResourceStore.java Log Message: Initial check-in -- pre code review --- NEW FILE: LocalARCResourceStore.java --- package org.archive.wayback.localresourcestore; import java.io.File; import java.io.IOException; import java.util.Properties; import org.archive.io.arc.ARCLocation; import org.archive.io.arc.ARCReader; import org.archive.io.arc.ARCReaderFactory; import org.archive.wayback.ResourceStore; import org.archive.wayback.core.Resource; public class LocalARCResourceStore implements ResourceStore { private static final String RESOURCE_PATH = "resourcestore.arcpath"; private static final String ARCTAIL = ".arc.gz"; private String path = null; public LocalARCResourceStore() { super(); // TODO Auto-generated constructor stub } public void init(Properties p) throws Exception { String configPath = (String) p.get(RESOURCE_PATH); if ((configPath == null) || (configPath.length() < 1)) { throw new IllegalArgumentException("Failed to find " + RESOURCE_PATH); } path = configPath; } public Resource retrieveResource(ARCLocation location) throws IOException { String arcName = location.getName(); if (!arcName.endsWith(ARCTAIL)) { arcName += ARCTAIL; } File arcFile = new File(arcName); if (!arcFile.isAbsolute()) { arcFile = new File(this.path, arcName); } if (!arcFile.exists() || !arcFile.canRead()) { throw new IOException("Cannot find ARC file (" + arcFile.getAbsolutePath() + ")"); } else { ARCReader reader = ARCReaderFactory.get(arcFile); Resource r = new Resource(reader.get(location.getOffset())); return r; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } |
From: Brad <bra...@us...> - 2005-10-18 02:31:09
|
Update of /cvsroot/archive-access/archive-access/projects/wayback In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483 Added Files: .classpath .tomcatplugin .project .cvsignore Log Message: Initial check-in -- pre code review --- NEW FILE: .cvsignore --- work --- NEW FILE: .project --- <?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>wayback</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jdt.core.javanature</nature> <nature>com.sysdeo.eclipse.tomcat.tomcatnature</nature> </natures> </projectDescription> --- NEW FILE: .tomcatplugin --- <?xml version="1.0" encoding="UTF-8"?> <tomcatProjectProperties> <rootDir>/src/webapp</rootDir> <exportSource>false</exportSource> <reloadable>true</reloadable> <redirectLogger>false</redirectLogger> <updateXml>true</updateXml> <warLocation></warLocation> <extraInfo></extraInfo> <webPath>/wayback</webPath> </tomcatProjectProperties> --- NEW FILE: .classpath --- <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="var" path="TOMCAT_HOME/common/lib/servlet-api.jar"/> <classpathentry kind="var" path="TOMCAT_HOME/common/lib/jasper-runtime.jar"/> <classpathentry kind="var" path="TOMCAT_HOME/common/lib/jsp-api.jar"/> <classpathentry kind="src" path="src/java"/> <classpathentry kind="src" path="/ArchiveOpenCrawler"/> <classpathentry kind="lib" path="/ArchiveOpenCrawler/lib/je-2.0.54.jar"/> <classpathentry kind="lib" path="/wb/src/webapp/WEB-INF/lib/commons-httpclient-3.0-beta1.jar"/> <classpathentry kind="output" path="src/webapp/WEB-INF/classes"/> </classpath> |
From: Brad <bra...@us...> - 2005-10-18 02:31:09
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/rawreplayui In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/java/org/archive/wayback/rawreplayui Added Files: RawReplayUI.java Log Message: Initial check-in -- pre code review --- NEW FILE: RawReplayUI.java --- package org.archive.wayback.rawreplayui; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.ParseException; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.URIException; import org.archive.io.arc.ARCRecord; import org.archive.net.UURI; import org.archive.net.UURIFactory; import org.archive.wayback.ReplayUI; import org.archive.wayback.RequestParser; import org.archive.wayback.ResourceIndex; import org.archive.wayback.ResourceStore; import org.archive.wayback.core.Resource; import org.archive.wayback.core.ResourceResult; import org.archive.wayback.core.ResourceResults; import org.archive.wayback.core.Timestamp; import org.archive.wayback.core.WMRequest; import org.archive.wayback.core.WaybackLogic; import org.archive.wayback.exception.WaybackException; public class RawReplayUI implements ReplayUI, RequestParser { private final static String JSP_PATH = "replayui.jsppath"; private final Pattern WB_REQUEST_REGEX = Pattern .compile("^/(\\d{1,14})/(.*)$"); private String jspPath = null; public RawReplayUI() { super(); // TODO Auto-generated constructor stub } public void init(Properties p) throws IOException { this.jspPath = (String) p.get(JSP_PATH); if (this.jspPath == null || this.jspPath.length() <= 0) { throw new IllegalArgumentException("Failed to find " + JSP_PATH); } } public String makeReplayURI(final HttpServletRequest request, ResourceResult result) { String protocol = "http"; String serverName = request.getServerName(); int serverPort = request.getServerPort(); String context = request.getContextPath(); return protocol + "://" + serverName + (serverPort == 80 ? "" : ":" + serverPort) + context + "/" + result.getTimestamp().getDateStr() + "/" + result.getUrl(); } public WMRequest parseRequest(HttpServletRequest request) { WMRequest wmRequest = null; Matcher matcher = null; String origRequestPath = request.getRequestURI(); String contextPath = request.getContextPath(); if (!origRequestPath.startsWith(contextPath)) { return null; } String requestPath = origRequestPath.substring(contextPath.length()); matcher = WB_REQUEST_REGEX.matcher(requestPath); if (matcher != null && matcher.matches()) { wmRequest = new WMRequest(); String dateStr = matcher.group(1); String urlStr = matcher.group(2); if (!urlStr.startsWith("http://")) { // HACKHACK: attempt to fixup with REFERER int firstSlashPos = urlStr.indexOf('/'); if (-1 != firstSlashPos) { String maybeHost = urlStr.substring(0, firstSlashPos); if (-1 == maybeHost.indexOf('.')) { // no . in hostname -- lets assume that this is a // server-relative path: String referer = request.getHeader("REFERER"); if (referer != null) { UURI refererURI = null; try { refererURI = UURIFactory.getInstance(referer); UURI resolvedURI = refererURI.resolve(urlStr); wmRequest.setRedirectURI(resolvedURI); return wmRequest; } catch (URIException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } urlStr = "http://" + urlStr; } wmRequest.setExactDateRequest(dateStr); try { wmRequest.setExactTimestamp(Timestamp.parseBefore(dateStr)); wmRequest.setStartTimestamp(Timestamp.earliestTimestamp()); wmRequest.setEndTimestamp(Timestamp.latestTimestamp()); } catch (ParseException e1) { e1.printStackTrace(); return null; } wmRequest.setRetrieval(); try { UURI requestURI = UURIFactory.getInstance(urlStr); wmRequest.setRequestURI(requestURI); } catch (URIException e) { wmRequest = null; } } return wmRequest; } public void handle(final WaybackLogic wayback, WMRequest wmRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO Auto-generated method stub ResourceResults results; ResourceIndex idx = wayback.getResourceIndex(); ResourceStore store = wayback.getResourceStore(); try { results = idx.query(wmRequest); } catch (IOException e) { showIndexNotAvailable(wmRequest, request, response, e.getMessage()); e.printStackTrace(); return; } catch (WaybackException e) { showWaybackException(wmRequest, request, response, e.getMessage()); e.printStackTrace(); return; } Resource resource; ResourceResult closest = null; if (results.isEmpty()) { // if (liveWeb != null) { // try { // resource = liveWeb.retrieveResource(wmRequest); // } catch (IOException e) { // replayUI.showNotInArchive(wmRequest, response); // return; // } // } else { showNotInArchive(wmRequest, request, response); return; // } } else { closest = results.getClosest(wmRequest); // TODO loop here looking for closest online/available version? // OPTIMIZ maybe assume version is here and redirect now if not // exactly // the date user requested, before retrieving it... try { resource = store.retrieveResource(closest.getARCLocation()); } catch (IOException e) { showResourceNotAvailable(wmRequest, request, response, e .getMessage()); return; } } // redirect to actual date if diff than request: if (!wmRequest.getExactDateRequest().equals( closest.getTimestamp().getDateStr())) { String newUrl = makeReplayURI(request,closest); response.sendRedirect(response.encodeRedirectURL(newUrl)); return; } replayResource(wmRequest, closest, resource, request, response, results); } public void replayResource(WMRequest wmRequest, ResourceResult result, Resource resource, HttpServletRequest request, HttpServletResponse response, ResourceResults results) throws IOException { if (resource == null) { throw new IllegalArgumentException("No resource"); } if (result == null) { throw new IllegalArgumentException("No result"); } ARCRecord record = resource.getArcRecord(); record.skipHttpHeader(); copyRecordHttpHeader(response, record, false); copy(record, response.getOutputStream()); } protected void copyRecordHttpHeader(HttpServletResponse response, ARCRecord record, boolean noLength) throws IOException { Header[] headers = record.getHttpHeaders(); int code = record.getStatusCode(); // Only return legit status codes -- don't return any minus // codes, etc. if (code <= HttpServletResponse.SC_CONTINUE) { String identifier = ""; response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Bad status code " + code + " (" + identifier + ")."); return; } response.setStatus(code); if (headers != null) { // Copy all headers to the response -- even date and // server. for (int i = 0; i < headers.length; i++) { // TODO: Special handling of encoding and date. String value = headers[i].getValue(); String name = headers[i].getName(); if (noLength) { if (-1 != name.indexOf("Content-Length")) { continue; } } response.setHeader(name, (value == null) ? "" : value); } } } protected void copy(InputStream is, OutputStream os) throws IOException { // TODO: Don't allocate everytime. byte[] buffer = new byte[4 * 1024]; for (int r = -1; (r = is.read(buffer, 0, buffer.length)) != -1;) { os.write(buffer, 0, r); } } public void showNotInArchive(WMRequest wmRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO check for javascipt type retrieval also if (wmRequest.isImageRetrieval()) { String imageUrl = jspPath + "/error_image.gif"; RequestDispatcher dispatcher = request .getRequestDispatcher(imageUrl); dispatcher.forward(request, response); } else { // String message = wmRequest.getRequestURI().getURI() + " on " // + wmRequest.getExactTimestamp().prettyDateTime() // + " is Not in the Archive"; String message = wmRequest.getRequestURI().getURI() + " is not in the Archive"; showError(message, request, response); } } public void showResourceNotAvailable(final WMRequest wmRequest, HttpServletRequest request, HttpServletResponse response, String message) throws IOException, ServletException { showError("Unexpected Exception: index not available " + message, request, response); } public void showIndexNotAvailable(final WMRequest wmRequest, HttpServletRequest request, HttpServletResponse response, String message) throws IOException, ServletException { showError("Unexpected Exception: index not available " + message, request, response); } public void showWaybackException(final WMRequest wmRequest, HttpServletRequest request, HttpServletResponse response, String message) throws IOException, ServletException { showError("Bad request: " + message, request, response); } public void showError(String message, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO Auto-generated method stub request.setAttribute("message", message); proxyRequest(request, response, "ErrorResult.jsp"); } private void proxyRequest(HttpServletRequest request, HttpServletResponse response, final String jspName) throws ServletException, IOException { String finalJspPath = jspPath + "/" + jspName; RequestDispatcher dispatcher = request .getRequestDispatcher(finalJspPath); dispatcher.forward(request, response); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } |
From: Brad <bra...@us...> - 2005-10-18 02:31:02
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/webapp/jsp/template In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/webapp/jsp/template Added Files: UI-footer.txt UI-header.txt styles.css Log Message: Initial check-in -- pre code review --- NEW FILE: UI-footer.txt --- <div align="center"> <!-- #BeginLibraryItem "/Library/footer.lbi" --> <!-- FOOTER --> <hr noshade size="1" align="center"> <p> <a href="/">Home</a> | <a href="http://www.archive.org/about/faqs.php#The_Wayback_Machine">Help</a> </p><p> <a href="http://www.archive.org">Internet Archive</a> | <a href="http://www.archive.org/about/terms.php">Terms of Use</a> | <a href="http://www.archive.org/about/terms.php#privacy">Privacy Policy</a> </p> <!-- /FOOTER --> <!-- #EndLibraryItem --> </div> <!-- HIDE THE SEARCHING MESSAGE --> <SCRIPT language="JavaScript"> if (typeof(hideWaitMsg) == 'function') { hideWaitMsg(); } </SCRIPT> </body> </html> --- NEW FILE: styles.css --- a:link { font-family: Arial, Helvetica, sans-serif; color: #3333FF; text-decoration: underline; line-height: normal} a:visited { font-family: Arial, Helvetica, sans-serif; color: #993399; text-decoration: underline; line-height: normal} #nolinelink { font-family: Verdana, Helvetica, sans-serif; font-size: 10px; color: #0000FF; line-height: normal; text-decoration: none} #orangelink { font-family: Arial, Helvetica, sans-serif; color: #CC6600; text-decoration: underline; line-height: normal} #blacklink { font-family: Verdana, Helvetica, sans-serif; font-size: 10px;color: #000000 } #whitelink { font-family: Verdana, Helvetica, sans-serif; font-size: 10px;color: #FFFFFF } .mainSmall { font-family: Verdana, Helvetica, sans-serif; font-size: 11px; line-height: normal} .mainSmallG { font-family: Verdana, Helvetica, sans-serif; font-size: 11px; line-height: normal; color: #666666} .mainBodyR { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #990000} .mainBodyW { font-family: Verdana, Helvetica, sans-serif; font-size: 10pt; color: #FFFFFF} .mainBody { font-family: Verdana, Helvetica, sans-serif; font-size: 10pt} .mainTitle { font-family: Arial, Helvetica, sans-serif; font-size: 14pt; font-style: normal; font-weight: bold} .mainTitleW { font-family: Arial, Helvetica, sans-serif; font-size: 14pt; color: #FFFFFF} .mainSearchTitle { font-family: Arial, Helvetica, sans-serif; font-size: 14pt; font-style: normal; color: #666666} .mainSearchText { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #666666} .mainSearchUrls { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt} .mainCalendar { font-family: Arial, Helvetica, sans-serif; font-size: 14pt; font-style: normal; font-weight: bold} .mainSecHead { font-family: Arial, Helvetica, sans-serif; font-size: 12pt; font-style: normal; font-weight: bold; color: #000000} .mainBodyG { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; font-weight: bold; color: #999999} .mainBigBody { font-family: Arial, Helvetica, sans-serif; font-size: 12pt} .mainBigBodyR { font-family: Arial, Helvetica, sans-serif; font-size: 12pt; color: #990000} .mainExample { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #0000FF} .mainSecHeadW { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; font-weight: bold; color: #FFFFFF} .mainSmallTimes { font-family: "Times New Roman", Times, serif; font-size: 10pt} .mainVerySmall { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px} .e2kSmall { font-family: Verdana, Helvetica, sans-serif; font-size: 11px; line-height: normal} .e2kBodyR { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #990000} .e2kBodyW { font-family: Verdana, Helvetica, sans-serif; font-size: 10pt; color: #FFFFFF} .e2kBody { font-family: Verdana, Helvetica, sans-serif; font-size: 10pt} .e2kTitle { font-family: Arial, Helvetica, sans-serif; font-size: 14pt; font-style: normal; font-weight: bold} .e2kCalendar { font-family: Arial, Helvetica, sans-serif; font-size: 14pt; font-style: normal; font-weight: bold} .e2kSecHead { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; font-style: normal; font-weight: bold} .e2kBodyG { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; font-weight: bold; color: #999999} .e2kBigBody { font-family: Arial, Helvetica, sans-serif; font-size: 12pt} .e2kExample { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; color: #0000FF} .e2kTitleW { font-family: Arial, Helvetica, sans-serif; font-size: 14pt; color: #FFFFFF} .e2kSecHeadW { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; font-weight: bold; color: #FFFFFF} .e2kSmallTimes { font-family: "Times New Roman", Times, serif; font-size: 10pt} .e2kVerySmall { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px} p {font-family: Verdana, Helvetica, sans-serif; font-size: 10pt} .mainBColor {background-color: #435D93} .e2kBColor {background-color: #1D0D71} .mainSearchBanner {background-color:#F0F0F0} --- NEW FILE: UI-header.txt --- <html> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"> <link rel="stylesheet" type="text/css" href="/wayback/jsp/QueryUI/template/styles.css" src="/wayback/jsp/QueryUI/template/styles.css"> <title>Internet Archive Wayback Machine</title> <base target="_top"> </head> <body bgcolor="white" alink="red" vlink="#0000aa" link="blue" style="font-family: Arial; font-size: 10pt"> <!-- CHOP_FILE_HERE --> <table width="100%" border="0" cellpadding="0" cellspacing="5"> <!-- URL FORM --> <form action="/archive_request_ng" method="post"> <input type="hidden" name="collection" value="web"> <!-- HEADER --> <tr> <!-- WAYBACK LOGO --> <td width="26%"><a href="/"><img src="http://web.archive.org/images/wayback_logo_sm.gif" width="153" height="54" border="0"></a></td> <!-- /WAYBACK LOGO --> <!-- ALEXA LOGO --> <td width="70%" align="right"></td> <!-- /ALEXA LOGO --> </tr> <!-- /HEADER --> <!-- GREEN BANNER --> <tr> <td colspan="2" height="30" align="center" class="mainSecHeadW"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <!-- ACTUAL FORM --> <tr class="mainBColor"> <td colspan="2"> <table border="0" width="80%" align="center"> <tr> <td nowrap align="center"><img src="http://web.archive.org/images/shim.gif" width="1" height="20"> <b class="mainBodyW"><font size="2" color="#FFFFFF" face="Arial, Helvetica, sans-serif">Enter Web Address:</font> <input type="text" name="url" value="http://" size="24" maxlength="256"> </b> <select name="datespec" size="1"> <option selected>All</option> <option>2005</option> <option>2004</option> <option>2003</option> <option>2002</option> <option>2001</option> <option>2000</option> <option>1999</option> <option>1998</option> <option>1997</option> <option>1996</option> </select> <input type="Submit" name="Submit" value="Take Me Back" align="absMiddle"> <a href="/collections/web/advanced.html" style="color:white;font-size:11px">Adv. Search</a> </td> </tr> </table> </td> </tr> <!-- /ACTUAL FORM --> </table> </td> </tr> <!-- /GREEN BANNER --> </form> <!-- /URL FORM --> </table> |
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/localbdbresourceindex In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/java/org/archive/wayback/localbdbresourceindex Added Files: BDBResourceIndexWriter.java LocalBDBResourceIndex.java BDBResourceIndex.java Log Message: Initial check-in -- pre code review --- NEW FILE: BDBResourceIndex.java --- package org.archive.wayback.localbdbresourceindex; import java.io.File; import java.text.ParseException; import java.util.Iterator; import org.archive.wayback.core.ResourceResult; import org.archive.wayback.core.ResourceResults; //import com.sleepycat.bind.tuple.TupleBinding; //import com.sleepycat.bind.tuple.TupleInput; //import com.sleepycat.bind.tuple.TupleOutput; import com.sleepycat.je.Cursor; //import com.sleepycat.je.CursorConfig; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.DatabaseEntry; import com.sleepycat.je.DatabaseException; //import com.sleepycat.je.DatabaseNotFoundException; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; import com.sleepycat.je.LockMode; import com.sleepycat.je.OperationStatus; public class BDBResourceIndex { private String path; private String dbName; Environment env = null; Database db = null; // Cursor cursor = null; public BDBResourceIndex(final String thePath, final String theDbName) throws Exception { super(); initializeDB(thePath, theDbName); } protected void initializeDB(final String thePath, final String theDbName) throws Exception { path = thePath; dbName = theDbName; EnvironmentConfig environmentConfig = new EnvironmentConfig(); environmentConfig.setAllowCreate(true); environmentConfig.setTransactional(false); File file = new File(path); env = new Environment(file, environmentConfig); DatabaseConfig databaseConfig = new DatabaseConfig(); databaseConfig.setAllowCreate(true); databaseConfig.setTransactional(false); // perform other database configurations db = env.openDatabase(null, dbName, databaseConfig); } protected void shutdownDB() throws DatabaseException { if (db != null) { db.close(); } if (env != null) { env.close(); } } protected ResourceResults doUrlSearch(final String url, final String firstDate, final String lastDate, final String exactHost, final int maxRecords) { ResourceResults results = new ResourceResults(); DatabaseEntry key = new DatabaseEntry(); DatabaseEntry value = new DatabaseEntry(); int numRecords = 0; String searchStart = url + " " + firstDate; key.setData(searchStart.getBytes()); key.setPartial(false); try { Cursor cursor = db.openCursor(null, null); OperationStatus status = cursor.getSearchKeyRange(key, value, LockMode.DEFAULT); while (status == OperationStatus.SUCCESS) { // String keyString = new String(key.getData()); String valueString = new String(value.getData()); ResourceResult result = new ResourceResult(); result.parseLine(valueString, 0); if (!result.getUrl().equals(url)) { break; } if (result.getTimestamp().getDateStr().compareTo(lastDate) > 0) { break; } if (result.getTimestamp().getDateStr().compareTo(firstDate) >= 0) { results.addResourceResult(result); numRecords++; if (numRecords >= maxRecords) { break; } } status = cursor.getNext(key, value, LockMode.DEFAULT); } cursor.close(); } catch (DatabaseException dbe) { dbe.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return results; } protected ResourceResults doUrlPrefixSearch(final String urlPrefix, final String firstDate, final String lastDate, final String exactHost, final int maxRecords) { ResourceResults results = new ResourceResults(); DatabaseEntry key = new DatabaseEntry(); DatabaseEntry value = new DatabaseEntry(); int numRecords = 0; String searchStart = urlPrefix; key.setData(searchStart.getBytes()); key.setPartial(false); try { Cursor cursor = db.openCursor(null, null); OperationStatus status = cursor.getSearchKeyRange(key, value, LockMode.DEFAULT); while (status == OperationStatus.SUCCESS) { String valueString = new String(value.getData()); ResourceResult result = new ResourceResult(); result.parseLine(valueString, 0); if (!result.getUrl().startsWith(urlPrefix)) { break; } if ((result.getTimestamp().getDateStr().compareTo(lastDate) <= 0) && (result.getTimestamp().getDateStr().compareTo( firstDate) >= 0)) { results.addResourceResult(result); numRecords++; if (numRecords >= maxRecords) { break; } } status = cursor.getNext(key, value, LockMode.DEFAULT); } cursor.close(); } catch (DatabaseException dbe) { dbe.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return results; } protected void addResults(ResourceResults results) throws Exception { Iterator itr = results.iterator(); DatabaseEntry key = new DatabaseEntry(); DatabaseEntry value = new DatabaseEntry(); OperationStatus status = null; try { Cursor cursor = db.openCursor(null, null); while (itr.hasNext()) { ResourceResult result = (ResourceResult) itr.next(); String keyString = result.getUrl() + " " + result.getTimestamp().getDateStr(); String valueString = result.toString(); key.setData(keyString.getBytes()); value.setData(valueString.getBytes()); status = cursor.put(key, value); if (status != OperationStatus.SUCCESS) { throw new Exception("oops, put had non-success status"); } } cursor.close(); } catch (DatabaseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } --- NEW FILE: BDBResourceIndexWriter.java --- package org.archive.wayback.localbdbresourceindex; import java.io.File; import java.io.RandomAccessFile; import org.archive.wayback.core.ResourceResult; import org.archive.wayback.core.ResourceResults; import com.sleepycat.je.DatabaseException; public class BDBResourceIndexWriter { private BDBResourceIndex db = null; public BDBResourceIndexWriter() { super(); // TODO Auto-generated constructor stub } protected void init(final String thePath, final String theDbName) throws Exception { db = new BDBResourceIndex(thePath, theDbName); } protected void init(BDBResourceIndex db) { this.db = db; } protected void shutdown() throws DatabaseException { db.shutdownDB(); } public void importFile(String filePath) throws Exception { ResourceResults results = readFile(filePath); db.addResults(results); } private ResourceResults readFile(String filePath) throws Exception { File file = new File(filePath); RandomAccessFile raFile = new RandomAccessFile(file, "r"); ResourceResults results = new ResourceResults(); int lineNumber = 0; while (true) { String line = raFile.readLine(); if (line == null) { break; } lineNumber++; if ((lineNumber == 1) && (line.contains(" CDX "))) { continue; } ResourceResult result = new ResourceResult(); result.parseLine(line, lineNumber); results.addResourceResult(result); } return results; } /** * @param args */ public static void main(String[] args) { try { BDBResourceIndexWriter idx = new BDBResourceIndexWriter(); idx.init(args[0], args[1]); idx.importFile(args[2]); idx.shutdown(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } --- NEW FILE: LocalBDBResourceIndex.java --- package org.archive.wayback.localbdbresourceindex; import java.io.File; import java.io.IOException; import java.util.Properties; import org.archive.wayback.ResourceIndex; import org.archive.wayback.arcindexer.IndexPipeline; import org.archive.wayback.core.ResourceResults; import org.archive.wayback.core.WMRequest; import org.archive.wayback.exception.BadQueryException; import org.archive.wayback.exception.WaybackException; public class LocalBDBResourceIndex implements ResourceIndex { private static Thread indexUpdateThread = null; private final static String INDEX_PATH = "resourceindex.indexPath"; private final static String DB_NAME = "resourceindex.dbName"; private final static String ARC_PATH = "resourceindex.arcPath"; private final static String WORK_PATH = "resourceindex.workPath"; private final static String RUN_PIPELINE = "resourceindex.runPipeline"; private final static int MAX_RECORDS = 1000; private BDBResourceIndex db = null; public LocalBDBResourceIndex() { super(); } public void init(Properties p) throws Exception { System.out.println("initializing LocalDBDResourceIndex..."); String dbPath = (String) p.get(INDEX_PATH); if (dbPath == null || (dbPath.length() <= 0)) { throw new IllegalArgumentException("Failed to find " + INDEX_PATH); } String arcPath = (String) p.get(ARC_PATH); if (arcPath == null || (arcPath.length() <= 0)) { throw new IllegalArgumentException("Failed to find " + ARC_PATH); } String workPath = (String) p.get(WORK_PATH); if (workPath == null || (workPath.length() <= 0)) { throw new IllegalArgumentException("Failed to find " + WORK_PATH); } String dbName = (String) p.get(DB_NAME); if (dbName == null || (dbName.length() <= 0)) { throw new IllegalArgumentException("Failed to find " + DB_NAME); } String runPipeline = (String) p.get(RUN_PIPELINE); db = new BDBResourceIndex(dbPath, dbName); if (runPipeline != null) { // QUESTION: are we sure there will be a single instace System.out .println("LocalDBDResourceIndex starting pipeline thread..."); if (indexUpdateThread == null) { IndexPipeline pipeline = new IndexPipeline(); String mergeDir = workPath + "/mergey"; pipeline.init(arcPath, mergeDir, workPath); startIndexUpdateThead(db, pipeline); } } } public ResourceResults query(WMRequest request) throws IOException, WaybackException { // TODO add check of WMRequest and call different methods: String searchHost = request.getRequestURI().getHostBasename(); String searchPath = request.getRequestURI().getEscapedPathQuery(); String searchUrl = searchHost + searchPath; if (request.isRetrieval()) { return db.doUrlSearch(searchUrl, request.getStartTimestamp() .getDateStr(), request.getEndTimestamp().getDateStr(), null, MAX_RECORDS); } else if (request.isQuery()) { return db.doUrlSearch(searchUrl, request.getStartTimestamp() .getDateStr(), request.getEndTimestamp().getDateStr(), null, MAX_RECORDS); } else if (request.isPathQuery()) { return db.doUrlPrefixSearch(searchUrl, request.getStartTimestamp() .getDateStr(), request.getEndTimestamp().getDateStr(), null, MAX_RECORDS); } else { throw new BadQueryException("Unknown query type"); } } protected synchronized void startIndexUpdateThead( final BDBResourceIndex bdb, IndexPipeline pipeline) { if (indexUpdateThread != null) { return; } indexUpdateThread = new IndexUpdateThread(bdb, pipeline); indexUpdateThread.start(); } private class IndexUpdateThread extends Thread { private final static int SLEEP_MILLISECONDS = 10000; BDBResourceIndexWriter importer = null; IndexPipeline pipeline = null; public IndexUpdateThread(final BDBResourceIndex bdb, IndexPipeline pipeline) { super("IndexUpdateThread"); super.setDaemon(true); this.importer = new BDBResourceIndexWriter(); importer.init(bdb); this.pipeline = pipeline; } public void run() { while (true) { try { indexArcs(); mergeIndex(); sleep(SLEEP_MILLISECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // System.out.println("I'm running!"); } } private void indexArcs() { try { pipeline.indexArcs(); // System.out.println("Indexed..."); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void mergeIndex() { int numMerged = 0; String newFiles[] = pipeline.mergeDir.list(); for (int i = 0; i < newFiles.length; i++) { // TODO: Special handling of encoding and date. File newFile = new File(pipeline.mergeDir.getAbsolutePath() + "/" + newFiles[i]); if (newFile.isFile()) { try { importer.importFile(newFile.getAbsolutePath()); if (!newFile.delete()) { throw new IOException("Unable to unlink " + newFile.getAbsolutePath()); } numMerged++; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } if (numMerged > 0) { System.out.println("Merged " + numMerged + " files."); } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } |
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/java/org/archive/wayback/core Added Files: ResourceResults.java WaybackLogic.java Timestamp.java WMRequest.java Resource.java ResourceResult.java Log Message: Initial check-in -- pre code review --- NEW FILE: ResourceResult.java --- package org.archive.wayback.core; import java.text.ParseException; import org.archive.io.arc.ARCLocation; public class ResourceResult { private final static String CDX_HEADER_STRING = " CDX N b h m s k r V g"; private String url = null; private Timestamp timestamp = null; private String origHost = null; private String mimeType = null; private String httpResponseCode = null; private String md5Fragment = null; private String redirectUrl = null; private long compressedOffset = -1; private String arcFileName = null; public ResourceResult() { super(); } public ARCLocation getARCLocation() { final String daArcName = arcFileName; final long daOffset = compressedOffset; return new ARCLocation() { private String filename = daArcName; private long offset = daOffset; public String getName() { return this.filename; } public long getOffset() { return this.offset; } }; } public void parseLine(final String line, final int lineNumber) throws ParseException { String[] tokens = line.split(" "); if (tokens.length != 9) { throw new ParseException(line, lineNumber); } url = tokens[0]; timestamp = Timestamp.parseBefore(tokens[1]); origHost = tokens[2]; mimeType = tokens[3]; httpResponseCode = tokens[4]; md5Fragment = tokens[5]; redirectUrl = tokens[6]; compressedOffset = Long.parseLong(tokens[7]); arcFileName = tokens[8]; } public static String getCDXHeaderString() { return CDX_HEADER_STRING; } public String toString() { return url + " " + timestamp.getDateStr() + " " + origHost + " " + mimeType + " " + httpResponseCode + " " + md5Fragment + " " + redirectUrl + " " + compressedOffset + " " + arcFileName; } public String toShortString() { return url + "\t" + timestamp.getDateStr() + "\t" + compressedOffset + "\t" + arcFileName; } public String getArcFileName() { return arcFileName; } public long getCompressedOffset() { return compressedOffset; } public String getHttpResponseCode() { return httpResponseCode; } public String getMd5Fragment() { return md5Fragment; } public String getMimeType() { return mimeType; } public String getOrigHost() { return origHost; } public String getRedirectUrl() { return redirectUrl; } public boolean isRedirect() { return (0 != redirectUrl.compareTo("-")); } public Timestamp getTimestamp() { return timestamp; } public String getUrl() { return url; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public void setArcFileName(String arcFileName) { this.arcFileName = arcFileName; } public void setCompressedOffset(long compressedOffset) { this.compressedOffset = compressedOffset; } public void setHttpResponseCode(String httpResponseCode) { this.httpResponseCode = httpResponseCode; } public void setMd5Fragment(String md5Fragment) { this.md5Fragment = md5Fragment; } public void setMimeType(String mimeType) { this.mimeType = mimeType; } public void setOrigHost(String origHost) { this.origHost = origHost; } public void setRedirectUrl(String redirectUrl) { this.redirectUrl = redirectUrl; } public void setTimeStamp(Timestamp timeStamp) { this.timestamp = timeStamp; } public void setUrl(String url) { this.url = url; } } --- NEW FILE: WMRequest.java --- package org.archive.wayback.core; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.archive.net.UURI; public class WMRequest { private final Pattern IMAGE_REGEX = Pattern .compile(".*\\.(jpg|jpeg|gif|png|bmp|tiff|tif)$"); private String exactDateRequest = null; private Timestamp exactTimestamp = null; private Timestamp startTimestamp = null; private Timestamp endTimestamp = null; private String referrerUrl = null; private UURI requestURI = null; private UURI redirectURI = null; private boolean retrieval = false; private boolean query = false; private boolean pathQuery = false; public UURI getRedirectURI() { return redirectURI; } public void setRedirectURI(UURI redirectURI) { this.redirectURI = redirectURI; } public WMRequest() { super(); // TODO Auto-generated constructor stub } public boolean isRetrieval() { return this.retrieval; } public boolean isQuery() { return this.query; } public boolean isPathQuery() { return this.pathQuery; } public Timestamp getExactTimestamp() { return exactTimestamp; } public void setExactTimestamp(Timestamp exactTimestamp) { this.exactTimestamp = exactTimestamp; } public Timestamp getEndTimestamp() { return endTimestamp; } public void setEndTimestamp(Timestamp endTimestamp) { this.endTimestamp = endTimestamp; } public String getReferrerUrl() { return referrerUrl; } public void setReferrerUrl(String referrerUrl) { this.referrerUrl = referrerUrl; } public UURI getRequestURI() { return requestURI; } public void setRequestURI(UURI requestURI) { this.requestURI = requestURI; } public Timestamp getStartTimestamp() { return startTimestamp; } public void setStartTimestamp(Timestamp startTimestamp) { this.startTimestamp = startTimestamp; } private void resetType() { this.retrieval = false; this.query = false; this.pathQuery = false; } public void setPathQuery() { resetType(); this.pathQuery = true; } public void setQuery() { resetType(); this.query = true; } public void setRetrieval() { resetType(); this.retrieval = true; } public boolean isImageRetrieval() { String uri = requestURI.getEscapedURI(); Matcher matcher = null; matcher = IMAGE_REGEX.matcher(uri); if (matcher != null && matcher.matches()) { return true; } return false; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public String getExactDateRequest() { return exactDateRequest; } public void setExactDateRequest(String exactDateRequest) { this.exactDateRequest = exactDateRequest; } } --- NEW FILE: Resource.java --- /** * */ package org.archive.wayback.core; import java.io.IOException; import org.archive.io.arc.ARCRecord; /** * @author brad * */ public class Resource { ARCRecord arcRecord = null; // probably this should inherit from ARCRecord... public Resource(final ARCRecord rec) { super(); arcRecord = rec; } public String dumpRaw() throws IOException { arcRecord.skipHttpHeader(); String content = ""; byte[] outputBuffer = new byte[8 * 1024]; int read = outputBuffer.length; while ((read = arcRecord.read(outputBuffer, 0, outputBuffer.length)) != -1) { String tmpString = new String(outputBuffer, 0, read); content = content.concat(tmpString); //System.out.write(outputBuffer, 0, read); } //System.out.flush(); return content; } public ARCRecord getArcRecord() { return arcRecord; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } --- NEW FILE: Timestamp.java --- package org.archive.wayback.core; import java.text.ParseException; import java.util.Date; import org.archive.util.ArchiveUtils; public class Timestamp { private final static String FIRST1_TIMESTAMP = "19960101000000"; private final static String FIRST2_TIMESTAMP = "20000101000000"; private final static String LAST1_TIMESTAMP = "19991231235959"; // private final static String LAST2_TIMESTAMP = "20311231235959"; private final static String LAST2_TIMESTAMP = "29991231235959"; private final static String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; private String dateStr = null; private Date date = null; public Timestamp() { super(); // TODO Auto-generated constructor stub } public static Timestamp parseBefore(final String dateStr) throws ParseException { Timestamp ts = new Timestamp(); ts.setDateStr(padStartTimestamp(dateStr)); return ts; } public static Timestamp parseAfter(final String dateStr) throws ParseException { Timestamp ts = new Timestamp(); ts.setDateStr(padEndTimestamp(dateStr)); return ts; } public static Timestamp earliestTimestamp() throws ParseException { Timestamp ts = new Timestamp(); ts.setDateStr(FIRST1_TIMESTAMP); return ts; } public static Timestamp latestTimestamp() throws ParseException { Timestamp ts = new Timestamp(); ts.setDateStr(LAST2_TIMESTAMP); return ts; } public static Timestamp fromSse(final int sse) throws ParseException { String dateStr = ArchiveUtils.get14DigitDate(sse * 1000); Timestamp ts = new Timestamp(); ts.setDateStr(dateStr); return ts; } private static String padStartTimestamp(final String input) { String first = FIRST1_TIMESTAMP; if (input.length() == 0) { return FIRST1_TIMESTAMP; } if (input.length() < 4) { if (input.charAt(0) == '2') { first = FIRST2_TIMESTAMP; } } return padTimestamp(input, first); } private static String padEndTimestamp(final String input) { String last = LAST1_TIMESTAMP; if (input.length() == 0) { return LAST2_TIMESTAMP; } if (input.length() < 4) { if (input.charAt(0) == '2') { last = LAST2_TIMESTAMP; } } return padTimestamp(input, last); } private static String padTimestamp(final String input, final String output) { if (input.length() > output.length()) { return input; } return input + output.substring(input.length()); } public String getDateStr() { return dateStr; } public void setDateStr(String dateStr) throws ParseException { date = ArchiveUtils.parse14DigitDate(dateStr); this.dateStr = dateStr; } public int sse() { return Math.round(date.getTime() / 1000); } /** * function that calculates integer milliseconds between this records * timeStamp and the arguments timeStamp. result is the absolute * number of milliseconds difference. * * @param String 14 digit UTC representation of another timestamp. * @return int seconds between the argument and this records timestamp. * @throws ParseException if the inputstring was malformed */ public long absDistanceFromTimestamp(final Timestamp otherTimeStamp) throws ParseException { return Math.abs(distanceFromTimestamp(otherTimeStamp)); } /** * function that calculates integer milliseconds between this records * timeStamp and the arguments timeStamp. result is negative if * this records timeStamp is less than the argument, positive * if it is greater, and 0 if the same. * * @param String 14 digit UTC representation of another timestamp. * @return int seconds between the argument and this records timestamp. * @throws ParseException if the inputstring was malformed */ public long distanceFromTimestamp(final Timestamp otherTimeStamp) throws ParseException { Date myDate = ArchiveUtils.parse14DigitDate(dateStr); Date otherDate = ArchiveUtils.parse14DigitDate(otherTimeStamp .getDateStr()); return otherDate.getTime() - myDate.getTime(); } public String getYear() { return this.dateStr.substring(0, 4); } public String getMonth() { return this.dateStr.substring(4, 6); } public String getDay() { return this.dateStr.substring(6, 8); } public String prettyDate() { String year = dateStr.substring(0, 4); String month = dateStr.substring(4, 6); String day = dateStr.substring(6, 8); int monthInt = Integer.parseInt(month) - 1; String prettyMonth = "UNK"; if ((monthInt >= 0) && (monthInt < months.length)) { prettyMonth = months[monthInt]; } return prettyMonth + " " + day + ", " + year; } public String prettyTime() { return dateStr.substring(8, 10) + ":" + dateStr.substring(10, 12) + ":" + dateStr.substring(12, 14); } public String prettyDateTime() { return prettyDate() + " " + prettyTime(); } public Timestamp startOfYear() throws ParseException { return parseBefore(dateStr.substring(0, 4)); } public Timestamp startOfMonth() throws ParseException { return parseBefore(dateStr.substring(0, 6)); } public Timestamp startOfWeek() throws ParseException { String yearMonth = dateStr.substring(0, 6); String dayOfMonth = dateStr.substring(6, 8); int dom = Integer.parseInt(dayOfMonth); int mod = dom % 7; dom -= mod; String paddedDay = (dom < 10) ? "0" + dom : "" + dom; return parseBefore(yearMonth + paddedDay); } public Timestamp startOfDay() throws ParseException { return parseBefore(dateStr.substring(0, 8)); } public Timestamp startOfHour() throws ParseException { return parseBefore(dateStr.substring(0, 10)); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } //public Date getDate() { //String[] ids = TimeZone.getAvailableIDs(0); //if(ids.length < 1) { // return null; //} //TimeZone gmt = new SimpleTimeZone(0,ids[0]); //Calendar cal = new GregorianCalendar(gmt); //int year = Integer.parseInt(dateStr.substring(0,4)); //int month = Integer.parseInt(dateStr.substring(4,2)) - 1; //int day = Integer.parseInt(dateStr.substring(6,2)); //int hour = Integer.parseInt(dateStr.substring(8,2)); //int min = Integer.parseInt(dateStr.substring(10,2)); //int sec = Integer.parseInt(dateStr.substring(12,2)); // //cal.set(year,month,day,hour,min,sec); //return cal.getTime(); //} // --- NEW FILE: WaybackLogic.java --- package org.archive.wayback.core; import java.util.Properties; import java.util.logging.Logger; import org.archive.wayback.QueryUI; import org.archive.wayback.ReplayUI; import org.archive.wayback.ResourceIndex; import org.archive.wayback.ResourceStore; public class WaybackLogic { private static final Logger LOGGER = Logger.getLogger(WaybackLogic.class .getName()); private static final String REPLAY_UI_CLASS = "replayui.class"; private static final String QUERY_UI_CLASS = "queryui.class"; private static final String RESOURCE_STORE_CLASS = "resourcestore.class"; private static final String RESOURCE_INDEX_CLASS = "resourceindex.class"; private ReplayUI replayUI = null; private QueryUI queryUI = null; private ResourceIndex resourceIndex = null; private ResourceStore resourceStore = null; public WaybackLogic() { super(); // TODO Auto-generated constructor stub } public void init(Properties p) throws Exception { LOGGER.info("WaybackLogic constructing classes..."); replayUI = (ReplayUI) getInstance(p, REPLAY_UI_CLASS, "replayui"); queryUI = (QueryUI) getInstance(p, QUERY_UI_CLASS, "queryUI"); resourceStore = (ResourceStore) getInstance(p, RESOURCE_STORE_CLASS, "resourceStore"); resourceIndex = (ResourceIndex) getInstance(p, RESOURCE_INDEX_CLASS, "resourceIndex"); LOGGER.info("WaybackLogic initializing classes..."); try { replayUI.init(p); LOGGER.info("initialized replayUI"); queryUI.init(p); LOGGER.info("initialized queryUI"); resourceStore.init(p); LOGGER.info("initialized resourceStore"); resourceIndex.init(p); LOGGER.info("initialized resourceIndex"); } catch (Exception e) { throw new Exception(e.getMessage()); } } protected Object getInstance(final Properties p, final String classProperty, final String pretty) throws Exception { Object result = null; String className = (String) p.get(classProperty); if ((className == null) || (className.length() <= 0)) { throw new Exception("No config (" + classProperty + " for " + pretty + ")"); } try { result = Class.forName(className).newInstance(); LOGGER.info("new " + className + " " + pretty + " created."); } catch (Exception e) { // Convert. Add info. throw new Exception("Failed making " + pretty + " with " + className + ": " + e.getMessage()); } return result; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public QueryUI getQueryUI() { return queryUI; } public ReplayUI getReplayUI() { return replayUI; } public ResourceIndex getResourceIndex() { return resourceIndex; } public ResourceStore getResourceStore() { return resourceStore; } } --- NEW FILE: ResourceResults.java --- package org.archive.wayback.core; import java.text.ParseException; import java.util.ArrayList; import java.util.Iterator; import org.archive.wayback.core.ResourceResult; import org.archive.wayback.core.WMRequest; public class ResourceResults { ArrayList results = null; public ResourceResults() { super(); this.results = new ArrayList(); } public boolean isEmpty() { return results.isEmpty(); } public void addResourceResult(final ResourceResult result) { results.add(result); } public int getNumResults() { return results.size(); } public ResourceResult getClosest(final WMRequest wmRequest) { ResourceResult closest = null; long closestDistance = 0; ResourceResult cur = null; Timestamp wantTimestamp = wmRequest.getExactTimestamp(); Iterator itr = results.iterator(); while (itr.hasNext()) { cur = (ResourceResult) itr.next(); long curDistance; try { curDistance = cur.getTimestamp().absDistanceFromTimestamp( wantTimestamp); } catch (ParseException e) { continue; } if ((closest == null) || (curDistance < closestDistance)) { closest = cur; closestDistance = curDistance; } } return closest; } public Iterator iterator() { return results.iterator(); } public ArrayList getYears() { ArrayList years = new ArrayList(); String lastYear = ""; Iterator itr = results.iterator(); while (itr.hasNext()) { ResourceResult cur = (ResourceResult) itr.next(); String curYear = cur.getTimestamp().getYear(); if (!curYear.equals(lastYear)) { years.add(curYear); lastYear = curYear; } } return years; } public ArrayList resultsInYear(String year) { ArrayList resultsToReturn = new ArrayList(); Iterator itr = results.iterator(); while (itr.hasNext()) { ResourceResult cur = (ResourceResult) itr.next(); if (cur.getTimestamp().getYear().equals(year)) { resultsToReturn.add(cur); } } return resultsToReturn; } public Timestamp firstTimestamp() { if (results.isEmpty()) { return null; } ResourceResult first = (ResourceResult) results.get(0); return first.getTimestamp(); } public Timestamp lastTimestamp() { if (results.isEmpty()) { return null; } ResourceResult last = (ResourceResult) results.get(results.size() - 1); return last.getTimestamp(); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } |
From: Brad <bra...@us...> - 2005-10-18 02:31:01
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/arcindexer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/java/org/archive/wayback/arcindexer Added Files: IndexPipeline.java ArcIndexer.java Log Message: Initial check-in -- pre code review --- NEW FILE: ArcIndexer.java --- package org.archive.wayback.arcindexer; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.util.Iterator; import org.archive.io.arc.ARCReader; import org.archive.io.arc.ARCReaderFactory; import org.archive.io.arc.ARCRecord; import org.archive.io.arc.ARCRecordMetaData; import org.archive.net.UURI; import org.archive.wayback.core.ResourceResult; import org.archive.wayback.core.ResourceResults; import org.archive.wayback.core.Timestamp; import org.apache.commons.httpclient.Header; public class ArcIndexer { private final static String LOCATION_HTTP_HEADER = "Location"; public ArcIndexer() { super(); // TODO Auto-generated constructor stub } public ResourceResults indexArc(final String arcPath) throws IOException { ResourceResults results = new ResourceResults(); File arc = new File(arcPath); ARCReader arcReader = ARCReaderFactory.get(arc); arcReader.setParseHttpHeaders(true); // doh. this does not generate quite the columns we need: //arcReader.createCDXIndexFile(arcPath); Iterator itr = arcReader.iterator(); while (itr.hasNext()) { ARCRecord rec = (ARCRecord) itr.next(); ResourceResult result; try { result = arcRecordToResourceResult(rec, arc); } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); continue; } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); continue; } results.addResourceResult(result); } return results; } private ResourceResult arcRecordToResourceResult(final ARCRecord rec, File arc) throws NullPointerException, IOException, ParseException { rec.close(); ARCRecordMetaData meta = rec.getMetaData(); ResourceResult result = new ResourceResult(); result.setArcFileName(arc.getName()); result.setCompressedOffset(meta.getOffset()); String statusCode = (meta.getStatusCode() == null) ? "-" : meta .getStatusCode(); result.setHttpResponseCode(statusCode); result.setMd5Fragment(meta.getDigest()); result.setMimeType(meta.getMimetype()); UURI uri = new UURI(meta.getUrl(), false); result.setOrigHost(uri.getHost()); String redirectUrl = "-"; Header[] headers = rec.getHttpHeaders(); if (headers != null) { for (int i = 0; i < headers.length; i++) { if (headers[i].getName().equals(LOCATION_HTTP_HEADER)) { redirectUrl = headers[i].getValue(); break; } } } result.setRedirectUrl(redirectUrl); result.setTimeStamp(Timestamp.parseBefore(meta.getDate())); UURI uriCap = new UURI(meta.getUrl(), false); String searchHost = uriCap.getHostBasename(); String searchPath = uriCap.getEscapedPathQuery(); String indexUrl = searchHost + searchPath; result.setUrl(indexUrl); return result; } public void serializeResults(final ResourceResults results, final String cdxPath) throws IOException { Iterator itr = results.iterator(); File cdx = new File(cdxPath); FileOutputStream output = new FileOutputStream(cdx); output.write((ResourceResult.getCDXHeaderString() + "\n").getBytes()); while (itr.hasNext()) { ResourceResult result = (ResourceResult) itr.next(); output.write((result.toString() + "\n").getBytes()); } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArcIndexer indexer = new ArcIndexer(); String arc = args[0]; String cdx = args[1]; try { ResourceResults results = indexer.indexArc(arc); indexer.serializeResults(results, cdx); } catch (Exception e) { e.printStackTrace(); } } } --- NEW FILE: IndexPipeline.java --- package org.archive.wayback.arcindexer; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Iterator; import org.archive.wayback.core.ResourceResults; import com.sun.org.apache.xml.internal.utils.StringToStringTable; public class IndexPipeline { private File arcDir = null; public File mergeDir = null; private File queuedDir = null; private File toBeIndexedDir = null; private File indexingDir = null; private ArcIndexer indexer = null; public IndexPipeline() { super(); // TODO Auto-generated constructor stub } private void ensureDir(File dir) throws IOException { if (!dir.isDirectory() && !dir.mkdir()) { throw new IOException("FAILED to create " + dir.getAbsolutePath()); } } public void init(final String arcDir, final String mergeDir, final String workDir) throws IOException { this.arcDir = new File(arcDir); this.mergeDir = new File(mergeDir); this.queuedDir = new File(workDir + "/queued"); this.toBeIndexedDir = new File(workDir + "/to-be-indexed"); this.indexingDir = new File(workDir + "/indexing"); ensureDir(new File(workDir)); ensureDir(this.queuedDir); ensureDir(this.toBeIndexedDir); ensureDir(this.indexingDir); indexer = new ArcIndexer(); } private StringToStringTable dirToSTST(File dir) { StringToStringTable hash = new StringToStringTable(); String entries[] = dir.list(); for (int i = 0; i < entries.length; i++) { hash.put(entries[i], "i"); } return hash; } private StringToStringTable getQueuedFiles() { return dirToSTST(this.queuedDir); } private ArrayList getNewArcs() { StringToStringTable queued = getQueuedFiles(); ArrayList newArcs = new ArrayList(); String arcs[] = this.arcDir.list(); for (int i = 0; i < arcs.length; i++) { if (!queued.contains(arcs[i])) { newArcs.add(arcs[i]); } } return newArcs; } private void queueArc(final String newArc) throws IOException { File newQueuedFile = new File(this.queuedDir.getAbsolutePath() + "/" + newArc); File newToBeIndexedFile = new File(this.toBeIndexedDir .getAbsolutePath() + "/" + newArc); newToBeIndexedFile.createNewFile(); newQueuedFile.createNewFile(); } public void queueNewArcs() throws IOException { ArrayList newArcs = getNewArcs(); if (!newArcs.isEmpty()) { Iterator itr = newArcs.iterator(); while (itr.hasNext()) { String newArc = (String) itr.next(); queueArc(newArc); } } } public void indexArcs() throws MalformedURLException, IOException { queueNewArcs(); String toBeIndexed[] = this.toBeIndexedDir.list(); for (int i = 0; i < toBeIndexed.length; i++) { String base = toBeIndexed[i]; File arcFile = new File(this.arcDir.getAbsolutePath().concat( "/" + base)); File tmpFile = new File(this.indexingDir.getAbsolutePath().concat( "/" + base)); File flagFile = new File(this.toBeIndexedDir.getAbsolutePath() .concat("/" + base)); File finalFile = new File(this.mergeDir.getAbsolutePath().concat( "/" + base)); ResourceResults res = indexer.indexArc(arcFile.getAbsolutePath()); indexer.serializeResults(res, tmpFile.getAbsolutePath()); if (!tmpFile.renameTo(finalFile)) { throw new IOException("Unable to move " + tmpFile.getAbsolutePath() + " to " + finalFile.getAbsolutePath()); } if (!flagFile.delete()) { throw new IOException("Unable to delete " + flagFile.getAbsolutePath()); } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } |
From: Brad <bra...@us...> - 2005-10-18 02:31:01
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/servletglue In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/java/org/archive/wayback/servletglue Added Files: RequestFilter.java WBQueryUIServlet.java WBReplayUIServlet.java Log Message: Initial check-in -- pre code review --- NEW FILE: WBQueryUIServlet.java --- package org.archive.wayback.servletglue; import java.io.IOException; import java.util.Enumeration; import java.util.Properties; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.archive.wayback.QueryUI; import org.archive.wayback.core.WMRequest; import org.archive.wayback.core.WaybackLogic; public class WBQueryUIServlet extends HttpServlet { private WaybackLogic wayback = new WaybackLogic(); private static final String WMREQUEST_ATTRIBUTE = "wmrequest.attribute"; private static final long serialVersionUID = 1L; public WBQueryUIServlet() { super(); // TODO Auto-generated constructor stub } public void init(ServletConfig c) throws ServletException { Properties p = new Properties(); for (Enumeration e = c.getInitParameterNames(); e.hasMoreElements();) { String key = (String) e.nextElement(); p.put(key, c.getInitParameter(key)); } try { wayback.init(p); } catch (Exception e) { throw new ServletException(e.getMessage()); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { WMRequest wmRequest = (WMRequest) request .getAttribute(WMREQUEST_ATTRIBUTE); if (wmRequest == null) { throw new ServletException("No WMRequest object"); } QueryUI queryUI = wayback.getQueryUI(); queryUI.handle(wayback, wmRequest, request, response); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } --- NEW FILE: WBReplayUIServlet.java --- package org.archive.wayback.servletglue; import java.io.IOException; import java.util.Enumeration; import java.util.Properties; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.archive.wayback.ReplayUI; import org.archive.wayback.core.WMRequest; import org.archive.wayback.core.WaybackLogic; public class WBReplayUIServlet extends HttpServlet { private static final String WMREQUEST_ATTRIBUTE = "wmrequest.attribute"; private static final long serialVersionUID = 1L; private WaybackLogic wayback = new WaybackLogic(); public WBReplayUIServlet() { super(); // TODO Auto-generated constructor stub } public void init(ServletConfig c) throws ServletException { Properties p = new Properties(); for (Enumeration e = c.getInitParameterNames(); e.hasMoreElements();) { String key = (String) e.nextElement(); p.put(key, c.getInitParameter(key)); } try { wayback.init(p); } catch (Exception e) { throw new ServletException(e.getMessage()); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { WMRequest wmRequest = (WMRequest) request .getAttribute(WMREQUEST_ATTRIBUTE); if (wmRequest == null) { throw new ServletException("No WMRequest object"); } ReplayUI replayUI = wayback.getReplayUI(); replayUI.handle(wayback, wmRequest, request, response); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } --- NEW FILE: RequestFilter.java --- package org.archive.wayback.servletglue; import java.io.IOException; import java.util.logging.Logger; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.archive.net.UURI; import org.archive.wayback.RequestParser; import org.archive.wayback.core.WMRequest; public class RequestFilter implements Filter { private static final Logger LOGGER = Logger.getLogger(RequestFilter.class .getName()); private static final String WMREQUEST_ATTRIBUTE = "wmrequest.attribute"; private static final String REQUEST_PARSER_CLASS = "requestParser.class"; private static final String HANDLER_URL = "handler.url"; private String handlerUrl = null; private RequestParser requestParser = null; public RequestFilter() { super(); // TODO Auto-generated constructor stub } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public void init(FilterConfig c) throws ServletException { handlerUrl = c.getInitParameter(HANDLER_URL); if ((handlerUrl == null) || (handlerUrl.length() <= 0)) { throw new ServletException("No config (" + HANDLER_URL + ")"); } String className = c.getInitParameter(REQUEST_PARSER_CLASS); if ((className == null) || (className.length() <= 0)) { throw new ServletException("No config (" + REQUEST_PARSER_CLASS + ")"); } try { requestParser = (RequestParser) Class.forName(className) .newInstance(); LOGGER.info("new " + className + " requestParser created."); } catch (Exception e) { // Convert. Add info. throw new ServletException("Failed making requestParser with " + className + ": " + e.getMessage()); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (!handle(request, response)) { chain.doFilter(request, response); } } protected boolean handle(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { if (!(request instanceof HttpServletRequest)) { return false; } if (!(response instanceof HttpServletResponse)) { return false; } HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; WMRequest wmRequest = requestParser.parseRequest(httpRequest); if (wmRequest == null) { return false; } // if getRedirectURI returns non-null, then the request needs a // redirect: UURI redirectURI = wmRequest.getRedirectURI(); if (redirectURI != null) { String redirectURL = redirectURI.getEscapedURI(); // response.sendRedirect(response.encodeRedirectURL(redirectURL)); httpResponse.sendRedirect(httpResponse .encodeRedirectURL(redirectURL)); } else { request.setAttribute(WMREQUEST_ATTRIBUTE, wmRequest); RequestDispatcher dispatcher = request .getRequestDispatcher(handlerUrl); dispatcher.forward(request, response); } return true; } public void destroy() { // TODO Auto-generated method stub } } |
From: Brad <bra...@us...> - 2005-10-18 02:31:01
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/exception In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3483/src/java/org/archive/wayback/exception Added Files: WaybackException.java BadQueryException.java Log Message: Initial check-in -- pre code review --- NEW FILE: WaybackException.java --- package org.archive.wayback.exception; public class WaybackException extends Exception { /** * */ private static final long serialVersionUID = 1L; public WaybackException(String message) { super(message); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } --- NEW FILE: BadQueryException.java --- package org.archive.wayback.exception; public class BadQueryException extends WaybackException { /** * */ private static final long serialVersionUID = 1L; public BadQueryException(String message) { super(message); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } |
From: Brad <bra...@us...> - 2005-10-18 02:30:58
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/localbdbresourceindex In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/localbdbresourceindex Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/localbdbresourceindex added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:57
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/exception In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/exception Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/exception added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:57
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/servletglue In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/servletglue Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/servletglue added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:57
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/localresourcestore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/localresourcestore Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/localresourcestore added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:57
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:57
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/ippreplayui In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/ippreplayui Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/ippreplayui added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:57
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:57
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:56
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/rawreplayui In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/rawreplayui Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/rawreplayui added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:56
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:54
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:54
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/arcindexer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/arcindexer Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/arcindexer added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:54
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/core Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/core added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:53
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/simplequeryui In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/java/org/archive/wayback/simplequeryui Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/java/org/archive/wayback/simplequeryui added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:53
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/webapp/WEB-INF In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/webapp/WEB-INF Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/webapp/WEB-INF added to the repository |
From: Brad <bra...@us...> - 2005-10-18 02:30:53
|
Update of /cvsroot/archive-access/archive-access/projects/wayback/src/webapp/jsp/template In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3336/src/webapp/jsp/template Log Message: Directory /cvsroot/archive-access/archive-access/projects/wayback/src/webapp/jsp/template added to the repository |