PR2-Roboterfabrik/Roboterfabrik/src/Domäne/RobotFactory.java

154 lines
4.7 KiB
Java

package Domäne;
import java.util.HashMap;
import tpe.exceptions.roboter.exceptions.RobotException;
/**
*
* Schnittstelle zwischen Roboter und FactorySystem.
* hier wird auch das Objekt Pris erzeugt.
* RobotFactory hat eine HashMap wo die Roboter gelagert werden.
*
*/
public class RobotFactory {
private String name;
private Roboter pris = Nexus6.getInstance();
private HashMap<Integer, Roboter> roboterLager = new HashMap<>();
public RobotFactory(String name) {
this.name = name;
roboterLager.put(pris.getId(), pris);
}
/**
* Hier werden Roboter erzeugt und in die HashMap gespeichert.
* Außerdem wird durh die if-Abfrage zweischen R2D2 und C3PO unterschieden.
* @param robotType
* @param name
* @return id vom Roboter der gerade erzeugt worden ist.
*/
public int addRobot(RobotType robotType, String name) {
Roboter roboter;
if (RobotType.R2D2 == robotType) {
roboter = new R2D2(name, idVergeben(0, 9999));
roboterLager.put(roboter.getId(), roboter);
return roboter.getId();
} else if (RobotType.C3PO == robotType) {
roboter = new C3PO(name, idVergeben(10000, 19999));
roboterLager.put(roboter.getId(), roboter);
return roboter.getId();
} else
return -1;
}
/**
*
* @return name um eventuell den Namen der RobotFactory zurückzugeben.
*/
public String getName() {
return name;
}
/**
* gibt den gesuchten Roboter mit der passenden ID zurück.
* @param id
* @return Roboter objekt
*/
public Roboter findeRoboter(int id) {
return roboterLager.get(id);
}
/**
* Diese Methode ist wichtig um die Ids zufällig zur vergeben.
* Je nach robotType wird ein anders min und max übergeben. Das gibt
* dann den Bereich an wo die Zahl zufällig vergeben wird.
* Wurde diese ID schon vergeben, so ruft sich die Methode von selbst auf.
* @param min minimum vom Bereich
* @param max Maximum vom Bereich
* @return randomValue die zufällige und noch nicht vergebene ID
*/
private int idVergeben(int min, int max) {
int randomValue = (int) (Math.random() * (max - min)) + min;
if (roboterLager.containsKey(randomValue)) {
idVergeben(min, max);
}
return randomValue;
}
/**
* gibt anhand der ID den Zustand des Roboters zurück.
* @param id
* @return zustand vom Roboter
*/
public boolean roboterZustand(int id) {
Roboter r = findeRoboter(id);
boolean zustand = r.isPowerOn();
return zustand;
}
/**
* Um den richtigen Roboter anhand der ID An oder Aus zu schalten.
* @param id um den richtigen Roboter zu finden
* @return zustand vom Roboter
*/
public boolean schalterAnAus(int id) {
Roboter r = findeRoboter(id);
r.triggerPowerSwitch();
boolean zustand = r.isPowerOn();
return zustand;
}
/**
* Hier werden beide Methoden aufgerufen. Zuerst wird der richtige
* Roboter gefunden, dann werden die zahlen von der think()-methode sortiert, und
* anschließend mit den richtigen Trennzeichen mit der speak()-methode ausgegeben.
* @param id
* @param zahlen
* @return ausgabe als String Sortiert, mit den richtigen Trennzeichen
* @throws RobotException falls der Roboter Aus ist oder zahlen[] die Zahl 42 enthält.
*/
public String aufrufSpeakAndThink(int id, int[] zahlen) throws RobotException {
Roboter r = findeRoboter(id);
int[] sotiert = r.think(zahlen);
String ausgabe = r.speak(sotiert);
return ausgabe;
}
/**
* Hier wird der letzte Fehler zurückgegeben, den der Roboter geworfen hat.
* @param id
* @return RobotException letzte Ausnahme vom Roboter
*/
public RobotException letzterFehler(int id) {
Roboter r = findeRoboter(id);
return r.getLastException();
}
/**
* Hier werden anhand der Id Typ, Name und Seriennummer vom Roboter zurückgegeben.
* @param id
* @return ausgabe als String für die Daten des Roboters
*/
public String datenDesRoboters(int id) {
Roboter r = findeRoboter(id);
String robotType = r.getRobotType().toString();
String name = r.getName();
int seriennummer = r.getId();
String ausgabe = "RoboterType: " + robotType + "; Name: " + name + "; Seriennummer: " + seriennummer;
return ausgabe;
}
/**
* gibt die größe vom roboterLager zurück.
* Wird für das Testen verwendet.
* @return int größe des Lagers
*/
public int getRoboterLagerSize() {
return roboterLager.size();
}
/**
* Gibt einen boolean zurück um zu schauen ob dieser Roboter schon existiert.
* @param id um zu schauen ob diese Id schon vergeben wurde
* @return boolean true bedeutet, dass es diesen Roboter gibt
*/
public boolean istDieserRoboterDa(int id) {
return roboterLager.containsKey(id);
}
}