Hallo,
zurseit haben wir das Thema RMI und nun haben wir eine Aufgabe bekommen. Ich habe die Aufgabe bearbeitet und würde mich freuen wenn jemand von euch Zeit findet da drüber zu schauen. Habe das Gefühl das ich am Prinzip vorbei gearbeitet habe aber dazu gleich mehr.
Also zur Aufgabe:
Es gibt Kunde, Konto und Bank. Kunden können mehrere Konten verwalten bei mehreren Banken.
Kunde kann bei einer Bank (Interface)
Konto erstellen(mit Name, Passwort und Kontostand => anfangs 0 und ein Key für die Bank)
einzahlen mit EIngabe des Namens und Key
abheben mit Eingabe des Namens, Passwort, Menge und Key
Kontostand angeben lassen durch Eingabe von Name, Passwort und Key
Dazu sollen benutzerdefinierte Exception geworfen werden.
Falls weitere Details gebraucht werden liefere ich sie, aber erstmal gehts darum ob ich das Prinzip RMI richtig umgesetzt habe.
Meine Bedenken
- UserFunctionImpl hat die Funktionen aus dem Kunden Inteface implementiert. Damit ich in die Konten-Objekte ein und auszahlen kann habe ich eine setKonto() Methode geschrieben, damit ich das Konto-Objekt in die "Klasse" UserFunctionImpl setzen kann. Ist unschön, und auch so ein Ding wobei ich mir denke, da habe ich was falsch gemacht.
- Laut Aufgabenstellung soll der Kunde den Key, Name und Passwort eingeben, um halt Aktionen am Konto auszuführen. Da ich mehrere Banken habe weiß ich nicht wie der Kunde einfach nen Key eingeben soll ohne zu wissen zur welcher Bank dieser Key gehört.
userF.payIn(key, name, pw, amount){
KontoInter k = bank1.getKonto(key); //bei mehreren Banken nicht klar welches Konto gemeint ist
..... }
Ich hätte halt das auseinandergezogen. Nach dem Motto der Kunde geht zuerst zur Bank und gibt da dann den Key ein.
KontoInter k = bank.getKonto(key)
userF.setKonto(k) // Bedenken #1 - siehe oben
userF.payIN() ....
Ich hoffe es ist klar was ich meine.
Nun der gesamte Code:
zurseit haben wir das Thema RMI und nun haben wir eine Aufgabe bekommen. Ich habe die Aufgabe bearbeitet und würde mich freuen wenn jemand von euch Zeit findet da drüber zu schauen. Habe das Gefühl das ich am Prinzip vorbei gearbeitet habe aber dazu gleich mehr.
Also zur Aufgabe:
Es gibt Kunde, Konto und Bank. Kunden können mehrere Konten verwalten bei mehreren Banken.
Kunde kann bei einer Bank (Interface)
Konto erstellen(mit Name, Passwort und Kontostand => anfangs 0 und ein Key für die Bank)
einzahlen mit EIngabe des Namens und Key
abheben mit Eingabe des Namens, Passwort, Menge und Key
Kontostand angeben lassen durch Eingabe von Name, Passwort und Key
Dazu sollen benutzerdefinierte Exception geworfen werden.
Falls weitere Details gebraucht werden liefere ich sie, aber erstmal gehts darum ob ich das Prinzip RMI richtig umgesetzt habe.
Meine Bedenken
- UserFunctionImpl hat die Funktionen aus dem Kunden Inteface implementiert. Damit ich in die Konten-Objekte ein und auszahlen kann habe ich eine setKonto() Methode geschrieben, damit ich das Konto-Objekt in die "Klasse" UserFunctionImpl setzen kann. Ist unschön, und auch so ein Ding wobei ich mir denke, da habe ich was falsch gemacht.
- Laut Aufgabenstellung soll der Kunde den Key, Name und Passwort eingeben, um halt Aktionen am Konto auszuführen. Da ich mehrere Banken habe weiß ich nicht wie der Kunde einfach nen Key eingeben soll ohne zu wissen zur welcher Bank dieser Key gehört.
userF.payIn(key, name, pw, amount){
KontoInter k = bank1.getKonto(key); //bei mehreren Banken nicht klar welches Konto gemeint ist
..... }
Ich hätte halt das auseinandergezogen. Nach dem Motto der Kunde geht zuerst zur Bank und gibt da dann den Key ein.
KontoInter k = bank.getKonto(key)
userF.setKonto(k) // Bedenken #1 - siehe oben
userF.payIN() ....
Ich hoffe es ist klar was ich meine.
Nun der gesamte Code:
Java:
import java.util.HashMap;
import java.util.Map;
public class Bank {
private Map<Integer, KontoInter> map;
public Bank() {
this.map = new HashMap<Integer, KontoInter>();
}
public void addKonto(int key, KontoInter konto) {
this.map.put(key, konto);
}
public KontoInter getKonto(int key) {
return this.map.get(key);
}
}
//Schnittstellendefinition:Datenstruktur -> Complex
import java.io.*;
import java.util.List;
public class KontoInter implements Serializable {
public static final long serialVersionUID = 1L;
public double cash;
public String owner;
public String password;
public KontoInter(String owner, String password) {
this.cash = 0.0;
this.owner = owner;
this.password = password;
}
public double getCash() {
return cash;
}
public String getOwner() {
return owner;
}
public String getPassword() {
return password;
}
public void setCash(double cash) {
this.cash = cash;
}
}
//Schnittstellendefinition:Exception -> ComplexException
import java.rmi.*;
public class FinanceException extends Exception {
public FinanceException(String msg) {
super(msg);
}
}
//Schnittstellendefinition: Anwendungsmethode -> ComplexAdder
import java.rmi.*;
public interface UserFunction extends Remote {
KontoInter createKonto(String name, String password) throws RemoteException, FinanceException;
public void setKonto(KontoInter konto) throws RemoteException, FinanceException;
void payIn(String name, double amount) throws RemoteException, FinanceException;
void takeOff(String name, String password, double amount) throws RemoteException, FinanceException;
KontoInter showKonto(String name, String password) throws RemoteException, FinanceException;
}
// Schnittstellenimplementierung -> ComplexAdderImpl
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
public class UserFunctionImpl extends UnicastRemoteObject implements UserFunction {
private static final long serialVersionUID = 1L;
private KontoInter konto;
public UserFunctionImpl(String name, Registry reg) throws RemoteException {
try {
reg.rebind(name, this);
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
public void setKonto(KontoInter konto) {
this.konto = konto;
}
public synchronized KontoInter createKonto(String name, String password) throws RemoteException, FinanceException {
return new KontoInter(name, password);
}
public synchronized void payIn(String name, double amount) throws RemoteException, FinanceException {
if (!name.equals(konto.getOwner())) {
throw new FinanceException("Wrong name");
}
double newCash = konto.getCash() + amount;
konto.setCash(newCash);
}
public synchronized void takeOff(String name, String password, double amount)
throws RemoteException, FinanceException {
if (!name.equals(konto.getOwner()) || !password.equals(konto.getPassword())) {
throw new FinanceException("Wrong log in data");
}
double newCash = konto.getCash() - amount;
if (newCash < 0) {
throw new FinanceException("Not enough money");
}
konto.setCash(newCash);
}
public synchronized KontoInter showKonto(String name, String password) throws RemoteException, FinanceException {
if (!name.equals(konto.getOwner()) || !password.equals(konto.getPassword())) {
throw new FinanceException("Wrong log in data");
}
return konto;
}
}
import java.rmi.*;
import java.rmi.registry.*;
public class Server {
public static void main(String args[]) {
try {
Registry reg = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
UserFunctionImpl user = new UserFunctionImpl("UserFunctionImpl", reg);
System.out.println("Server ready...");
} catch (Exception e) {
System.out.println("Exception:" + e.getMessage());
}
}
}
import java.rmi.*;
import java.rmi.registry.*;
public class Client {
public static void main(String args[]) {
try {
Registry reg = LocateRegistry.getRegistry(Registry.REGISTRY_PORT);
UserFunction userF = (UserFunction) reg.lookup("UserFunctionImpl");
Bank bank1 = new Bank();
Bank bank2 = new Bank();
KontoInter k1 = userF.createKonto("Hans", "1234");
KontoInter k2 = userF.createKonto("Peter", "5678");
KontoInter k3 = userF.createKonto("Jana", "9876");
bank1.addKonto(1, k1);
bank1.addKonto(2, k2);
bank2.addKonto(3, k3);
userF.setKonto(k1);
userF.payIn("1Hans", 150.3);
System.out.println(userF.showKonto("Hans", "1234").getCash());
System.out.println("Test");
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
}