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