Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/BankAccount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
public class BankAccount {
private double balance;

public BankAccount(double balance) {
this.balance = balance;
}

public double getBalance() {
return balance;
}

public void deposit(double amount) {
balance += amount;
}

public void withdraw(double amount) {
balance -= amount;
}
}
47 changes: 47 additions & 0 deletions src/BaseTransaction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import java.util.Calendar;

public class BaseTransaction implements TransactionInterface {
protected double amount;
protected Calendar date;
protected String transactionID;

// Constructor
public BaseTransaction(double amount, Calendar date, String transactionID) {
this.amount = amount;
this.date = date;
this.transactionID = transactionID;
}

@Override
public double getAmount() {
return amount;
}

@Override
public Calendar getDate() {
return date;
}

@Override
public String getTransactionID() {
return transactionID;
}

// Common method to print transaction details
public void printTransactionDetails() {
System.out.println("Transaction ID: " + transactionID);
System.out.println("Amount: " + amount);
System.out.println("Date: " + date.getTime());
}

// Method to apply the transaction (meant to be overridden by subclasses)
public void apply(BankAccount ba) {
System.out.println("Applying transaction...");
}

// Default reverse method (can be overridden if needed)
public boolean reverse(BankAccount ba) {
System.out.println("Reversal not supported for this transaction.");
return false;
}
}
20 changes: 20 additions & 0 deletions src/DepositTransaction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import java.util.Calendar;

public class DepositTransaction extends BaseTransaction {

public DepositTransaction(double amount, Calendar date, String transactionID) {
super(amount, date, transactionID);
}

@Override
public void apply(BankAccount ba) {
ba.deposit(amount);
System.out.println("Deposit successful: " + amount);
}

@Override
public boolean reverse(BankAccount ba) {
System.out.println("Deposits cannot be reversed.");
return false;
}
}
6 changes: 6 additions & 0 deletions src/InsufficientFundsException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}
//insufficient Funds
164 changes: 17 additions & 147 deletions src/Main.java
Original file line number Diff line number Diff line change
@@ -1,156 +1,26 @@
import Lecture1_adt.*; // Import all classes from Lecture1_adt package to be used in this client code

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.ArrayList;
import java.util.List;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
/*
* Client Code for accessing the Lecture1_adt.TransactionInterface.java module
*/
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount(1000.0);
Calendar date = Calendar.getInstance();

public static void testTransaction1() {
Calendar d1 = new GregorianCalendar(); // d1 is an Object [Objects are Reference types]
Lecture1_adt.Transaction1 t1 = new Lecture1_adt.Transaction1(1000, d1); // amount and d1 are arguments

System.out.println(t1.toString());
System.out.println("Lecture1_adt.TransactionInterface Amount: \t " + t1.amount);
System.out.println("Lecture1_adt.TransactionInterface Date: \t " + t1.date);

// Please note that the Client Codes can access the data in the class directly through the dot operator
// This kind of exposure is a threat to both the Representation Independence and Preservation of Invariants
}


/** @return a transaction of same amount as t, one month later
* This is a PRODUCER of the class Lecture1_adt.Transaction2
* This code will help demostrate the Design exposures still present in transaction2 class
* */

public static Transaction2 makeNextPayment(Transaction2 t) {
Calendar d = t.getDate();
d.add(Calendar.MONTH, 1);
return new Transaction2(t.getAmount(), d);
}

/*
Testing Transaction2 class
*/
public static void testTransaction2() {

Calendar d1 = new GregorianCalendar();

Lecture1_adt.Transaction2 t = new Lecture1_adt.Transaction2(1000, d1);

Lecture1_adt.Transaction2 modified_t = makeNextPayment(t);

System.out.println("\n\nState of the Object T1 After Client Code Tried to Change the Amount");
System.out.println("Lecture1_adt.TransactionInterface Amount: \t "+modified_t.getAmount());
System.out.println("Lecture1_adt.TransactionInterface Date: \t "+modified_t.getDate().getTime());

System.out.println("\n\nHow does T2 Look Like?????");
System.out.println("Lecture1_adt.TransactionInterface Amount: \t "+modified_t.getAmount());
System.out.println("Lecture1_adt.TransactionInterface Date: \t "+modified_t.getDate().getTime());

/* Please note that Although we have solved the problem of Transaction1
* And client code can no longer use the dot (.) operator to directly access the data
* There is still some exposure especially if we pass an object of a previous Transaction2 to create a new Transaction2 object
*/

}


/** @return a list of 12 monthly payments of identical amounts
* This code will help demostrate the Design exposures still present in transaction3 class
* */
public static List<Transaction3> makeYearOfPayments (int amount) throws NullPointerException {

List<Transaction3> listOfTransaction3s = new ArrayList<Transaction3>();
Calendar date = new GregorianCalendar(2024, Calendar.JANUARY, 3);


for (int i = 0; i < 12; i++) {
listOfTransaction3s.add(new Transaction3(amount, date));
date.add(Calendar.MONTH, 1);
}
return listOfTransaction3s;
}

/*
Testing Transaction3 class
*/
public static void testTransaction3() {

List<Transaction3> allPaymentsIn2024 = makeYearOfPayments(1000);

for (Transaction3 t3 : allPaymentsIn2024) {

// Display all the 12 Transactions
for (Transaction3 transact : allPaymentsIn2024) {
System.out.println("\n\n ::::::::::::::::::::::::::::::::::::::::::::\n");
System.out.println("Lecture1_adt.TransactionInterface Amount: \t "+transact.getAmount());
System.out.println("Lecture1_adt.TransactionInterface Date: \t "+transact.getDate().getTime());
}
}

/* Please Check all the 12 transactions displayed and hwo their dates look like
* Note that Although Transaction3 class resolves to an extent the exposure in Transaction2 class
* There is still some exposure especially if we pass an object of a previous Transaction3 to create a
* new Transaction3 object
*/
}


/** @return a list of 12 monthly payments of identical amounts
* This code Show that by judicious copying and defensive programming we eliminate the exposure in Transaction3
* As defined in the constructor of Transaction4 class
* */

public static List<Transaction4> makeYearOfPaymentsFinal (int amount) throws NullPointerException {

List<Transaction4> listOfTransaction4s = new ArrayList<Transaction4>();
Calendar date = new GregorianCalendar(2024, Calendar.JANUARY, 3);


for (int i = 0; i < 12; i++) {
listOfTransaction4s.add(new Transaction4(amount, date));
date.add(Calendar.MONTH, 1);
}
return listOfTransaction4s;
}

/*
Testing Transaction3 class
*/
public static void testTransaction4() {

/*
* Call the function to make all the Twelve transaction in a year of our business
*/

List<Transaction4> transactionsIn2024 = makeYearOfPaymentsFinal(1200);
// Create DepositTransaction
DepositTransaction deposit = new DepositTransaction(500.0, date, "D123");
deposit.apply(account);
deposit.printTransactionDetails();

// Display all the 12 Transactions
for (Transaction4 transact : transactionsIn2024) {
System.out.println("\n\n ::::::::::::::::::::::::::::::::::::::::::::\n");
System.out.println("Lecture1_adt.TransactionInterface Amount: \t "+transact.getAmount());
System.out.println("Lecture1_adt.TransactionInterface Date: \t "+transact.getDate().getTime());
}
// Create WithdrawalTransaction
WithdrawalTransaction withdrawal = new WithdrawalTransaction(300.0, date, "W456");
withdrawal.apply(account);
withdrawal.printTransactionDetails();

// Please Take a look at all the 12 transaction now and compare with the outputs of the Transaction3 class
}
// Test reversal of withdrawal
withdrawal.reverse(account);

// Try to reverse deposit
deposit.reverse(account);

public static void main(String[] args) {
// This is the client code
// Uncomment the following lines to test the class which you would like to test

// testTransaction1()
// testTransaction2()
// testTransaction3()
// testTransaction4()
System.out.println("Final Balance: " + account.getBalance());
}
}
}
10 changes: 10 additions & 0 deletions src/TransactionInterface.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import java.util.Calendar;

public interface TransactionInterface {
double getAmount();
Calendar getDate();
String getTransactionID();
void printTransactionDetails();
void apply(BankAccount ba);
boolean reverse(BankAccount ba);
}
28 changes: 28 additions & 0 deletions src/WithdrawalTransaction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import java.util.Calendar;

public class WithdrawalTransaction extends BaseTransaction {

public WithdrawalTransaction(double amount, Calendar date, String transactionID) {
super(amount, date, transactionID);
}

@Override
public void apply(BankAccount ba) {
try {
if (ba.getBalance() < amount) {
throw new InsufficientFundsException("Insufficient funds for withdrawal.");
}
ba.withdraw(amount);
System.out.println("Withdrawal successful: " + amount);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}
}

@Override
public boolean reverse(BankAccount ba) {
ba.deposit(amount);
System.out.println("Withdrawal reversed: " + amount);
return true;
}
}