Engineering School, 2nd year
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

201 lines
5.4 KiB

/*
* #(@)BankImpl.java ENSICAEN 2006-04-04
*
* ENSICAEN
* 6 Boulevard Marechal Juin
* F-14050 Caen Cedex
*
* Ce fichier est l'oeuvre d'eleves de l'ENSI de Caen. Il ne peut etre
* reproduit, utilise ou modifie sans l'avis express de ses auteurs.
*/
/**
*
* @author MASSE Nicolas (2004-Groupe4-LIMIN) <nicolas27.masse@laposte.net>
* @author LIMIN Thomas (2004-Groupe4-MASSE) <thomas.limin@laposte.net>
* @version 1.0
*/
package Bank;
import BankManagement.*;
import java.util.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
/**
* A Bank servant.
*/
class BankImpl extends BankPOA {
/**
* Bank servant constructor
*/
public BankImpl() {
//this.account = account;
this.currentAccountNumber = 0;
this.currentSessionID = 0;
this.accounts = new HashMap<Integer, AccountImpl>(16);
this.users = new HashMap<String, String>(16);
this.sessions = new HashMap<Integer, String>(16);
// Workaround : file storage not implemented (not very "corba related")
// so users are created here and account related data are reinitialized
// every BankServer relaunch. (interessant kind of periodic revolution ;-) )
users.put("Thomas", "grouik");
users.put("Nicolas", "pouet");
users.put("utest", "ptest");
}
/**
* Create a new account. If the session is incorrect
* it returns 0;
*
* @param sessionID
* @return the new account number
*/
public int create (int sessionID) {
int accNumber = 0;
String username = sessions.get(sessionID);
if (username != null) {
accNumber = this.getNextAccountNumber();
AccountImpl acc = new AccountImpl(username);
try {
_default_POA().activate_object(acc);
} catch (org.omg.PortableServer.POAPackage.ServantAlreadyActive e) {
System.err.println(e.getMessage());
} catch (org.omg.PortableServer.POAPackage.WrongPolicy e) {
System.err.println(e.getMessage());
}
this.accounts.put(accNumber, acc);
System.out.println("User " + username + " create a new account with number: " + accNumber + "(session id: " + sessionID + ")" );
} else {
System.out.println("Invalid session id: " + sessionID);
}
return accNumber;
}
/**
* Provide an account stub.
*
* @param sessionID
* @param acc_num
* @return the account stub
*/
public BankManagement.Account getAccount (int acc_num, int sessionID) throws BankManagement.no_such_account {
String username = null;
AccountImpl acc = null;
Account aref = null;
username = this.sessions.get(sessionID);
if (username != null) {
acc = this.accounts.get(acc_num);
} else {
System.out.println("Invalid session id: " + sessionID);
throw new BankManagement.no_such_account();
}
if ((acc == null || !(acc.getUsername().equals(username)))) {
System.out.println("No account " + acc_num + " for user " + username +" (session id: " + sessionID + ")");
throw new BankManagement.no_such_account();
}
System.out.println("Provide account " + acc_num + " to " + username + " (session id: " + sessionID + ")");
try {
//get object reference from the servant
//aref = AccountHelper.narrow(_default_POA().servant_to_reference(acc));
// aref = acc._this(); // doesn't work, WHY ?????
aref = AccountHelper.narrow(this._default_POA().servant_to_reference(acc));
} catch (Exception e){}
return aref;
}
/**
* Connect a user and give him a session id or 0 if login
* or password are wrong.
*
* @param login
* @param password
* @return the session id
*/
public int connect (String login, String password) {
String storedPassword = this.users.get(login);
int sessionID = 0;
if ((storedPassword == null) || ! password.equals(storedPassword)) {
System.out.println("Connection refused for user " + login);
} else {
sessionID = this.getNextSessionID();
this.sessions.put(sessionID, login);
System.out.println("User " + login + " connected (session id: " + sessionID + ")");
}
return sessionID;
}
/**
* Discard a session id so the user have to log-in
* again to send commands.
*
* @param sessionID
*/
public void disconnect (int sessionID) {
String login = null;
login = this.sessions.remove(sessionID);
if (login != null) {
System.out.println("User " + login + " is now disconnected (previously connected with session id: " + sessionID + ")");
} else {
System.out.println("Error disconnecting session: session " + sessionID + " unknown");
}
}
/**
* Destroy an account. But where is the remaining cash deposited??
*
* @param acc_num
* @param sessionID
*/
public void del (int acc_num, int sessionID) {
String username = null;
username = this.sessions.get(sessionID);
if (username != null) {
AccountImpl acc = accounts.get(acc_num);
if (acc.getUsername().equals(username)) {
this.accounts.remove(sessionID);
}
}
}
private int getNextAccountNumber() {
return ++ this.currentAccountNumber;
}
private int getNextSessionID() {
return ++ this.currentSessionID;
}
private Account account;
private int currentAccountNumber;
private int currentSessionID;
private Map<Integer, AccountImpl> accounts;
private Map<String, String> users;
private Map<Integer, String> sessions;
}