// Datei: TelefonbuchServer.java
// Autor: Werner Brecht
// Datum: 23.07.2018
// Thema: Ein TelefonbuchServer mit einer Benutzerschnittstelle
// und einer Analysemethode.
//
// Die Benutzerschnittstelle besteht aus den beiden
// Methoden auswahl() und ausgabe(). Die Analysemethode
// heißt analyse().
//
// Eine Beschreibung der Arbeitsweise des Servers findet
// sich im Grobentwurf des Lösungsbeispiels zur
// Aufgabe 1.
// =============================================================
import java.util.*;
import java.io.*;
import java.util.regex.*;
class TelefonbuchServer {
public static void main(String[] unused) throws Exception {
// Ergebnisliste bereitstellen
// ---------------------------------------------------------
ArrayList<String> erg = null;
String qs = null;
// Benutzer abfragen, Eingaben untersuchen, ggf. Suchvor-
// gänge starten und Ergebnis ausgeben. Abbruch auf
// Benutzerwunsch in auswahl()
// ---------------------------------------------------------
while(true) {
qs = auswahl();
erg = analyse(qs);
ausgabe(erg);
}
} // main()
// =============================================================
static String auswahl() throws Exception {
// Das Programm arbeitet mit einer Windows-Konsole, weshalb
// als Zeichenkodierung Cp850 eingestellt wird
// ---------------------------------------------------------
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in, "Cp850"));
PrintStream ps = new PrintStream(System.out, true, "Cp850");
String ein = null;
while(true) {
ps.println("\nTelefonbuchabfrage");
ps.println("------------------");
ps.println("Sie können durch Eingabe der Ziffer");
ps.println(" 1 : nach einem Namen,");
ps.println(" 2 : nach einer Nummer,");
ps.println(" 3 : nach einem Namen und einer " +
"Nummer suchen oder mit");
ps.println(" 4 : das Programm beenden.\n");
ps.print("Ihre Eingabe ->");
ein = br.readLine().trim();
// Je nach Eingabe des Benutzers:
// -------------------------------------------------------
String sna =
"Geben Sie jetzt bitte einen Namen ein und achten" +
"\nSie darauf, dass er kein Kaufmanns-Und (&) " +
"enthält.";
String snu =
"Geben Sie jetzt bitte eine Nummer ein und achten" +
"\nSie darauf, dass sie kein Kaufmanns-Und (&) " +
"enthält.";
if(ein.equals("1")) {
ps.println("\n" + sna);
ps.print("\nIhre Eingabe ->");
ein = br.readLine().trim();
ein = ein + "&"; // Query String
break;
}
if(ein.equals("2")) {
ps.println("\n" + snu);
ps.print("\nIhre Eingabe ->");
ein = br.readLine().trim();
ein = "&" + ein; // Query String
break;
}
if(ein.equals("3")) {
ps.println("\n" + sna);
ps.print("\nIhre Eingabe ->");
ein = br.readLine().trim();
ein = ein + "&"; // Query String Anfang
ps.println("\n" + snu);
ps.print("\nIhre Eingabe ->");
ein = ein + br.readLine().trim(); // Query String Rest
break;
}
if(ein.equals("4") ) {
ps.println("\n============================");
ps.println("Benutzerwunsch: Programmende");
ps.println("============================\n");
System.exit(0);
}
ps.println("\n===================");
ps.println("Unzulässige Auswahl");
ps.println("Bitte wiederholen");
ps.println("===================\n");
continue;
} // while
return ein; // Query String
} // auswahl()
// =============================================================
static ArrayList<String> analyse(String qs) throws Exception {
// Telefonbuch erzeugen und Ergebnisliste anlegen
// ---------------------------------------------------------
Telefonbuch tb = new Telefonbuch();
ArrayList<String> erg = new ArrayList<String>();
// Ergebnislisten im Telefonbuch löschen
// ---------------------------------------------------------
tb.suErgNa.clear();
tb.suErgNu.clear();
// Ist in den Eingaben genau ein & enthalten?
// ---------------------------------------------------------
String regex = "^[^&]*&[^&]*$";
if(! qs.matches(regex)) {
erg.add("Syntaxfehler");
return erg;
}
// Sind die Benutzereingaben leer?
// ---------------------------------------------------------
if(qs.equals("&")) {
erg.add("Leere Eingabe");
return erg;
}
// Der Query String ist korrekt aufgebaut
// ---------------------------------------------------------
erg = tb.tBuchAbfrage(qs);
erg.add("Suche");
return erg;
}
// =============================================================
static void ausgabe(ArrayList<String> erg) throws Exception {
// Die Ausgaben gehen in eine Windows-Konsole, deshalb Cp850
// ---------------------------------------------------------
PrintStream ps = new PrintStream(System.out, true, "Cp850");
int len = erg.size();
String analyseErg = erg.get(len-1);
ps.println("\n========================================");
if(analyseErg.equals("Syntaxfehler")) {
ps.println("Syntaktisch falsche Eingabe");
ps.println("Bitte wiederholen");
ps.println("========================================\n");
return;
}
if(analyseErg.equals("Leere Eingabe")) {
ps.println("Leere Eingabe");
ps.println("Bitte wiederholen");
ps.println("========================================\n");
return;
}
ps.println("Suchergebnis:\n");
// War die Suche ergebnislos?
// ---------------------------------------------------------
if(len == 1) {
ps.println("Die Suche war ergebnislos");
ps.println("========================================\n");
return;
}
String[] token = null;
for(int i=0; i<len-1; i++) {
token = erg.get(i).split("&");
ps.println("\t" + token[0] + "\t\t" + token[1]);
}
ps.println("========================================\n");
return;
} // ausgabe()
} // class