Skip to content

Commit 512dfa5

Browse files
author
Никита
committed
- FileReader class written
- Added comprehensive Javadoc comments to FileReader class - Documented class purpose, constructor parameters and method behaviors - Described file format requirements and validation rules - Improved code documentation for better maintainability"
1 parent d59a109 commit 512dfa5

5 files changed

Lines changed: 123 additions & 6 deletions

File tree

src/main/java/input/FileReader.java

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package input.Strategy;
2+
3+
import dto.Client;
4+
import input.CustomCollection;
5+
6+
import java.io.IOException;
7+
8+
/**
9+
* Интерфейс стратегии для ввода данных клиентов.
10+
* Реализует паттерн Стратегия для различных способов получения объектов {@link Client}.
11+
* Каждая реализация представляет конкретный способ получения данных
12+
* Реализации должны гарантировать, что возвращаемые объекты {@link Client}
13+
* являются валидными
14+
*/
15+
public interface ClientInputStrategy {
16+
CustomCollection<Client> getData() throws IOException;
17+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package input.Strategy;
2+
3+
import dto.Client;
4+
import input.CustomCollection;
5+
6+
import java.io.File;
7+
import java.io.IOException;
8+
import java.nio.charset.StandardCharsets;
9+
import java.nio.file.Files;
10+
import java.nio.file.Path;
11+
import java.nio.file.Paths;
12+
import java.util.Optional;
13+
import java.util.stream.Stream;
14+
15+
/**
16+
* Стратегия для чтения данных о клиентах из файла.
17+
* Реализует интерфейс ClientInputStrategy для получения коллекции клиентов.
18+
*/
19+
public class FileReader implements ClientInputStrategy {
20+
private final String filePath;
21+
22+
public FileReader(String filePath) {
23+
this.filePath = filePath;
24+
}
25+
26+
/**
27+
* Читает данные о клиентах из файла и возвращает их в виде коллекции.
28+
* Файл должен содержать строки в формате: Имя|Телефон|ID
29+
* Телефон должен соответствовать формату: +7XXXXXXXXXX (11 цифр после +7)
30+
*
31+
* @return коллекция клиентов, прочитанных из файла
32+
* @throws RuntimeException если файл не найден или произошла ошибка ввода-вывода
33+
*/
34+
@Override
35+
public CustomCollection<Client> getData() {
36+
CustomCollection<Client> clients = new CustomCollection<>();
37+
Path path = Paths.get(filePath);
38+
39+
if (!Files.exists(path)) {
40+
throw new RuntimeException("File not found: " + filePath);
41+
}
42+
43+
try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) {
44+
lines
45+
.filter(line -> !line.trim().isEmpty())
46+
.map(this::parseToClient)
47+
.filter(Optional::isPresent)
48+
.map(Optional::get)
49+
.map(Client.ClientBuilder::build)
50+
.forEach(clients::add);
51+
52+
} catch (IOException e) {
53+
throw new RuntimeException(e);
54+
}
55+
return clients;
56+
}
57+
58+
/**
59+
* Парсит строку из файла в объект ClientBuilder.
60+
* Строка должна быть в формате: Имя|Телефон|ID
61+
*
62+
* @param line строка из файла для парсинга
63+
* @return Optional содержащий ClientBuilder если строка валидна,
64+
* или пустой Optional если строка содержит ошибки формата
65+
*/
66+
public Optional<Client.ClientBuilder> parseToClient(String line) {
67+
try {
68+
String[] parts = line.split("\\|");
69+
if (parts.length != 3) {
70+
throw new IllegalArgumentException("Invalid data format");
71+
}
72+
String name = parts[0].trim();
73+
String phoneNumber = parts[1].trim();
74+
int idNumber;
75+
76+
try {
77+
idNumber = Integer.parseInt(parts[2].trim());
78+
} catch (NumberFormatException e) {
79+
System.out.println("[WARN] Missing line (ID is not a number): " + line);
80+
return Optional.empty();
81+
}
82+
83+
if (name.isEmpty()) {
84+
System.out.println("[WARN] Missing line (name is empty): " + line);
85+
return Optional.empty();
86+
}
87+
88+
if (!phoneNumber.matches("^\\+7\\d{10}$")) {
89+
System.out.println("[WARN] Missing line (invalid phone format): " + line);
90+
return Optional.empty();
91+
}
92+
93+
Client.ClientBuilder builder = new Client.ClientBuilder()
94+
.name(name)
95+
.phoneNumber(phoneNumber)
96+
.idNumber(idNumber);
97+
return Optional.of(builder);
98+
99+
} catch (Exception e) {
100+
System.out.println("[ERROR] Error processing line: " + line);
101+
return Optional.empty();
102+
}
103+
}
104+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package input;
1+
package input.Strategy;
22

33
public class ManualInputReader {
44
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package input;
1+
package input.Strategy;
22

33
public class RandomDataGenerator {
44
}

0 commit comments

Comments
 (0)