/
CsvDataLoader.java
118 lines (109 loc) · 4.21 KB
/
CsvDataLoader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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<MediaItemModel> readMediaItemsFromCsv(String filePath)
throws IOException, CsvValidationException {
List<MediaItemModel> 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<LibraryGuestModel> readGuestsFromCsv(String filePath)
throws IOException, CsvValidationException {
List<LibraryGuestModel> 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<LibraryGuestModel> guests)
throws IOException, CsvValidationException {
Map<String, List<CheckoutModel>> 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<CheckoutModel> 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;
}
}