import java.io.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class BorrowingDAOImpl implements BorrowingDAO { private final String filePath; private final List borrowings = new ArrayList<>(); private final BookDAO bookDAO; private final MemberDAO memberDAO; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public BorrowingDAOImpl(String filePath, BookDAO bookDAO, MemberDAO memberDAO) { this.filePath = filePath; this.bookDAO = bookDAO; this.memberDAO = memberDAO; load(); } private void load() { try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { br.readLine(); // skip header String line; while ((line = br.readLine()) != null) { String[] arr = line.split(","); String memberId = arr[0]; String isbn = arr[1]; String borrowDateStr = arr[2]; String returnDateStr = arr.length > 3 ? arr[3] : ""; Member m = memberDAO.getById(memberId); Book b = bookDAO.getByISBN(isbn); if (m == null || b == null) { System.err.println("[WARNING] Missing book/member for borrowing: " + line); continue; // skip inconsistent entry } Date borrowDate = parseDate(borrowDateStr); Date returnDate = parseDate(returnDateStr); Borrowing borrowing = new Borrowing(m, b, borrowDate, returnDate); borrowings.add(borrowing); } } catch (IOException e) { e.printStackTrace(); } } private Date parseDate(String str) { if (str == null || str.isBlank()) return null; try { return sdf.parse(str); } catch (ParseException e) { System.err.println("Invalid date: " + str); return null; } } private String format(Date d) { return (d == null) ? "" : sdf.format(d); } // ---------------------------------------------------- @Override public List getAllBorrowings() { return borrowings; } @Override public List getBorrowingsByMember(String memberId) { List result = new ArrayList<>(); for (Borrowing b : borrowings) { if (b.getMember().getId().equals(memberId)) { result.add(b); } } return result; } @Override public List getBorrowingsByBook(String isbn) { List result = new ArrayList<>(); for (Borrowing b : borrowings) { if (b.getBook().getIsbn().equals(isbn)) { result.add(b); } } return result; } @Override public void addBorrowing(Borrowing b) { borrowings.add(b); } @Override public void saveAll() { try (PrintWriter pw = new PrintWriter(new FileWriter(filePath))) { pw.println("MemberID,ISBN,BorrowDate,ReturnDate"); for (Borrowing b : borrowings) { pw.println( b.getMember().getId() + "," + b.getBook().getIsbn() + "," + format(b.getBorrowDate()) + "," + format(b.getReturnDate()) ); } } catch (IOException e) { e.printStackTrace(); } } }