From 24630ee15e64ec9ee5541d4dc1faf753eae82897 Mon Sep 17 00:00:00 2001 From: NatayaP <160752534+NatayaP@users.noreply.github.com> Date: Thu, 28 Mar 2024 10:41:00 -0400 Subject: [PATCH] Lesson 12 feat: Corrected line split (#313) * feat: Created methods for guest model and checkout model * fix: Fixed package * fix:added reader.readline to each method * feat: corrected line.split * feat:added items * feat:Implemented Csv Readers * fix: Fixed mmethods --- .../factory/natayaprice/CsvDataLoader.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 lesson_12/io/io_app/src/main/java/com/codedifferently/lesson12/factory/natayaprice/CsvDataLoader.java diff --git a/lesson_12/io/io_app/src/main/java/com/codedifferently/lesson12/factory/natayaprice/CsvDataLoader.java b/lesson_12/io/io_app/src/main/java/com/codedifferently/lesson12/factory/natayaprice/CsvDataLoader.java new file mode 100644 index 00000000..92f67c69 --- /dev/null +++ b/lesson_12/io/io_app/src/main/java/com/codedifferently/lesson12/factory/natayaprice/CsvDataLoader.java @@ -0,0 +1,118 @@ +package com.codedifferently.lesson12.factory.natayaprice; + +import com.codedifferently.lesson12.factory.LibraryCsvDataLoader; +import com.codedifferently.lesson12.models.CheckoutModel; +import com.codedifferently.lesson12.models.LibraryDataModel; +import com.codedifferently.lesson12.models.LibraryGuestModel; +import com.codedifferently.lesson12.models.MediaItemModel; +import com.opencsv.CSVReader; +import com.opencsv.exceptions.CsvValidationException; +import java.io.FileReader; +import java.io.IOException; +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; + +@Service +public class CsvDataLoader implements LibraryCsvDataLoader { + + @Override + public LibraryDataModel loadData() { + LibraryDataModel libraryDataModel = new LibraryDataModel(); + try { + libraryDataModel.mediaItems = readMediaItemsFromCsv("csv/media_items.csv"); + libraryDataModel.guests = readGuestsFromCsv("csv/guests.csv"); + populateGuestsWithCheckouts("csv/checked_out_items.csv", libraryDataModel.guests); + } catch (IOException | CsvValidationException e) { + throw new RuntimeException("Failed to load data from CSV files", e); + } + return libraryDataModel; + } + + private List readMediaItemsFromCsv(String filePath) + throws IOException, CsvValidationException { + List mediaItems = new ArrayList<>(); + try (CSVReader reader = + new CSVReader(new FileReader(new ClassPathResource(filePath).getFile()))) { + String[] header = reader.readNext(); // Skip header + String[] line; + while ((line = reader.readNext()) != null) { + MediaItemModel mediaItem = parseMediaItem(line); + mediaItems.add(mediaItem); + } + } + return mediaItems; + } + + private MediaItemModel parseMediaItem(String[] line) { + MediaItemModel mediaItem = new MediaItemModel(); + mediaItem.type = line[0]; + mediaItem.id = UUID.fromString(line[1]); + mediaItem.title = line[2]; + mediaItem.isbn = line[3]; + mediaItem.authors = List.of(line[4].split("\\s*,\\s*")); + mediaItem.pages = parseInteger(line[5]); + mediaItem.runtime = parseInteger(line[6]); + mediaItem.edition = line[7]; + return mediaItem; + } + + private int parseInteger(String value) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return 0; + } + } + + private List readGuestsFromCsv(String filePath) + throws IOException, CsvValidationException { + List guests = new ArrayList<>(); + try (CSVReader reader = + new CSVReader(new FileReader(new ClassPathResource(filePath).getFile()))) { + String[] header = reader.readNext(); // Skip header + String[] line; + while ((line = reader.readNext()) != null) { + LibraryGuestModel guest = new LibraryGuestModel(); + guest.type = line[0]; + guest.name = line[1]; + guest.email = line[2]; + guests.add(guest); + } + } + return guests; + } + + private void populateGuestsWithCheckouts(String filePath, List guests) + throws IOException, CsvValidationException { + Map> checkoutsByGuestEmail = new HashMap<>(); + try (CSVReader reader = + new CSVReader(new FileReader(new ClassPathResource(filePath).getFile()))) { + String[] header = reader.readNext(); // Skip header + String[] line; + while ((line = reader.readNext()) != null) { + String email = line[0]; + CheckoutModel checkout = parseCheckout(line); + checkoutsByGuestEmail.computeIfAbsent(email, k -> new ArrayList<>()).add(checkout); + } + } + // Assign checked-out items to respective guests + for (LibraryGuestModel guest : guests) { + List checkouts = + checkoutsByGuestEmail.getOrDefault(guest.email, new ArrayList<>()); + guest.checkedOutItems = checkouts; + } + } + + private CheckoutModel parseCheckout(String[] line) { + CheckoutModel checkout = new CheckoutModel(); + checkout.itemId = UUID.fromString(line[1]); + checkout.dueDate = Instant.parse(line[2]); + return checkout; + } +}