home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / sybase / starbuck / samples.z / PageSeeker.wxc < prev    next >
Text File  |  1996-12-10  |  7KB  |  261 lines

  1. Save Format v1.3
  2. @begin ClassFile "PageSeeker"
  3.  Exported 1;
  4.  Abstract 0;
  5.  Interface 0;
  6.  PackageName "";
  7.  Language "Java";
  8.  
  9.  @begin UserFunction "run()"
  10.   GencodeSrcLine 14;
  11.   FunctionName "PageSeeker::run()";
  12.  @end;
  13.  
  14.  @begin UserFunction "Prototype for run()"
  15.   Private 1;
  16.   GencodeSrcLine -1;
  17.   FunctionName "PageSeeker::Prototype for run()";
  18.  @end;
  19.  
  20.  @begin UserFunction "loadPage(URL pageURL)"
  21.   GencodeSrcLine 61;
  22.   FunctionName "PageSeeker::loadPage(URL pageURL)";
  23.  @end;
  24.  
  25.  @begin UserFunction "Prototype for loadPage(URL pageURL)"
  26.   Private 1;
  27.   GencodeSrcLine -1;
  28.   FunctionName "PageSeeker::Prototype for loadPage(URL pageURL)";
  29.  @end;
  30.  
  31.  @begin UserFunction "extractLinks(String webPage)"
  32.   GencodeSrcLine 75;
  33.   FunctionName "PageSeeker::extractLinks(String webPage)";
  34.  @end;
  35.  
  36.  @begin UserFunction "Prototype for extractLinks(String webPage)"
  37.   Private 1;
  38.   GencodeSrcLine -1;
  39.   FunctionName "PageSeeker::Prototype for extractLinks(String webPage)";
  40.  @end;
  41.  
  42.  @begin UserFunction "PageSeeker(String pageURL)"
  43.   GencodeSrcLine 115;
  44.   FunctionName "PageSeeker::PageSeeker(String pageURL)";
  45.  @end;
  46.  
  47.  @begin UserFunction "Prototype for PageSeeker(String pageURL)"
  48.   Private 1;
  49.   GencodeSrcLine -1;
  50.   FunctionName "PageSeeker::Prototype for PageSeeker(String pageURL)";
  51.  @end;
  52.  
  53.  @begin HPPPrefixBlock
  54. @begin-code HPPPrefix
  55.  
  56. // add your custom import statements here
  57. import java.util.*;
  58. import java.net.*;
  59. import java.io.*;
  60.  
  61. @end-code;
  62.   GencodeSrcLine 6;
  63.  @end;
  64.  
  65.  @begin CPPPrefixBlock
  66. @begin-code CPPPrefix
  67.  
  68.  
  69. @end-code;
  70.   GencodeSrcLine -1;
  71.  @end;
  72.  
  73.  @begin ClassContentsBlock
  74. @begin-code ClassContents
  75.  
  76.     // add your data members here
  77.     private final static int MAXTHREADS = 4;
  78.     private static Hashtable _linkTable = new Hashtable();
  79.     URL _pageToFetch;
  80.     static TokenIssuer _threadLimiter = new TokenIssuer(MAXTHREADS);
  81.     WebCrawler _parent;
  82.  
  83. @end-code;
  84.   GencodeSrcLine 129;
  85.  @end;
  86.  
  87. @begin-code BaseClassList
  88.  
  89. extends Thread
  90.  
  91. @end-code;
  92.  
  93. @begin-code GeneratedClassContents
  94.  
  95.  
  96. @end-code;
  97.  
  98. @begin-code Code "PageSeeker::run()"
  99.  
  100. //****************************
  101. /**
  102.  * Creates a @CLASSNAME@ object which performs the following:
  103.  * 1. loads a page from a given URL
  104.  * 2. parses out all the imbedded links
  105.  * 3. checks links against a hashtable and adds them if they
  106.  *    are new
  107.  * 4. spawns new @CLASSNAME@ threads to visit each new link
  108. */
  109.  
  110.     public void run()
  111.     //****************************
  112.     {
  113.         this.setPriority(MIN_PRIORITY);
  114.         String webPage = new String();
  115.         Vector pageLinks;
  116.         
  117.         // only run if there is a free token
  118.         _threadLimiter.getToken();
  119.         
  120.         try {
  121.             webPage = loadPage(_pageToFetch);
  122.         } catch (java.io.IOException badIO) {
  123.             System.out.println(_pageToFetch + " returned a bad I/O");
  124.         }
  125.         
  126.         pageLinks = extractLinks(webPage);
  127.         
  128.         Enumeration enum = pageLinks.elements();
  129.         while(enum.hasMoreElements()) {
  130.             String page = (String) enum.nextElement();
  131.  
  132.             if ( !_linkTable.containsKey(page)) 
  133.             {
  134.                 _linkTable.put(page, page);
  135.                 _parent.addLink(page);
  136.                 new @CLASSNAME@(_parent, page);
  137.             }
  138.         }
  139.         
  140.         _threadLimiter.relinquishToken();
  141.         
  142.         // wait some random time to give all waiting threads a chance
  143.         try {
  144.             Thread.sleep( (int) (Math.random()*200) );
  145.         } catch (Exception e) {}
  146.     }
  147.  
  148. @end-code;
  149.  
  150. @begin-code Code "PageSeeker::Prototype for run()"
  151.  
  152.     public:
  153.         void run();
  154.  
  155. @end-code;
  156.  
  157. @begin-code Code "PageSeeker::loadPage(URL pageURL)"
  158.  
  159.     public String loadPage(URL pageURL) throws IOException
  160.     //****************************
  161.     {
  162.         
  163.         InputStream is = pageURL.openStream();
  164.         int oneChar;
  165.         StringBuffer sb = new StringBuffer();
  166.  
  167.         while ((oneChar=is.read()) != -1)
  168.             sb.append((char)oneChar);
  169.         is.close();
  170.         return sb.toString();
  171.         
  172.     }
  173.  
  174. @end-code;
  175.  
  176. @begin-code Code "PageSeeker::Prototype for loadPage(URL pageURL)"
  177.  
  178.     public:
  179.         String loadPage(URL pageURL);
  180.  
  181. @end-code;
  182.  
  183. @begin-code Code "PageSeeker::extractLinks(String webPage)"
  184.  
  185.     public Vector extractLinks(String webPage)
  186.     //****************************
  187.     {
  188.         int lastPosition = 0;
  189.         int endOfURL;
  190.         String link;
  191.         Vector newLinks = new Vector();
  192.  
  193.         while(lastPosition != -1 ) {
  194.             lastPosition = webPage.indexOf("http://", lastPosition);
  195.  
  196.             if (lastPosition != -1) {
  197.  
  198.                 endOfURL = webPage.indexOf(">", lastPosition + 1 );
  199.  
  200.                 // extract found hypertext link
  201.                 link = webPage.substring(lastPosition, endOfURL);
  202.                 link = link.trim();
  203.                 if (link.endsWith("\"")) {
  204.                     link = link.substring(0, link.length() - 1 );
  205.                 }
  206.  
  207.                 // ignore references
  208.                 if (link.indexOf("#") != -1) {
  209.                     link = link.substring(0, link.indexOf("#"));
  210.                 }
  211.  
  212.                 // discard links which point explicitly to images
  213.                 if ( link.endsWith(".gif") ||
  214.                     link.endsWith(".jpg")    ) {
  215.                     ;
  216.                 } else {    // collect all others
  217.                     newLinks.addElement( link );
  218.                 }
  219.                 lastPosition++;     // skip current link
  220.             }
  221.         }
  222.         return newLinks;
  223.     
  224.     }
  225.  
  226. @end-code;
  227.  
  228. @begin-code Code "PageSeeker::Prototype for extractLinks(String webPage)"
  229.  
  230.     public:
  231.         Vector extractLinks(String webPage);
  232.  
  233. @end-code;
  234.  
  235. @begin-code Code "PageSeeker::PageSeeker(String pageURL)"
  236.  
  237.     public @CLASSNAME@(WebCrawler parent, String startingPage)
  238.     //****************************
  239.  
  240.     {
  241.         _parent = parent;
  242.         try {
  243.             _pageToFetch = new URL(startingPage);
  244.             this.setName(startingPage);
  245.             start();
  246.         } catch (MalformedURLException badURL) {
  247.             System.out.println(startingPage + " bad URL");
  248.         }
  249.     
  250.     }
  251.  
  252. @end-code;
  253.  
  254. @begin-code Code "PageSeeker::Prototype for PageSeeker(String pageURL)"
  255.  
  256.     public:
  257.         @@CLASSNAME@(String pageURL);
  258.  
  259. @end-code;
  260. @end;
  261.