package jpp.marketanalysis.exploration;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.Vector;
import java.util.Set;
import jpp.marketanalysis.data.DataStorage;
import jpp.marketanalysis.data.Dataset;
public class CLShareExploration {
private static ShareExploration se;
public static DataStorage db;
/**
* Der Konstruktor der Klasse, welcher als Argument ein Objekt der Klasse
* ShareExploration erhaelt, welches die jeweiligen Datenanfragen auswerten
* wird.
*
* @param s
*/
public CLShareExploration(ShareExploration s) {
this.se = s;
}
/**
* Diese Methode gibt alle gespeicherten Daten zu einem bestimmten
* Unternehmen in uebersichtlicher Form aus. Zuerst wird hierfuer eine Liste
* aller im System gespeicherten Unternehmen ausgegeben und den Namen
* Nummern zugeordnet. Diese soll folgende Form haben:
*
*
* Zu folgenden Aktien sind Daten gespeichert: [0]: Adidas [1]: Allianz N
* [2]: BASF Bitte geben Sie die gewuenschte Nummer ein:
*
* Wie das Beispiel zeigt, soll die Auflistung dabei alphabetisch geordnet
* aufsteigend erfolgen! Nach Eingabe der jeweiligen Nummer werden alle
* gespeicherten Daten zu einer Aktie --- d.h. alle Datasets mit der
* toString()- Methode --- untereinander ausgegeben. Wird statt einer Nummer
* der Befehl "EXIT" eingegeben, wird die Methode beendet. Im Falle einer
* nicht vergebenen Nummer oder Fehleingabe des Benutzers soll
*
* Fehler: Diese Nummer ist nicht vergeben.
*
* ausgegeben und die Interaktion neu gestartet werden. Nach einem Durchlauf
* soll die Methode wieder an den Anfang der Interaktion springen, d.h.
* insbesondere dass die Methode so lange laeuft, bis sie per "EXIT"-Befehl
* beendet wird.
*/
public void selectByStockName() {
db = se.getDB();
String s = "";
String name;
int x = -1;
ArrayList<String> names = this.findKeys();
Collections.sort(names);
System.out.println("Zu folgenden Aktien sind Daten gespeichert:");
System.out.println();
for (int j = 0; j < names.size(); j++) {
System.out.println("[" + j + "]: " + names.get(j));
}
System.out.println();
System.out.println("Bitte geben Sie die gewuenschte Nummer ein:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
s = br.readLine();
if (s == null){
return;
}
} catch (IOException e) {
System.out.println("Fehler: Diese Nummer ist nicht vergeben.");
this.selectByStockName();
return;
}
System.out.println("hallo" + s);
if (s.equals("EXIT")) {
System.out.println("hier");
return;
} else {
try {
System.out.println("3");
x = Integer.parseInt(s);
} catch (Exception e) {
System.out.println("Fehler: Diese Nummer ist nicht vergeben.");
this.selectByStockName();
return;
}
if (x < 0 || x > names.size() - 1) {
System.out.println("hier1");
System.out.println("Fehler: Diese Nummer ist nicht vergeben.");
this.selectByStockName();
} else {
System.out.println("x ist " + x);
name = names.get(x);
for (int i = 0; i < db.getAllData().get(name).size(); i++) {
System.out.println(db.getEntry(name).get(i));
}
this.selectByStockName();
}
}
}
/**
* Diese Methode nimmt auf der Konsole Befehle entgegen und gibt die
* angeforderten Berechnungsergebnisse zurueck. Die Eingaben sollen ueber
* die Konsole durchgefuehrt werden, auch hierfuer dient ein
* BufferedStreamReader, welchem der InputStreamReader System.in uebergeben
* wird. Die Interaktion soll dabei wie folgt ablaufen:
*
* 1. Der Benutzer wird gefragt, WAS berechnet werden soll
* ("Was moechten Sie berechnen?"). Moegliche Eingaben sind "MIN", "MAX",
* "AVG" und "EXIT". Fehleingaben werden dabei folgendermassen quittiert:
*
* Unbekannter Befehl - moegliche Befehle sind MIN, MAX und AVG.
*
* 2. Der Benutzer wird gefragt, WO dies berechnet werden soll, also ob
* lokal fuer eine einzelne Aktie oder global ueber alle vorhandenen Daten
* ("Lokal oder global?"). Erlaubte Eingaben sind daher "LOK", "GLOB" und
* "EXIT". Fehleingaben sollen dabei folgendermassen quittiert werden:
*
* Unbekannter Befehl - moegliche Befehle sind GLOB und LOK.
*
* 3. Wurde "GLOB" gewaehlt, wird das Ergebnis der Berechnung ausgegeben.
* Das Format der Ausgabe muss im globalen Fall wie folgt aussehen:
*
* < Name > erzielte am < Datum > das global [beste|schlechteste] Ergebnis:
* < Wert >. oder: Der globale Durchschnitt aller Werte ist < Wert >.
*
* 4. Wurde eine lokale Berechnung ausgewaehlt, wird nun nach dem Namen der
* Aktie gefragt ("Wie ist der Name der Aktie?"). Auch hier kann als Befehl
* "EXIT" eingegeben werden. Dann wird das Ergebnis der lokalen Berechnung
* ausgegeben. Das Format der Ausgabe muss dabei wie folgt aussehen:
*
* Ergebnis: Das Unternehmen < Name > erzielte am < Datum > ein
* [Maximum|Minimum] von < Wert >. oder: Ergebnis: < Name > erzielte ein
* durchschnittliches Ergebnis von < Wert >.
*
* Werden zu einer Aktie keine Daten gefunden, soll
*
* Entschuldigung, aber zu einer solchen Aktie liegen keine Daten vor.
*
* ausgegeben werden.
*
* Sollte bei einer der voranstehenden Punkte eine Fehleingabe gemacht und
* die entsprechende (oben beschriebene) Programmausgabe gemacht worden
* sein, so ist zum Anfang der Methode zurueckzuspringen, d.h. die
* Interaktion beginnt von vorne!
*
* Die Methode soll durch den Befehl "EXIT" beendet werden, ungeachtet davon
* an welchem Punkt der Interaktion sie sich befindet.
*
* Nach einem Durchlauf soll die Methode wieder an den Anfang der
* Interaktion springen, d.h. insbesondere dass die Methode so lange laeuft,
* bis sie per "EXIT"-Befehl beendet wird.
*/
public void interactiveExploration() {
String what = null;
String where = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Was moechten Sie berechnen?");
try {
what = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
this.interactiveExploration();
return;
}if (what == null){
return;
}
if (what.equals("EXIT")) {
return;
} else if ("MAX".equals(what) || "MIN".equals(what)
|| "AVG".equals(what)) {
System.out.println("Lokal oder global?");
try {
where = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
this.interactiveExploration();
return;
}
if (where.equals("EXIT")) {
return;
} else if (where.equals("GLOB") && what.equals("MAX")) {
Vector<Object> max = se.getGlobalMaximum();
Dataset da = (Dataset) max.get(1);
String name = (String) max.get(0);
Date d = da.getDate();
double value = da.getHigh();
System.out.println(name + " erzielte am " + d
+ " das global beste Ergebnis: " + value + ".");
this.interactiveExploration();
} else if (where.equals("GLOB") && what.equals("MIN")) {
Vector<Object> max = se.getGlobalMinimum();
Dataset da = (Dataset) max.get(1);
String name = (String) max.get(0);
Date d = da.getDate();
double value = da.getLow();
System.out.println(name + " erzielte am " + d
+ " das global schlechteste Ergebnis: " + value + ".");
this.interactiveExploration();
} else if (where.equals("GLOB") && what.equals("AVG")) {
double value = se.getGlobalAverage();
System.out.println("Der globale Durchschnitt aller Werte ist "
+ value + ".");
this.interactiveExploration();
} else if (where.equals("LOK")) {
ArrayList<String> keys = this.findKeys();
System.out.println("Wie ist der Name der Aktie?");
String name = null;
try {
name = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
this.interactiveExploration();
return;
}
if (name.equals("EXIT")) {
return;
} else if (what.equals("MAX") && keys.contains(name)) {
double value = se.getLocalMaximum(name).getHigh();
Date d = se.getLocalMaximum(name).getDate();
System.out.println("Ergebnis: Das Unternehmen " + name
+ " erzielte am " + d + " ein Maximum von " + value
+ ".");
this.interactiveExploration();
} else if (what.equals("MIN") && keys.contains(name)) {
double value = se.getLocalMinimum(name).getHigh();
Date d = se.getLocalMinimum(name).getDate();
System.out.println("Ergebnis: Das Unternehmen " + name
+ " erzielte am " + d + " ein Minimum von " + value
+ ".");
this.interactiveExploration();
} else if (what.equals("AVG") && keys.contains(name)) {
double value = se.getLocalAverage(name);
System.out.println("Ergebnis: " + name
+ " erzielte ein durchschnittliches Ergebnis von "
+ value + ".");
this.interactiveExploration();
} else {
System.out
.println("Entschuldigung, aber zu einer solchen Aktie liegen keine Daten vor.");
this.interactiveExploration();
}
} else {
System.out
.println("Unbekannter Befehl - moegliche Befehle sind GLOB und LOK.");
this.interactiveExploration();
}
} else {
System.out
.println("Unbekannter Befehl - moegliche Befehle sind MIN, MAX und AVG.");
this.interactiveExploration();
}
}
private ArrayList<String> findKeys() {
ArrayList<String> keys = new ArrayList<String>();
Set<String> keyset = se.getDB().getAllData().keySet();
Iterator<String> it = keyset.iterator();
while (it.hasNext()) {
String share = (String) it.next().toString();
keys.add(share);
}
return keys;
}
/**
* Eine main-Methode zum testen Ihrer Implementierung. Zunaechst prueft die
* Methode, ob genau 2 Parameter als Argumente uebergeben wurden. Ist dies
* nicht der Fall, wird die Meldung Das Programm erwartet genau 2 Parameter:
* den Modus, sowie die Angabe der Daten-Datei. ausgegeben. Andernfalls wird
* abgefragt, welcher der Explorationsmodi (byName oder interactive)
* durchgefuehrt werden soll und die entsprechende Methode (s.o.) startet
* die Exploration. Wurde kein gueltiger Modus als Argument uebergeben, soll
* das Programm die Meldung Fehlerhafter Parameter. ausgegeben werden.
*
* @param args
*/
public static void main(String[] args) {
if (args.length != 2) {
System.out
.println("Das Programm erwartet genau 2 Parameter: den Modus, sowie die Angabe der Daten-Datei.");
} else {
ShareExploration s = new ShareExploration((String) args[1]);
CLShareExploration cls = new CLShareExploration(s);
if (args[0].equals("byName")) {
cls.selectByStockName();
} else if (args[0].equals("interactive")) {
cls.interactiveExploration();
} else {
System.out.println("Fehlerhafter Parameter.");
}
}
}
}