home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 December / PCO1297.ISO / FilesBBS / FREI / JAVA3.ARJ / JAVA3.ZIP / JAVA / ClientSearch.java next >
Encoding:
Java Source  |  1997-11-06  |  7.0 KB  |  235 lines

  1. // ClientSearch Version 1.0
  2. // Die Suchmaschine fⁿr Jedermann
  3. // Autor: Gerhard Schild, 1997
  4. // Fⁿr: PC-ONLiNE
  5.  
  6. import java.applet.*;
  7. import java.awt.*;
  8. import java.util.*;
  9. import java.io.*;
  10. import java.net.*;
  11. import java.util.zip.*;
  12.  
  13. // Die Suchmaschine
  14. class SearchEngine {
  15.   Properties tab;         // Suchtabelle
  16.   Hashtable result;       // Ergebnisliste
  17.   SearchEngine() { tab=new Properties(); }
  18.   void load(InputStream in) throws IOException {
  19.     tab.load(in);
  20.     in.close();
  21.   }
  22.   void loadZIP(InputStream in) throws IOException {
  23.     load(new InflaterInputStream(in));
  24.   }
  25.   int size() { return tab.size(); }
  26.   void addEntry(String s) {
  27.     if(s!=null) {
  28.       for(int i=0; i<s.length(); i+=2) {
  29.         result.put(s.substring(i, i+2), "");
  30.       }
  31.     }
  32.   }
  33.   // Wort mit Suchmuster vergleichen
  34.   static boolean match(String wild, String key, int nw, int nk) {
  35.     while(nw<wild.length() && nk<key.length()) {
  36.       if(wild.charAt(nw)=='?') {
  37.         ++nk;                                  // ?: Zeichen ignorieren
  38.         ++nw;
  39.       }
  40.       else if(wild.charAt(nw)=='*') {          // *: Beliebig viele Zeichen
  41.         while(nk<=key.length()) {
  42.           if(match(wild, key, nw+1, nk++)) return true;
  43.         }
  44.         return false;
  45.       }
  46.       else
  47.         if(key.charAt(nk++)!=wild.charAt(nw++))
  48.           return false;
  49.     }
  50.     while(nw<wild.length() && wild.charAt(nw)=='*')
  51.       ++nw;
  52.     return nw==wild.length() && nk==key.length();
  53.   }
  54.   // Suche durchfⁿhren
  55.   SearchEngineResult[] lookup(String keyword) {
  56.     result=new Hashtable();
  57.     if(!keyword.startsWith(".")) {            // .-EintrΣge sind reserviert!
  58.       if(keyword.indexOf('?')<0 && keyword.indexOf('*')<0) {
  59.         addEntry(tab.getProperty(keyword));   // Suche ohne Wildcards
  60.       }
  61.       else {
  62.         // Wildcard-Suche: Alle Schlⁿsselw÷rter durchgehen
  63.         for(Enumeration e=tab.keys(); e.hasMoreElements() ;) {
  64.           String key=(String)e.nextElement();
  65.           if(!key.startsWith("."))
  66.             if(match(keyword, key, 0, 0))
  67.               addEntry(tab.getProperty(key));
  68.         }
  69.       }
  70.     }
  71.     SearchEngineResult r[]=new SearchEngineResult[result.size()];
  72.     int i=0;
  73.     for(Enumeration e=result.keys(); e.hasMoreElements() ;) {
  74.       String doc=(String)e.nextElement();
  75.       r[i++]=new SearchEngineResult(tab.getProperty("."+doc));
  76.     }
  77.     return r;
  78.   }
  79. }
  80.  
  81. // Das Such-Applet
  82. public class ClientSearch extends Applet implements Runnable {
  83.   Thread loader=null;
  84.   SearchEngine engine;
  85.   SearchEngineResult[] result;
  86.   TextField t1;
  87.   Button b1;
  88.   List l1;
  89.   final static String rawfile="searchR.dat";
  90.   final static String zipfile="searchZ.dat";
  91.   final static String version="1.0";
  92.   boolean loaded=false;
  93.  
  94.   public String getAppletInfo() {
  95.     return "Name: ClientSearch Version "+version+"\r\n" +
  96.            "Autor: Gerhard Schild, 1997\r\n" +
  97.            "Fuer: PC-ONLiNE";
  98.   }
  99.   private void add(Component c, GridBagLayout gb, GridBagConstraints gbc) {
  100.     add(c);
  101.     gb.setConstraints(c, (GridBagConstraints)gbc.clone());
  102.   }
  103.   void status(String s) {
  104.     showStatus(s+" - ClientSearch Version "+version+" - die Suchmaschine der PCONLiNE");
  105.   }
  106.   // Tabelle laden
  107.   void load(boolean compress) {
  108.     String filename=compress?zipfile:rawfile;
  109.     try {
  110.       URL url=new URL(getDocumentBase(), filename);
  111.       status("Lade "+url.getFile());
  112.       InputStream in=url.openStream();
  113.       if(compress) engine.loadZIP(in); else engine.load(in);
  114.       loaded=true;
  115.     } catch(Exception e) {
  116.       System.err.println("Exception: "+e.getMessage());
  117.     }
  118.   }
  119.   // Asynchroner Lade-Thread
  120.   public void run() {
  121.     // Feststellen, ob InflaterInputStream verfⁿgbar ist (ab JDK 1.1)
  122.     boolean compress=true;
  123.     try {
  124.       Class c=Class.forName("java.util.zip.InflaterInputStream");
  125.     } catch(Exception e) {
  126.       compress=false;
  127.     }
  128.     load(compress);        // Erster Ladeversuch
  129.     if(!loaded && compress)// Falls komprimierte Daten nicht zur Verfⁿgung
  130.       load(false);         // stehen, aber Dekompressor: Unkomprimiert laden
  131.     if(loaded) {
  132.       status("Suchmaschine bereit ("+engine.size()+" EintrΣge)");
  133.       b1.enable();
  134.     }
  135.     else
  136.       status("Suchdaten konnten nicht geladen werden");
  137.   }
  138.   Color getColor(String name) {
  139.     String s=getParameter(name);
  140.     return s==null ? null : new Color(Integer.valueOf(s, 16).intValue());
  141.   }
  142.   // Applet initialisieren: Komponenten erzeugen
  143.   public void init() {
  144.     Color bg=getColor("bgcolor"), fg=getColor("fgcolor");
  145.     if(bg!=null) setBackground(bg);
  146.     if(fg!=null) setForeground(fg);
  147.     GridBagConstraints gbc=new GridBagConstraints();
  148.     GridBagLayout gb=new GridBagLayout();
  149.     setLayout(gb);
  150.     gbc.gridx=GridBagConstraints.RELATIVE;
  151.     gbc.gridy=0;
  152.     gbc.gridwidth=1;
  153.     gbc.gridheight=1;
  154.     gbc.weightx=0.0;
  155.     gbc.fill=GridBagConstraints.BOTH;
  156.     add(new Label("Suchbegriff:", Label.LEFT), gb, gbc);
  157.     gbc.weightx=1.0;
  158.     add(t1=new TextField(""), gb, gbc);
  159.     gbc.weightx=0.0;
  160.     add(b1=new Button("Suchen"), gb, gbc);
  161.     gbc.gridx=0;
  162.     gbc.gridy=1;
  163.     gbc.gridwidth=3;
  164.     gbc.weighty=1.0;
  165.     add(l1=new List(), gb, gbc);
  166.     t1.requestFocus();
  167.     if(bg!=null) l1.setBackground(bg);
  168.     if(fg!=null) l1.setForeground(fg);
  169.     engine=new SearchEngine();
  170.     b1.disable();
  171.   }
  172.   // Applet starten: Lade-Thread ansto▀en
  173.   public void start() {
  174.     if(loader==null) {
  175.       loader=new Thread(this);
  176.       loader.start();
  177.     }
  178.   }
  179.   // Ereignis-Behandlung
  180.   public boolean action(Event e, Object o) {
  181.     if(e.target==b1) { search(); return true; }
  182.     if(e.target==t1) { if(b1.isEnabled()) search(); return true; }
  183.     if(e.target==l1) { go(); return true; }
  184.     return false;
  185.   }
  186.   public boolean keyDown(Event e, int key) {
  187.     if(e.target==l1)
  188.       if(key=='\r' || key=='\n') { go(); return true; }
  189.     return false;
  190.   }
  191.   // Zielseite aufrufen
  192.   void go() {
  193.     if(l1.getSelectedIndex()<0) return;
  194.     String base=getParameter("base");
  195.     if(base==null) base="";
  196.     String link=result[l1.getSelectedIndex()].document;
  197.     URL url=null;
  198.     try {
  199.       url=new URL(new URL(base), link); // Gültige Basis-URL?
  200.     } catch(Exception e) {
  201.     }
  202.     if(url==null) try {
  203.       url=new URL(getDocumentBase(), base+link);
  204.     } catch(Exception e) {
  205.     }
  206.     if(url==null) try {
  207.       url=new URL(base+link);
  208.     } catch(Exception e) {
  209.     }
  210.     if(url==null)
  211.       status("Ungueltige Verzweigung ("+base+","+link+")");
  212.     else {
  213.       status("Verzweige zu "+url.toString());
  214.       getAppletContext().showDocument(url);
  215.     }
  216.   }
  217.   // Suche starten
  218.   void search() {
  219.     status("Suche...");
  220.     b1.disable();
  221.     result=engine.lookup(t1.getText().toUpperCase());
  222.     status("Treffer: "+result.length);
  223.     l1.clear();
  224.     if(result.length>0) {
  225.       for(int i=0; i<result.length; ++i) {
  226.         l1.addItem(result[i].getString());
  227.       }
  228.       l1.select(0);
  229.       l1.requestFocus();
  230.     }
  231.     b1.enable();
  232.   }
  233. }
  234.  
  235.