Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: new rec, CS not final

...

Code Block
bgColor#ffcccc
package Account;
import User.*;
  class AccountClass {
    private UserClass uc;  // uses a class defined in package User
    protected synchronized void depositFunds(String username, double amount) {
      // use a utility method of UserClass to check if username exists
      if(uc.exists(username)) { 
        // deposit the amount
      } 
    }
    protected double getBalance(String accountNumber) { /* return the account balance */ }
  }

package User;
import Account.*;
  class UserClass extends AccountClass {
    protected synchronized double getUserBalance(String accountNumber) {
      // use a method of AccountClass to get the account balance 
      return getBalance(accountNumber); 
    }
    public boolean exists(String username) { /* check whether user exists*/ }
  }

Compliant Solution

TODO. Outline below. Do not use DRAFT.

Code Block
bgColor#ccccff

public interface BankApplication {   
  void depositFunds(BankApplication ba, String username, double amount);
  double getBalance(String accountNumber);
  double getUserBalance(String accountNumber);
  boolean exists(String username); 
}

class AccountClass  {	  
  public synchronized void depositFunds(BankApplication ba, String username, double amount) {	
    // use a utility method of UserClass to check if username exists
    if(ba.exists(username)) { 
      // deposit the amount
    } 
  } 
  public double getBalance(String accountNumber) { /* return the account balance */ return 1.0; }   
}

class UserClass extends AccountClass implements BankApplication {
  public synchronized double getUserBalance(String accountNumber) {
    // use a method of AccountClass to get the account balance 
    return getBalance(accountNumber); 
  }
  public boolean exists(String username) { /* check if user exists*/ return true; }
} 


class BankOperations {
  private BankApplication ba;
  public BankOperations(BankApplication ba) {
    this.ba = ba;
  }

  public void doUserActions() {
    System.out.println(ba.exists("user"));
    System.out.println(ba.getUserBalance("1111"));
  }

  public static void main(String[] args) {
    AccountClass ac = new AccountClass();
    ac.depositFunds(new UserClass(), "user", 1.0);
    BankOperations bo = new BankOperations(new UserClass());
    bo.doUserActions();
  }
} 

Risk Assessment

Acyclic dependencies between packages can lead to fragile builds. A security vulnerability in any package will easily percolate to several other packages.

...