-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProfileManager.java
More file actions
179 lines (152 loc) · 6.62 KB
/
Copy pathProfileManager.java
File metadata and controls
179 lines (152 loc) · 6.62 KB
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package model;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ProfileManager {
private static final Logger logger = Logger.getLogger(ProfileManager.class.getName());
private final String FILE_PATH;
private static final String DELIMITER = "\\|";
private static final String LIST_DELIMITER = ",";
// Field positions for consistent parsing
private static final int ID_INDEX = 0;
private static final int NAME_INDEX = 1;
private static final int PROVIDER_TYPE_INDEX = 2;
private static final int BIO_INDEX = 3;
private static final int SPECIALTIES_INDEX = 4;
private static final int AVAILABILITY_INDEX = 5;
private static final int SAMPLE_MEDIA_INDEX = 6;
private static final int RATING_INDEX = 7;
public ProfileManager(String filePath) {
this.FILE_PATH = filePath;
logger.log(Level.INFO, "Initializing ProfileManager with file: {0}", filePath);
}
public void saveProfiles(List<ServiceProvider> providers) throws IOException {
if (providers == null) {
throw new IllegalArgumentException("Providers list cannot be null");
}
File file = new File(FILE_PATH);
File parentDir = file.getParentFile();
if (parentDir != null && !parentDir.exists() && !parentDir.mkdirs()) {
throw new IOException("Failed to create directory for " + FILE_PATH);
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
for (ServiceProvider provider : providers) {
String line = String.join("|",
provider.getId(),
provider.getName(),
provider.getProviderType(),
provider.getBio(),
String.join(LIST_DELIMITER, provider.getSpecialties()),
String.join(LIST_DELIMITER, provider.getAvailability()),
String.join(LIST_DELIMITER, provider.getSampleMedia()),
String.valueOf(provider.getRating())
);
writer.write(line);
writer.newLine();
}
logger.log(Level.INFO, "Successfully saved {0} profiles", providers.size());
} catch (IOException e) {
logger.log(Level.SEVERE, "Error saving profiles", e);
throw e;
}
}
public List<ServiceProvider> loadProfiles() {
List<ServiceProvider> providers = new ArrayList<>();
File file = new File(FILE_PATH);
if (!file.exists()) {
logger.log(Level.WARNING, "Data file not found at: {0}", FILE_PATH);
return providers;
}
if (file.length() == 0) {
logger.log(Level.INFO, "Data file is empty");
return providers;
}
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
int lineNumber = 0;
while ((line = reader.readLine()) != null) {
lineNumber++;
line = line.trim();
if (line.isEmpty()) {
continue;
}
try {
String[] fields = line.split(DELIMITER, -1);
if (fields.length != 8) {
logger.log(Level.WARNING, "Invalid field count at line {0}. Expected 8, got {1}",
new Object[]{lineNumber, fields.length});
continue;
}
ServiceProvider provider = parseProvider(fields);
if (provider != null) {
providers.add(provider);
}
} catch (Exception e) {
logger.log(Level.WARNING, "Error parsing line " + lineNumber, e);
}
}
logger.log(Level.INFO, "Loaded {0} profiles from file", providers.size());
} catch (IOException e) {
logger.log(Level.SEVERE, "Error loading profiles", e);
}
return providers;
}
private ServiceProvider parseProvider(String[] fields) {
try {
String id = fields[ID_INDEX].trim();
String name = fields[NAME_INDEX].trim();
String providerType = fields[PROVIDER_TYPE_INDEX].trim();
String bio = fields[BIO_INDEX].trim();
List<String> specialties = parseList(fields[SPECIALTIES_INDEX]);
List<String> availability = parseList(fields[AVAILABILITY_INDEX]);
List<String> sampleMedia = parseList(fields[SAMPLE_MEDIA_INDEX]);
double rating = parseRating(fields[RATING_INDEX]);
if ("photographer".equalsIgnoreCase(providerType)) {
return new Photographer(id, name, bio, specialties, availability, sampleMedia, rating);
} else {
return new Videographer(id, name, bio, specialties, availability, sampleMedia, rating);
}
} catch (Exception e) {
logger.log(Level.WARNING, "Error parsing provider", e);
return null;
}
}
private List<String> parseList(String field) {
if (field == null || field.trim().isEmpty()) {
return new ArrayList<>();
}
return Arrays.asList(field.split(LIST_DELIMITER));
}
private double parseRating(String ratingField) {
try {
return Double.parseDouble(ratingField.trim());
} catch (NumberFormatException e) {
logger.log(Level.WARNING, "Invalid rating value: {0}", ratingField);
return 0.0;
}
}
public void addProfile(ServiceProvider provider) throws IOException {
if (provider == null) {
throw new IllegalArgumentException("Provider cannot be null");
}
List<ServiceProvider> providers = loadProfiles();
providers.add(provider);
saveProfiles(providers);
logger.log(Level.INFO, "Added new profile with ID: {0}", provider.getId());
}
public ServiceProvider getProfileById(String id) {
if (id == null || id.trim().isEmpty()) {
return null;
}
return loadProfiles().stream()
.filter(p -> id.equals(p.getId()))
.findFirst()
.orElse(null);
}
public List<ServiceProvider> getAllProfiles() {
return loadProfiles();
}
}