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

  1. /*
  2.  * @(#)IndexingInputStream.java    1.10 95/03/14 David A. Brown
  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.tools.JavaSearch;
  21. import java.io.BufferedInputStream;
  22. import java.io.FileInputStream;
  23. import java.io.File;
  24.  
  25.  
  26. /** Input stream to parse documents for indexing */
  27. class IndexingInputStream extends BufferedInputStream {
  28.  
  29.     /** "Document type" of the file we're parsing.
  30.      *  See "Document type" in Doc.java.
  31.      */
  32.     private int docType = Doc.INVALID_TYPE;
  33.  
  34.  
  35.     /** Basic constructors; see FileInputStream for details */
  36.     public IndexingInputStream(String name) {
  37.         super(new FileInputStream(name), 2048);
  38.     }
  39.  
  40. /*
  41.     public IndexingInputStream(File file) {
  42.         super(file, 1024);
  43.     }
  44. */
  45.  
  46.     /** Set the Document Type */
  47.     public void setDocType(int type) {
  48.     docType = type;
  49.     }
  50.  
  51.  
  52.     /** 
  53.      *  Return the next "word" in the input stream, null on EOF.
  54.      */
  55.     public String getWord() {
  56.     int c;
  57.  
  58.     // First, skip over any non-alphanumeric characters,
  59.     //   and check for EOF
  60.     while (true) {
  61.         c = read();
  62.  
  63.         if (c == -1) return null;
  64.         if (isAlphanumeric((char)c)) break;
  65.  
  66.         // Doc Type-specific features:
  67.         if ((docType == Doc.HTML_TYPE) && (c == '<')) {
  68.         // If we detect a '<'...
  69.         while ((c = read()) != '>') {
  70.             //   skip till the next '>', but bail on EOF
  71.             if (c == -1) return null;
  72.         }
  73.         }
  74.         // Does NEWS need anything special here?  Probably not...
  75.  
  76.     }
  77.  
  78.     // Start the input buffer
  79.     StringBuffer input = new StringBuffer();
  80.     input.appendChar((char)c);
  81.  
  82.     // Process more chars:
  83.     //
  84.     // We're guaranteed to have at least a one-char word,
  85.     //   so we'll return a string either when we hit a
  86.     //   delimiter, OR if we hit EOF.  (Then, the next call to
  87.     //   this method will immediately return null, signaling
  88.     //   the EOF.)
  89.     //
  90.     while (true) {
  91.             c = read();
  92.  
  93.         if (isAlphanumeric((char)c)) {
  94.         input.appendChar((char)c);
  95.         }
  96.         else {    // c is non-alphanumeric, or could be -1 if EOF
  97.         // If by chance c was '<'...
  98.         if ((docType == Doc.HTML_TYPE) && (c == '<')) {
  99.                     while ((c = read()) != '>') {
  100.                         //   skip till the next '>', but bail on EOF
  101.                         if (c == -1) break;
  102.                     }
  103.                 }
  104.  
  105.         // Ok, process and return the string we've built up
  106.         downcase(input);
  107.         return input.toString();
  108.         }
  109.     }
  110.     }
  111.     
  112.  
  113.     /**
  114.      *  Return true if the given character is alphanumeric,
  115.      *  i.e. NOT a word delimiter
  116.      */
  117.     private static boolean isAlphanumeric(char c) {
  118.  
  119.     if ((c >= 'a') && (c <= 'z')) return true;
  120.     if ((c >= 'A') && (c <= 'Z')) return true;
  121.     if ((c >= '0') && (c <= '9')) return true;
  122.  
  123.     // REMIND:  Is it always the right thing to have "'"
  124.     //   count as alphanumeric?
  125.     if (c == '\'') return true;
  126.  
  127.     // FUTURE:  maybe other chars might count as 'alphanumeric',
  128.     //   for example "_" if it's part of any method names...
  129.  
  130.     return false;
  131.     }
  132.  
  133.  
  134.     /**
  135.      *  Convert a StringBuffer to lowercase, in place.
  136.      *  Utility function used by a few JavaSearch classes.
  137.      */
  138.     public static void downcase(StringBuffer buf) {
  139.     for (int i=0; i<buf.length(); i++) {
  140.         char c = buf.charAt(i);
  141.         if (c>='A' && c<='Z') {
  142.         c -= 'A'-'a';
  143.         buf.setCharAt(i,c);
  144.         }
  145.     }
  146.     }
  147.  
  148.     /**
  149.      *  Return a downcased version of the specified String.
  150.      *  Based on downcase(StringBuffer buf).
  151.      *  Utility function used by a few JavaSearch classes.
  152.      */
  153.     public static String downcase(String s) {
  154.     StringBuffer sb = new StringBuffer().append(s);
  155.     downcase(sb);
  156.     return sb.toString();
  157.     }
  158.  
  159.  
  160.  
  161.  
  162.     // FUTURE stuff:
  163.     //
  164.     // Method to return the current position in the input file,
  165.     //   or better, the starting position of the last word returned
  166.     //   by getWord().  This will be needed if the indexer ever wants
  167.     //   to keep positional info in the index.
  168.     //
  169.  
  170. }
  171.