1 package server;
2
3 import java.rmi.Remote;
4 import java.rmi.RemoteException;
5 import java.rmi.server.UnicastRemoteObject;
6 import java.math.BigDecimal;
7 import org.jstk.example.bank.Exceptions;
8 import org.jstk.example.bank.BankIntf;
9 import common.RemoteBank;
10import common.RemoteAccount;
11import common.RemoteIterator;
12import javax.security.auth.Subject;
13import java.security.PrivilegedExceptionAction;
14import java.security.PrivilegedAction;
15import java.security.PrivilegedActionException;
16
17public class RemoteBankImpl extends UnicastRemoteObject implements RemoteBank {
18 private BankIntf bi;
19 private Subject sub;
20
21 public RemoteBankImpl(BankIntf bi, Subject sub) throws RemoteException {
22 this.bi = bi;
23 this.sub = sub;
24 }
25 public RemoteAccount openAccount(BigDecimal initialDeposit) throws RemoteException {
26 final BigDecimal iDf = initialDeposit;
27 final BankIntf bif = bi;
28 final Subject subf = sub;
29 RemoteAccount rA = null;
30 try {
31 rA = (RemoteAccount)Subject.doAs(sub, new PrivilegedExceptionAction() {
32 public Object run() throws Exception {
33 return new RemoteAccountImpl(bif.openAccount(iDf), subf);
34 }
35 });
36 } catch (PrivilegedActionException pae){
37 if (pae.getException() instanceof RemoteException)
38 throw (RemoteException)pae.getException();
39 }
40 return rA;
41 }
42 public void closeAccount(String acctNo) throws Exceptions.AccountNotFound,
43 Exceptions.AccountClosed, RemoteException {
44 bi.closeAccount(acctNo);
45 }
46 public RemoteAccount getAccount(String acctNo) throws Exceptions.AccountNotFound, RemoteException {
47 final String acctNof = acctNo;
48 final BankIntf bif = bi;
49 final Subject subf = sub;
50 RemoteAccount rA = null;
51 try {
52 rA = (RemoteAccount)Subject.doAs(sub, new PrivilegedExceptionAction() {
53 public Object run() throws Exception{
54 return new RemoteAccountImpl(bif.getAccount(acctNof), subf);
55 }
56 });
57 } catch (PrivilegedActionException pae){
58 if (pae.getException() instanceof Exceptions.AccountNotFound)
59 throw (Exceptions.AccountNotFound)pae.getException();
60 }
61 return rA;
62 }
63 public RemoteIterator accounts() throws RemoteException {
64 return new RemoteIteratorImpl(bi);
65 }
66}
67