// Datei: Telefonbuch.java
// Autor: Brecht
// Datum: 23.07.2018
// Thema: Das Telefonbuch enthält zentral eine ArrayList
//        namens tBuch aus Strings der Form "Name&Nummer".
//
//        Dazu gehören die beiden Methoden tBuchSuche() und
//        tBuchAbfrage() sowie zwei ArrayLists namens suErgNa
//        und suErgNu für die gefundenen Suchergebnisse.
//
//        Eine Beschreibung der Arbeitsweise beider Methoden
//        findet sich im Grobentwurf des Lösungsbeispiels
//        zur Aufgabe 1.
// =============================================================
import java.util.*;
class Telefonbuch {
  ArrayList<String> tBuch   = new ArrayList<String>();
  ArrayList<String> suErgNa = new ArrayList<String>();
  ArrayList<String> suErgNu = new ArrayList<String>();
  // tBuch mit einigen Einträgen belegen
  // -----------------------------------------------------------
  Telefonbuch() {
    tBuch.add(   "Meier&4711"    );
    tBuch.add(   "von Ulm&4815"  );
    tBuch.add(   "Müller&4711"   );
    tBuch.add(   "Meier&4816"    );
    tBuch.add(   "Schmitt&4712"  );
    tBuch.add(   "Meier&4713"    );
    tBuch.add(   "Huber&4711"    );
  }
  // Suche im Telefonbuch
  // -----------------------------------------------------------
  ArrayList<String> tBuchSuche(String pkqs) {
    ArrayList<String> treffer = new ArrayList<String>();
    int len = tBuch.size();
    String zeile = null;
    for(int i=0; i<len; i++) {
      zeile = tBuch.get(i);
      if(pkqs.endsWith("&")) {
        if(zeile.startsWith(pkqs)) treffer.add(zeile);
      }
      else {
        if(zeile.endsWith(pkqs)) treffer.add(zeile);
      }
    }
    return treffer;
  }  // basisSuche()
  // Nebenläufige Suche mit Threads, die tBuchSuche()
  // ausführen
  // Parameter ist ein korrekt aufgebauter Query String
  // -----------------------------------------------------------
  ArrayList<String> tBuchAbfrage(String kqs)
                                              throws Exception {
    // SuchThreads als lokale Klasse
    // ---------------------------------------------------------
    class SuchThread extends Thread {
      String pkqs = null;
      SuchThread(String pkqs) { this.pkqs = pkqs; }
      public void run() {
        if(pkqs.endsWith("&")) {
          Telefonbuch.this.suErgNa =
                        Telefonbuch.this.tBuchSuche(pkqs);
        }
        else {
          Telefonbuch.this.suErgNu =
                        Telefonbuch.this.tBuchSuche(pkqs);
        }
      }
    }  // local class
    // Query String hat die Form:  *&  oder &*  oder *&*
    // ---------------------------------------------------------
    String name = null;
    String nummer = null;
    if(kqs.endsWith("&")) {
      SuchThread st = new SuchThread(kqs);
      st.start();
      st.join();
      return suErgNa;
    }
    if(kqs.startsWith("&")) {
      SuchThread st = new SuchThread(kqs);
      st.start();
      st.join();
      return suErgNu;
    }
    String[] token = kqs.split("&");
    name = token[0]+"&";
    nummer = "&" + token[1];
    SuchThread st1 = new SuchThread(name);
    SuchThread st2 = new SuchThread(nummer);
    st1.start();
    st2.start();
    st1.join();
    st2.join();
    int len = suErgNu.size();
    for(int i=0; i<len; i++) suErgNa.add(suErgNu.get(i));
    return suErgNa;
  }  // tBuchAbfrage()
} // class