Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5164e0f

Browse files
Added Service folder in the MVCPracticeAdvanced section of a small course on Java EE
1 parent 8d03a3f commit 5164e0f

File tree

4 files changed

+209
-0
lines changed

4 files changed

+209
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package AirportSimulatorTwo.Service;
2+
3+
import AirportSimulatorTwo.DAO.FlightDao;
4+
import AirportSimulatorTwo.DTO.FlightDto;
5+
6+
import java.util.List;
7+
import java.util.stream.Collectors;
8+
9+
public class FlightService {
10+
private static final FlightService INSTANCE = new FlightService();
11+
private FlightService() {
12+
}
13+
public static FlightService getInstance() {
14+
return INSTANCE;
15+
}
16+
private final FlightDao flightDao = FlightDao.getInstance();
17+
public List<FlightDto> findAll(){
18+
return flightDao.
19+
findAll().
20+
stream().
21+
map(flight -> new FlightDto(
22+
flight.getId(),
23+
"""
24+
%s - %s - %s
25+
""".formatted(flight.getDeparture_airport_code(),
26+
flight.getArrival_airport_code(),
27+
flight.getStatus())
28+
)).
29+
collect(Collectors.toList());
30+
}
31+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package AirportSimulatorTwo.Service;
2+
3+
import AirportSimulatorTwo.Util.PropertiesUtil;
4+
import lombok.AccessLevel;
5+
import lombok.NoArgsConstructor;
6+
import lombok.SneakyThrows;
7+
8+
import java.io.InputStream;
9+
import java.nio.file.Files;
10+
import java.nio.file.Path;
11+
import java.nio.file.StandardOpenOption;
12+
import java.util.Optional;
13+
14+
/*
15+
Делаем простой синглтон. Добавляем аннотацию с
16+
пустым конструктором, с приватным доступом.
17+
*/
18+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
19+
public class ImageService {
20+
private static final ImageService INSTANCE = new ImageService();
21+
/* Базовый путь для хранения файлов (картинок) */
22+
private final String basePath = PropertiesUtil.get("image.base.url");
23+
24+
public static ImageService getInstance() {
25+
return INSTANCE;
26+
}
27+
28+
/* Аннотацией пробрасываем исключение */
29+
@SneakyThrows
30+
public void upLoadImg(String imagePath, InputStream imgContent){
31+
/*
32+
*** (JAVA 11) ***
33+
static Path of(String first, String... more) - Возвращает Path путем преобразования строки
34+
пути или последовательности строк, которые
35+
при соединении образуют строку пути.
36+
37+
Соединяем базовый путь и путь для хранения конкретного файла (картинки)
38+
*/
39+
Path imageFullPath = Path.of(basePath, imagePath);
40+
try(imgContent){
41+
/* Создаем папку внутри исходной (основной) на случай если ее там нет */
42+
Files.createDirectories(imageFullPath.getParent());
43+
/*
44+
Читаем файл по указанному пути, читаем все наши байты, две стандартные опции:
45+
- создаем файл;
46+
- и перезаписываем если он есть.
47+
*/
48+
Files.write(imageFullPath,
49+
imgContent.readAllBytes(),
50+
StandardOpenOption.CREATE,
51+
StandardOpenOption.TRUNCATE_EXISTING);
52+
}
53+
}
54+
/* Из-за того что может быть выброшено исключение применяем аннотацию */
55+
@SneakyThrows
56+
public Optional<InputStream> getImage(String imagePath){
57+
Path imageFullPath = Path.of(basePath, imagePath);
58+
return Files.exists(imageFullPath)
59+
? Optional.of(Files.newInputStream(imageFullPath))
60+
: Optional.empty();
61+
}
62+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package AirportSimulatorTwo.Service;
2+
3+
import AirportSimulatorTwo.DAO.TicketDao;
4+
import AirportSimulatorTwo.DTO.TicketDto;
5+
6+
import java.util.List;
7+
import java.util.stream.Collectors;
8+
9+
public class TicketService {
10+
private static final TicketService INSTANCE = new TicketService();
11+
private TicketService(){
12+
}
13+
public static TicketService getInstance(){
14+
return INSTANCE;
15+
}
16+
private final TicketDao ticketDao = TicketDao.getInstance();
17+
public List<TicketDto> findAllByFlightId(Long flightId) {
18+
return ticketDao.findAllByFlightId(flightId).
19+
stream().
20+
map(ticket -> new TicketDto(
21+
ticket.getId(),
22+
ticket.getFlight_id(),
23+
ticket.getSeat_no()
24+
)).
25+
collect(Collectors.toList());
26+
}
27+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package AirportSimulatorTwo.Service;
2+
3+
import AirportSimulatorTwo.DAO.UserDao;
4+
import AirportSimulatorTwo.DTO.CreateUserDto;
5+
import AirportSimulatorTwo.DTO.ReadUserDto;
6+
import AirportSimulatorTwo.Entity.User;
7+
import AirportSimulatorTwo.Exception.ValidationException;
8+
import AirportSimulatorTwo.Mapper.CreateUserMapper;
9+
import AirportSimulatorTwo.Mapper.ReadUserMapper;
10+
import AirportSimulatorTwo.Validator.CreateUserValidator;
11+
import AirportSimulatorTwo.Validator.ValidationResult;
12+
import lombok.AccessLevel;
13+
import lombok.NoArgsConstructor;
14+
import lombok.SneakyThrows;
15+
16+
import java.util.Optional;
17+
18+
/* Конструктор без аргументов с параметрами доступа PRIVATE */
19+
@NoArgsConstructor(access = AccessLevel.PRIVATE)
20+
public class UserService {
21+
private static final UserService INSTANCE = new UserService();
22+
/*
23+
Теперь четыре объекта необходимых для реализации объекта текущего класса:
24+
- Валидация 'createUserValidator';
25+
- Интеграция загружаемого файла в форму 'imageService';
26+
- Преобразование DTO в DAO 'createUserMapper';
27+
- Создание DAO объекта 'userDao'.
28+
*/
29+
private final CreateUserValidator createUserValidator = CreateUserValidator.getInstance();
30+
private final UserDao userDao = UserDao.getInstance();
31+
private final CreateUserMapper createUserMapper = CreateUserMapper.getInstance();
32+
private final ImageService imageService = ImageService.getInstance();
33+
private final ReadUserMapper readUserMapper = ReadUserMapper.getInstance();
34+
35+
public static UserService getInstance() {
36+
return INSTANCE;
37+
}
38+
39+
/*
40+
Для корректной работы данного метода (да и нашего приложения в целом)
41+
42+
нужно реализовать несколько шагов:
43+
1. пройти валидацию - т.е. проверить верны ли введенные данные;
44+
2. преобразование нашей DTO в сущность;
45+
3. сохраняем нашу сущность на уровне DAO;
46+
4. возвращаем id сущности или саму сущность (в зависимости от
47+
выбранного типа возвращаемых данных методом 'create').
48+
*/
49+
@SneakyThrows
50+
public Integer create(CreateUserDto createUserDto){
51+
/* Получаем результат валидации */
52+
ValidationResult validationResult = createUserValidator.isValid(createUserDto);
53+
/* Если что-то пошло не так, генерируем наше исключение */
54+
if (!validationResult.isValid()) {
55+
throw new ValidationException(validationResult.getErrors());
56+
}
57+
/*
58+
Если валидация прошла успешно,
59+
все поля заполнены, ошибок нет,
60+
из DTO создаем DAO
61+
*/
62+
User userEntity = createUserMapper.mapFrom(createUserDto);
63+
/*
64+
Поскольку у нас простой проект, а не Spring, поступим просто,
65+
сначала загрузим картинку, и только за тем нашего пользователя,
66+
чтобы не было ошибок.
67+
*/
68+
imageService.upLoadImg(userEntity.getImage(), createUserDto.getImage().getInputStream());
69+
userDao.save(userEntity);
70+
71+
return userEntity.getId();
72+
}
73+
/*
74+
Как и в случае с базой данных или UserDao.java мы не
75+
знаем, есть ли в базе пользователь с введенными email
76+
и password, поэтому возвращаемый объект типа Optional
77+
78+
Однако с уровня сервисов на уровень сервлетов поступает
79+
объект класса DTO и значит нам нужно преобразовать DAO в
80+
DTO, поэтому используется мапер, как параметр к методу *.map()
81+
82+
Для преобразования DAO в DTO мы используем объект
83+
класса ReadUserMapper и его метод *.mapFrom().
84+
*/
85+
public Optional<ReadUserDto> login(String email, String password) {
86+
return userDao.findByEmailAndPassword(email, password).
87+
map(object -> readUserMapper.mapFrom(object));
88+
}
89+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /