home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / browser / urlhistory.java < prev    next >
Text File  |  1995-08-11  |  5KB  |  172 lines

  1. /*
  2.  * @(#)URLHistory.java    1.5 95/03/20 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package browser;
  21.  
  22. import net.www.html.URL;
  23. import java.util.Hashtable;
  24. import java.util.Enumeration;
  25. import net.www.html.MalformedURLException;
  26. import java.io.*;
  27.  
  28. public class URLHistory {
  29.     /** Hashtable of urls parsed from history file, plus new ones
  30.     we have visited. */
  31.     Hashtable    urlTable = new Hashtable();
  32.  
  33.     public URLHistory() {
  34.     }
  35.  
  36.     final String makeString(char data[], int length) {
  37.     char    chars[] = new char[length];
  38.  
  39.     System.arraycopy(data, 0, chars, 0, length);
  40.     return new String(chars);
  41.     }
  42.  
  43.     public boolean seen(URL u) {
  44.     return urlTable.get(u.toExternalForm()) != null;
  45.     }
  46.  
  47.     public void addUrl(URL u) {
  48.     String    eform = u.toExternalForm();
  49.  
  50.     if (urlTable.get(eform) == null) {
  51.         urlTable.put(eform, u);
  52.         if (outputStream != null) {
  53.         outputStream.println(eform + "\t0");
  54.         outputStream.flush();
  55.         }
  56.     }
  57.     }
  58.  
  59.     /** Format of stream is
  60.  
  61.     url[ \t]time
  62.  
  63.     It's a ' ' when parsing mosaic global history and a Tab
  64.     when parsing netscapes.  HotJava's format uses a Tab,
  65.     and currently sticks in 0 for the last time visited.  That's
  66.     because there's no way to get the current time in hotjava. */
  67.     public void parseStream(InputStream is) {
  68.     /* just in case it's not buffered */
  69.     is = new BufferedInputStream(is);
  70.  
  71.     DataInputStream    dis = new DataInputStream(is);
  72.     char    buffer[] = new char[256];
  73.  
  74.     dis.readLine();    /* skip the file format line */
  75.     int    lineNumber = 1;
  76.     int    index = 0;
  77.     int    separatorIndex = -1;
  78.     int    c = -1;
  79.  
  80.     do {
  81.         try {
  82. inner:
  83.         while (true) {
  84.             switch (c = is.read()) {
  85.             case '\n':
  86.             lineNumber += 1;
  87.             /* falls into ... */
  88.  
  89.             case -1:
  90.             break inner;
  91.  
  92.             case ' ':
  93.             case '\t':
  94.             if (separatorIndex == -1) {
  95.                 separatorIndex = index;
  96.             }
  97.             /* falls into ... */
  98.  
  99.             default:
  100.             buffer[index] = (char) c;
  101.             /* Increment after array index in case index is
  102.                out of bounds.  That way we can recover below. */
  103.             index += 1;
  104.             }
  105.         }
  106.         } catch (ArrayIndexOutOfBoundsException e) {
  107.         if (index < buffer.length) {
  108.             throw e;
  109.         }
  110.         char    newbuf[] = new char[(int)(buffer.length * 1.5)];
  111.         System.arraycopy(buffer, 0, newbuf, 0, buffer.length);
  112.         buffer = newbuf;
  113.         buffer[index++] = (char) c;
  114.         continue;
  115.         }
  116.  
  117.         if (separatorIndex != -1) {
  118.         try {
  119.             String  s = makeString(buffer, separatorIndex);
  120.  
  121.             urlTable.put(s, s);
  122.         } catch (MalformedURLException e) {
  123.             System.out.println("URL history format error, line "
  124.                        + lineNumber + ": "
  125.                        + makeString(buffer, separatorIndex));
  126.         }
  127.         }
  128.         separatorIndex = -1;
  129.         index = 0;
  130.     } while (c != -1);
  131.     }
  132.  
  133.     public void writeHistoryFile(String filename) {
  134.     FileOutputStream    fos = new FileOutputStream(filename);
  135.     PrintStream        os;
  136.  
  137.     os = new PrintStream(new BufferedOutputStream(fos));
  138.     writeHistoryStream(os);
  139.     }
  140.  
  141.     public void writeHistoryStream(PrintStream os) {
  142.     os.println("hotjava-global-history-1");
  143.     Enumeration e = urlTable.elements();
  144.     while (e.hasMoreElements()) {
  145.         String  key = (String) e.nextElement();
  146.  
  147.         os.print(key);
  148.         os.println("\t0");
  149.     }
  150.     }
  151.  
  152.     PrintStream    outputStream;
  153.  
  154.     public void openOutputStream(String filename) {
  155.     try {
  156.         // REMIND: This should open for appending!
  157.         FileOutputStream    os = new FileOutputStream(filename);
  158.  
  159.         outputStream = new PrintStream(new BufferedOutputStream(os));
  160.     } catch (Exception e) {
  161.         System.err.println("Warning: not saving global history\nReason is: " + e);
  162.     }
  163.     }
  164.  
  165.     static public void main(String args[]) {
  166.     URLHistory  h = new URLHistory();
  167.  
  168.     h.parseStream(new URL(null, args[0]).openStream());
  169.     System.out.println("Parsed " + h.urlTable.size() + " entries from " + args[0]);
  170.     }
  171. }
  172.