From 193b2b3a3255f45274f299364e8c398f9f1ce3ad Mon Sep 17 00:00:00 2001 From: "Artem.Arefev" Date: Sat, 25 May 2019 14:03:43 +0400 Subject: [PATCH] #91 using RestTemplate & show error on timetable loading exception --- .../user/controller/UserMvcController.java | 2 +- .../ru/ulstu/user/service/UserService.java | 12 +++-- .../utils/timetable/TimetableService.java | 48 ++++++++----------- .../errors/TimetableClientException.java | 7 +++ .../ru/ulstu/utils/timetable/model/Day.java | 9 ++-- .../ulstu/utils/timetable/model/Lesson.java | 5 +- .../ulstu/utils/timetable/model/Response.java | 3 +- .../timetable/model/TimetableResponse.java | 2 +- .../ru/ulstu/utils/timetable/model/Week.java | 6 ++- src/main/resources/application.properties | 4 +- .../resources/templates/users/dashboard.html | 13 ++++- 11 files changed, 63 insertions(+), 48 deletions(-) create mode 100644 src/main/java/ru/ulstu/utils/timetable/errors/TimetableClientException.java diff --git a/src/main/java/ru/ulstu/user/controller/UserMvcController.java b/src/main/java/ru/ulstu/user/controller/UserMvcController.java index d283a21..044bde8 100644 --- a/src/main/java/ru/ulstu/user/controller/UserMvcController.java +++ b/src/main/java/ru/ulstu/user/controller/UserMvcController.java @@ -51,6 +51,6 @@ public class UserMvcController extends OdinController { @GetMapping("/dashboard") public void getUsersDashboard(ModelMap modelMap) { - modelMap.addAttribute("users", userService.getUsersInfo()); + modelMap.addAllAttributes(userService.getUsersInfo()); } } diff --git a/src/main/java/ru/ulstu/user/service/UserService.java b/src/main/java/ru/ulstu/user/service/UserService.java index 334fbf5..b022866 100644 --- a/src/main/java/ru/ulstu/user/service/UserService.java +++ b/src/main/java/ru/ulstu/user/service/UserService.java @@ -42,10 +42,10 @@ import ru.ulstu.user.repository.UserRepository; import ru.ulstu.user.repository.UserRoleRepository; import ru.ulstu.user.util.UserUtils; import ru.ulstu.utils.timetable.TimetableService; +import ru.ulstu.utils.timetable.errors.TimetableClientException; import ru.ulstu.utils.timetable.model.Lesson; import javax.mail.MessagingException; -import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; @@ -358,14 +358,16 @@ public class UserService implements UserDetailsService { } } - public List getUsersInfo() { + public Map getUsersInfo() { List usersInfoNow = new ArrayList<>(); + String err = ""; + for (User user : userRepository.findAll()) { Lesson lesson = null; try { lesson = timetableService.getCurrentLesson(user.getUserAbbreviate()); - } catch (IOException e) { - e.printStackTrace(); + } catch (TimetableClientException e) { + err = "Не удалось загрузить расписание"; } usersInfoNow.add(new UserInfoNow( lesson, @@ -374,6 +376,6 @@ public class UserService implements UserDetailsService { userSessionService.isOnline(user)) ); } - return usersInfoNow; + return ImmutableMap.of("users", usersInfoNow, "error", err); } } diff --git a/src/main/java/ru/ulstu/utils/timetable/TimetableService.java b/src/main/java/ru/ulstu/utils/timetable/TimetableService.java index f17ea86..aa49fed 100644 --- a/src/main/java/ru/ulstu/utils/timetable/TimetableService.java +++ b/src/main/java/ru/ulstu/utils/timetable/TimetableService.java @@ -1,15 +1,12 @@ package ru.ulstu.utils.timetable; import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import ru.ulstu.utils.timetable.errors.TimetableClientException; import ru.ulstu.utils.timetable.model.Lesson; import ru.ulstu.utils.timetable.model.TimetableResponse; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -17,10 +14,10 @@ import java.util.Date; import java.util.List; public class TimetableService { - private static final String TIMETABLE_URL = "http://timetable.athene.tech"; + private static final String TIMETABLE_URL = "http://timetable.athene.tech/api/1.0/timetable?filter=%s"; private SimpleDateFormat lessonTimeFormat = new SimpleDateFormat("hh:mm"); - private long[] lessonsStarts = new long[]{ + private long[] lessonsStarts = new long[] { lessonTimeFormat.parse("8:00:00").getTime(), lessonTimeFormat.parse("9:40:00").getTime(), lessonTimeFormat.parse("11:30:00").getTime(), @@ -30,7 +27,8 @@ public class TimetableService { lessonTimeFormat.parse("18:10:00").getTime(), }; - public TimetableService() throws ParseException { } + public TimetableService() throws ParseException { + } private int getCurrentDay() { Calendar calendar = Calendar.getInstance(); @@ -42,6 +40,7 @@ public class TimetableService { long lessonDuration = 90 * 60000; Date now = new Date(); long timeNow = now.getTime() % (24 * 60 * 60 * 1000L); + for (int i = 0; i < lessonsStarts.length; i++) { if (timeNow > lessonsStarts[i] && timeNow < lessonsStarts[i] + lessonDuration) { return i; @@ -56,31 +55,26 @@ public class TimetableService { return (cal.get(Calendar.WEEK_OF_YEAR) + 1) % 2; } - private TimetableResponse getTimetableForUser(String userFIO) throws IOException { - URL url = new URL(TIMETABLE_URL + "/api/1.0/timetable?filter=" + URLEncoder.encode(userFIO, "UTF-8")); - HttpURLConnection con = (HttpURLConnection) url.openConnection(); - con.setRequestMethod("GET"); - - BufferedReader in = new BufferedReader( - new InputStreamReader(con.getInputStream())); - String inputLine; - StringBuilder content = new StringBuilder(); - while ((inputLine = in.readLine()) != null) { - content.append(inputLine); - } - in.close(); - - return new ObjectMapper().readValue(content.toString(), TimetableResponse.class); + private TimetableResponse getTimetableForUser(String userFIO) throws RestClientException { + RestTemplate restTemplate = new RestTemplate(); + return restTemplate.getForObject(String.format(TIMETABLE_URL, userFIO), TimetableResponse.class); } - public Lesson getCurrentLesson(String userFio) throws IOException { - TimetableResponse response = getTimetableForUser(userFio); + public Lesson getCurrentLesson(String userFio) { + TimetableResponse response; + try { + response = getTimetableForUser(userFio); + } catch (RestClientException e) { + e.printStackTrace(); + throw new TimetableClientException(userFio); + } + int lessonNumber = getCurrentLessonNumber(); if (lessonNumber < 0) { return null; } - List lessons = response + List lessons = response .getResponse() .getWeeks() .get(getCurrentWeek()) diff --git a/src/main/java/ru/ulstu/utils/timetable/errors/TimetableClientException.java b/src/main/java/ru/ulstu/utils/timetable/errors/TimetableClientException.java new file mode 100644 index 0000000..4723bda --- /dev/null +++ b/src/main/java/ru/ulstu/utils/timetable/errors/TimetableClientException.java @@ -0,0 +1,7 @@ +package ru.ulstu.utils.timetable.errors; + +public class TimetableClientException extends RuntimeException { + public TimetableClientException(String message) { + super(message); + } +} diff --git a/src/main/java/ru/ulstu/utils/timetable/model/Day.java b/src/main/java/ru/ulstu/utils/timetable/model/Day.java index f548462..e4e37f9 100644 --- a/src/main/java/ru/ulstu/utils/timetable/model/Day.java +++ b/src/main/java/ru/ulstu/utils/timetable/model/Day.java @@ -1,12 +1,13 @@ package ru.ulstu.utils.timetable.model; +import java.util.ArrayList; import java.util.List; -public class Day { +public class Day { private Integer day; - private List> lessons = null; + private List> lessons = new ArrayList<>(); public Integer getDay() { return day; @@ -16,11 +17,11 @@ public class Day { this.day = day; } - public List> getLessons() { + public List> getLessons() { return lessons; } - public void setLessons(List> lessons) { + public void setLessons(List> lessons) { this.lessons = lessons; } } diff --git a/src/main/java/ru/ulstu/utils/timetable/model/Lesson.java b/src/main/java/ru/ulstu/utils/timetable/model/Lesson.java index e651e1a..b1b1707 100644 --- a/src/main/java/ru/ulstu/utils/timetable/model/Lesson.java +++ b/src/main/java/ru/ulstu/utils/timetable/model/Lesson.java @@ -1,14 +1,11 @@ package ru.ulstu.utils.timetable.model; -public class Lesson { +public class Lesson { private String group; private String nameOfLesson; private String teacher; private String room; - public Lesson() { - } - public String getGroup() { return group; } diff --git a/src/main/java/ru/ulstu/utils/timetable/model/Response.java b/src/main/java/ru/ulstu/utils/timetable/model/Response.java index b5b9e97..dfd3a84 100644 --- a/src/main/java/ru/ulstu/utils/timetable/model/Response.java +++ b/src/main/java/ru/ulstu/utils/timetable/model/Response.java @@ -1,10 +1,11 @@ package ru.ulstu.utils.timetable.model; +import java.util.ArrayList; import java.util.List; public class Response { - private List weeks = null; + private List weeks = new ArrayList<>(); public List getWeeks() { return weeks; diff --git a/src/main/java/ru/ulstu/utils/timetable/model/TimetableResponse.java b/src/main/java/ru/ulstu/utils/timetable/model/TimetableResponse.java index 118c979..925d9a8 100644 --- a/src/main/java/ru/ulstu/utils/timetable/model/TimetableResponse.java +++ b/src/main/java/ru/ulstu/utils/timetable/model/TimetableResponse.java @@ -1,6 +1,6 @@ package ru.ulstu.utils.timetable.model; -public class TimetableResponse { +public class TimetableResponse { private Response response; private String error; diff --git a/src/main/java/ru/ulstu/utils/timetable/model/Week.java b/src/main/java/ru/ulstu/utils/timetable/model/Week.java index 19f3c50..8ea76ea 100644 --- a/src/main/java/ru/ulstu/utils/timetable/model/Week.java +++ b/src/main/java/ru/ulstu/utils/timetable/model/Week.java @@ -1,10 +1,12 @@ package ru.ulstu.utils.timetable.model; +import java.io.Serializable; +import java.util.ArrayList; import java.util.List; -public class Week { +public class Week implements Serializable { - private List days = null; + private List days = new ArrayList<>(); public List getDays() { return days; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 038ddcf..41c8ece 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -24,7 +24,7 @@ spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFact # JPA Settings spring.datasource.url=jdbc:postgresql://localhost:5432/ng-tracker spring.datasource.username=postgres -spring.datasource.password=postgres +spring.datasource.password=password spring.datasource.driverclassName=org.postgresql.Driver spring.jpa.hibernate.ddl-auto=validate # Liquibase Settings @@ -34,6 +34,6 @@ liquibase.change-log=classpath:db/changelog-master.xml # Application Settings ng-tracker.base-url=http://127.0.0.1:8080 ng-tracker.undead-user-login=admin -ng-tracker.dev-mode=true +ng-tracker.dev-mode=false ng-tracker.use-https=false ng-tracker.check-run=false \ No newline at end of file diff --git a/src/main/resources/templates/users/dashboard.html b/src/main/resources/templates/users/dashboard.html index 8236734..e5b7563 100644 --- a/src/main/resources/templates/users/dashboard.html +++ b/src/main/resources/templates/users/dashboard.html @@ -3,15 +3,18 @@ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorator="default" xmlns:th="http://www.w3.org/1999/xhtml"> + -

Пользователи

+
+

teste

+
@@ -19,6 +22,14 @@
+
\ No newline at end of file