From 56844f3e04bd50de9d4e36d071e34ab1e5ff69b7 Mon Sep 17 00:00:00 2001 From: kislyakoff Date: Sun, 22 Oct 2023 20:40:57 +0300 Subject: [PATCH 1/5] change init .gitignore and build.gradle --- .gitignore | 4 ++++ build.gradle | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/.gitignore b/.gitignore index 23841a6..9ab1047 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ .idea .gradle +.classpath +.project +.settings +bin/ diff --git a/build.gradle b/build.gradle index e9a013a..bf66a3c 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,15 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2' + + compileOnly 'org.projectlombok:lombok:1.18.30' + annotationProcessor 'org.projectlombok:lombok:1.18.30' + + testCompileOnly 'org.projectlombok:lombok:1.18.30' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.30' + + implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9' + implementation group: 'org.slf4j', name: 'slf4j-simple', version: '2.0.9' } test { From 34df37dea24bfedef71f4f27d59d999919dd4d9c Mon Sep 17 00:00:00 2001 From: kislyakoff Date: Wed, 25 Oct 2023 23:59:15 +0300 Subject: [PATCH 2/5] add task3 solution --- src/main/java/task_3/SimpsonsCharacter.java | 81 +++++++++++++++++++ src/main/java/task_3/SimpsonsCourse.java | 57 +++++++++++++ src/main/java/task_3/SimpsonsGrade.java | 49 +++++++++++ src/main/java/task_3/SimpsonsSchool.java | 53 ++++++++++++ src/main/java/task_3/Task3.java | 80 ++++++++++++++++++ .../exceptions/CoursesNotFoundException.java | 10 +++ 6 files changed, 330 insertions(+) create mode 100644 src/main/java/task_3/SimpsonsCharacter.java create mode 100644 src/main/java/task_3/SimpsonsCourse.java create mode 100644 src/main/java/task_3/SimpsonsGrade.java create mode 100644 src/main/java/task_3/SimpsonsSchool.java create mode 100644 src/main/java/task_3/Task3.java create mode 100644 src/main/java/task_3/exceptions/CoursesNotFoundException.java diff --git a/src/main/java/task_3/SimpsonsCharacter.java b/src/main/java/task_3/SimpsonsCharacter.java new file mode 100644 index 0000000..43e82e4 --- /dev/null +++ b/src/main/java/task_3/SimpsonsCharacter.java @@ -0,0 +1,81 @@ +package task_3; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +public class SimpsonsCharacter { + + private static AtomicInteger counter = new AtomicInteger(0); + private final String name; + private int age; + private final int characterId; + private final Set enrolledCourses; + private final List grades; + + public SimpsonsCharacter(String name, int age) { + + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("Please provide correct name"); + } + + if (age < 1) { + throw new IllegalArgumentException("Age must be above 0"); + } + + this.name = name; + this.age = age; + this.characterId = nextId(); + this.enrolledCourses = new HashSet<>(); + this.grades = new ArrayList<>(); + + } + + private static int nextId() { + return counter.incrementAndGet(); + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + public int getCharacterId() { + return characterId; + } + + public Set getEnrolledCourses() { + return enrolledCourses; + } + + public List getGrades() { + return grades; + } + + @Override + public int hashCode() { + return Objects.hash(age, characterId, enrolledCourses, grades, name); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SimpsonsCharacter other = (SimpsonsCharacter) obj; + return age == other.age && characterId == other.characterId + && Objects.equals(enrolledCourses, other.enrolledCourses) && Objects.equals(grades, other.grades) + && Objects.equals(name, other.name); + } + + +} diff --git a/src/main/java/task_3/SimpsonsCourse.java b/src/main/java/task_3/SimpsonsCourse.java new file mode 100644 index 0000000..8ef889d --- /dev/null +++ b/src/main/java/task_3/SimpsonsCourse.java @@ -0,0 +1,57 @@ +package task_3; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; + +public class SimpsonsCourse { + + private final String courseName; + private static AtomicInteger counter = new AtomicInteger(0); + private final int courseId; + + public SimpsonsCourse(String courseName) { + if (courseName == null || courseName.isBlank()) { + throw new IllegalArgumentException("Please provide correct courseName"); + } + + this.courseName = courseName; + this.courseId = nextId(); + } + + private static int nextId() { + return counter.incrementAndGet(); + } + + public String getCourseName() { + return courseName; + } + + public int getCourseId() { + return courseId; + } + + @Override + public int hashCode() { + return Objects.hash(courseId, courseName); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SimpsonsCourse other = (SimpsonsCourse) obj; + return courseId == other.courseId && Objects.equals(courseName, other.courseName); + } + + @Override + public String toString() { + return "courseId: " + courseId; + } + + + +} diff --git a/src/main/java/task_3/SimpsonsGrade.java b/src/main/java/task_3/SimpsonsGrade.java new file mode 100644 index 0000000..ba0b569 --- /dev/null +++ b/src/main/java/task_3/SimpsonsGrade.java @@ -0,0 +1,49 @@ +package task_3; + +import java.util.Objects; + +public class SimpsonsGrade { + + private final SimpsonsCourse course; + private final SimpsonsCharacter character; + private final int gradeValue; + + public SimpsonsGrade(SimpsonsCourse course, SimpsonsCharacter character, int gradeValue) { + this.course = course; + this.character = character; + this.gradeValue = gradeValue; + } + + public SimpsonsCourse getCourse() { + return course; + } + + public SimpsonsCharacter getCharacter() { + return character; + } + + public int getGradeValue() { + return gradeValue; + } + + @Override + public int hashCode() { + return Objects.hash(character, course, gradeValue); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SimpsonsGrade other = (SimpsonsGrade) obj; + return Objects.equals(character, other.character) && Objects.equals(course, other.course) + && gradeValue == other.gradeValue; + } + + + +} diff --git a/src/main/java/task_3/SimpsonsSchool.java b/src/main/java/task_3/SimpsonsSchool.java new file mode 100644 index 0000000..2878e84 --- /dev/null +++ b/src/main/java/task_3/SimpsonsSchool.java @@ -0,0 +1,53 @@ +package task_3; + +import java.util.List; + +import task_3.exceptions.CoursesNotFoundException; + +public class SimpsonsSchool { + + public void enrollCharacter(SimpsonsCharacter character, List courses) { + + if (character == null || courses == null || courses.isEmpty()) { + throw new IllegalArgumentException("Arguments can't be null or empty"); + } + + if (courses.stream().anyMatch(course -> course == null)) { + throw new IllegalArgumentException("Courses can't contain null elements"); + } + + character.getEnrolledCourses().addAll(courses); + + } + + public void addGrade(SimpsonsCharacter character, SimpsonsCourse course, int gradeValue) { + + if (gradeValue < 1 || gradeValue > 5) { + throw new IllegalArgumentException("Grade value must be from 1 to 5"); + } + + if (character == null || course == null) { + throw new IllegalArgumentException("Null args was got"); + } + + if (!character.getEnrolledCourses().contains(course)) { + throw new CoursesNotFoundException( + character.getName() + " not enrolled on " + course.getCourseName() + " yet"); + } + + character.getGrades().add(new SimpsonsGrade(course, character, gradeValue)); + + } + + public void getCharacterTranscript(SimpsonsCharacter character) { + + if (character.getEnrolledCourses().isEmpty()) { + throw new CoursesNotFoundException("Not found any " + character.getName() + "'s courses"); + } + + System.out.println(character.getName() + " has following grades:"); + character.getGrades().forEach(grade -> System.out.println(grade.getCourse().getCourseName() + ": " + grade.getGradeValue())); + + } + +} diff --git a/src/main/java/task_3/Task3.java b/src/main/java/task_3/Task3.java new file mode 100644 index 0000000..f79f057 --- /dev/null +++ b/src/main/java/task_3/Task3.java @@ -0,0 +1,80 @@ +package task_3; + +import java.util.ArrayList; +import java.util.List; + +import lombok.extern.slf4j.Slf4j; +import task_3.exceptions.CoursesNotFoundException; + +@Slf4j +public class Task3 { + + public static void main(String[] args) { + + SimpsonsCourse course1 = new SimpsonsCourse("History"); + SimpsonsCourse course2 = new SimpsonsCourse("Math"); + SimpsonsCourse course3 = new SimpsonsCourse("Bart's Pranks"); + SimpsonsCourse course4 = new SimpsonsCourse("Science"); + SimpsonsCourse course5 = new SimpsonsCourse("Music"); + SimpsonsCourse course6 = new SimpsonsCourse("Environmentalism"); + + SimpsonsSchool school = new SimpsonsSchool(); + + SimpsonsCharacter simpsonsCharacter1 = new SimpsonsCharacter("Bart Simpson", 10); + SimpsonsCharacter simpsonsCharacter2 = new SimpsonsCharacter("Lisa Simpson", 8); + + List emptyList = new ArrayList<>(); + + try { + school.enrollCharacter(simpsonsCharacter1, emptyList); + } catch (IllegalArgumentException e) { + log.error("Bad args in enrollCharacter(): {}", e.getMessage()); + } + + emptyList.add(null); + emptyList.add(course6); + + try { + school.enrollCharacter(simpsonsCharacter1, emptyList); + } catch (IllegalArgumentException e) { + log.error("Bad args in enrollCharacter(): {}", e.getMessage()); + } + + try { + school.addGrade(simpsonsCharacter2, course6, 0); + } catch (IllegalArgumentException e) { + log.error("Bad args in addGrade: {}", e.getMessage()); + } + + try { + school.addGrade(simpsonsCharacter2, null, 5); + } catch (IllegalArgumentException e) { + log.error("Bad args in addGrade(): {}", e.getMessage()); + } + + try { + school.getCharacterTranscript(simpsonsCharacter2); + } catch (CoursesNotFoundException e) { + log.error("Attempt to get empty list in getCharacterTranscript(): {}", e.getMessage()); + } + + try { + school.addGrade(simpsonsCharacter2, course1, 5); + } catch (CoursesNotFoundException e) { + log.error("Attempt to grade not enrolled course in addGrade(): {}", e.getMessage()); + } + + school.enrollCharacter(simpsonsCharacter1, List.of(course2, course1, course3)); + school.enrollCharacter(simpsonsCharacter2, List.of(course4, course5, course6)); + + school.addGrade(simpsonsCharacter1, course2, 4); + school.addGrade(simpsonsCharacter1, course1, 3); + school.addGrade(simpsonsCharacter1, course3, 5); + school.addGrade(simpsonsCharacter2, course4, 5); + school.addGrade(simpsonsCharacter2, course5, 4); + school.addGrade(simpsonsCharacter2, course6, 5); + + school.getCharacterTranscript(simpsonsCharacter2); + school.getCharacterTranscript(simpsonsCharacter1); + } +} diff --git a/src/main/java/task_3/exceptions/CoursesNotFoundException.java b/src/main/java/task_3/exceptions/CoursesNotFoundException.java new file mode 100644 index 0000000..23be193 --- /dev/null +++ b/src/main/java/task_3/exceptions/CoursesNotFoundException.java @@ -0,0 +1,10 @@ +package task_3.exceptions; + +public class CoursesNotFoundException extends RuntimeException { + + public CoursesNotFoundException(String message) { + super(message); + } + + +} From 5f5711342dee35e1edca8a2fed18a94bf1c7b1df Mon Sep 17 00:00:00 2001 From: kislyakoff Date: Thu, 26 Oct 2023 00:44:53 +0300 Subject: [PATCH 3/5] change void to List in getCharacterTranscript() --- src/main/java/task_3/SimpsonsSchool.java | 8 +++++--- src/main/java/task_3/Task3.java | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/task_3/SimpsonsSchool.java b/src/main/java/task_3/SimpsonsSchool.java index 2878e84..5c504db 100644 --- a/src/main/java/task_3/SimpsonsSchool.java +++ b/src/main/java/task_3/SimpsonsSchool.java @@ -1,6 +1,7 @@ package task_3; import java.util.List; +import java.util.stream.Collectors; import task_3.exceptions.CoursesNotFoundException; @@ -39,14 +40,15 @@ public void addGrade(SimpsonsCharacter character, SimpsonsCourse course, int gra } - public void getCharacterTranscript(SimpsonsCharacter character) { + public List getCharacterTranscript(SimpsonsCharacter character) { if (character.getEnrolledCourses().isEmpty()) { throw new CoursesNotFoundException("Not found any " + character.getName() + "'s courses"); } - System.out.println(character.getName() + " has following grades:"); - character.getGrades().forEach(grade -> System.out.println(grade.getCourse().getCourseName() + ": " + grade.getGradeValue())); + return character.getGrades().stream() + .map(grade -> String.format("%s : %d", grade.getCourse().getCourseName(), grade.getGradeValue())) + .collect(Collectors.toList()); } diff --git a/src/main/java/task_3/Task3.java b/src/main/java/task_3/Task3.java index f79f057..96828d1 100644 --- a/src/main/java/task_3/Task3.java +++ b/src/main/java/task_3/Task3.java @@ -74,7 +74,8 @@ public static void main(String[] args) { school.addGrade(simpsonsCharacter2, course5, 4); school.addGrade(simpsonsCharacter2, course6, 5); - school.getCharacterTranscript(simpsonsCharacter2); - school.getCharacterTranscript(simpsonsCharacter1); + System.out.println(simpsonsCharacter2.getName() + " has following grades: " + school.getCharacterTranscript(simpsonsCharacter2)); + System.out.println(simpsonsCharacter1.getName() + " has following grades: " + school.getCharacterTranscript(simpsonsCharacter1)); + } } From 44cb63898922af44026c9c3117f69edc7d4038c6 Mon Sep 17 00:00:00 2001 From: kislyakoff Date: Thu, 26 Oct 2023 00:49:12 +0300 Subject: [PATCH 4/5] format lines in main --- src/main/java/task_3/Task3.java | 36 +++++++++++++++++---------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/task_3/Task3.java b/src/main/java/task_3/Task3.java index 96828d1..e16d22e 100644 --- a/src/main/java/task_3/Task3.java +++ b/src/main/java/task_3/Task3.java @@ -10,72 +10,74 @@ public class Task3 { public static void main(String[] args) { - + SimpsonsCourse course1 = new SimpsonsCourse("History"); SimpsonsCourse course2 = new SimpsonsCourse("Math"); SimpsonsCourse course3 = new SimpsonsCourse("Bart's Pranks"); SimpsonsCourse course4 = new SimpsonsCourse("Science"); SimpsonsCourse course5 = new SimpsonsCourse("Music"); SimpsonsCourse course6 = new SimpsonsCourse("Environmentalism"); - + SimpsonsSchool school = new SimpsonsSchool(); - + SimpsonsCharacter simpsonsCharacter1 = new SimpsonsCharacter("Bart Simpson", 10); SimpsonsCharacter simpsonsCharacter2 = new SimpsonsCharacter("Lisa Simpson", 8); - + List emptyList = new ArrayList<>(); - + try { school.enrollCharacter(simpsonsCharacter1, emptyList); } catch (IllegalArgumentException e) { log.error("Bad args in enrollCharacter(): {}", e.getMessage()); } - + emptyList.add(null); emptyList.add(course6); - + try { school.enrollCharacter(simpsonsCharacter1, emptyList); } catch (IllegalArgumentException e) { log.error("Bad args in enrollCharacter(): {}", e.getMessage()); } - + try { school.addGrade(simpsonsCharacter2, course6, 0); } catch (IllegalArgumentException e) { log.error("Bad args in addGrade: {}", e.getMessage()); } - + try { school.addGrade(simpsonsCharacter2, null, 5); } catch (IllegalArgumentException e) { log.error("Bad args in addGrade(): {}", e.getMessage()); } - + try { school.getCharacterTranscript(simpsonsCharacter2); } catch (CoursesNotFoundException e) { log.error("Attempt to get empty list in getCharacterTranscript(): {}", e.getMessage()); } - + try { school.addGrade(simpsonsCharacter2, course1, 5); } catch (CoursesNotFoundException e) { log.error("Attempt to grade not enrolled course in addGrade(): {}", e.getMessage()); } - + school.enrollCharacter(simpsonsCharacter1, List.of(course2, course1, course3)); school.enrollCharacter(simpsonsCharacter2, List.of(course4, course5, course6)); - + school.addGrade(simpsonsCharacter1, course2, 4); school.addGrade(simpsonsCharacter1, course1, 3); school.addGrade(simpsonsCharacter1, course3, 5); school.addGrade(simpsonsCharacter2, course4, 5); school.addGrade(simpsonsCharacter2, course5, 4); school.addGrade(simpsonsCharacter2, course6, 5); - - System.out.println(simpsonsCharacter2.getName() + " has following grades: " + school.getCharacterTranscript(simpsonsCharacter2)); - System.out.println(simpsonsCharacter1.getName() + " has following grades: " + school.getCharacterTranscript(simpsonsCharacter1)); - + + System.out.println(simpsonsCharacter2.getName() + " has following grades: " + + school.getCharacterTranscript(simpsonsCharacter2)); + System.out.println(simpsonsCharacter1.getName() + " has following grades: " + + school.getCharacterTranscript(simpsonsCharacter1)); + } } From da30b17887aae54419d50d58b9ba603151612145 Mon Sep 17 00:00:00 2001 From: kislyakoff Date: Thu, 26 Oct 2023 14:20:32 +0300 Subject: [PATCH 5/5] add some logging --- src/main/java/task_3/SimpsonsSchool.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/task_3/SimpsonsSchool.java b/src/main/java/task_3/SimpsonsSchool.java index 5c504db..8695606 100644 --- a/src/main/java/task_3/SimpsonsSchool.java +++ b/src/main/java/task_3/SimpsonsSchool.java @@ -3,8 +3,10 @@ import java.util.List; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import task_3.exceptions.CoursesNotFoundException; +@Slf4j public class SimpsonsSchool { public void enrollCharacter(SimpsonsCharacter character, List courses) { @@ -12,12 +14,15 @@ public void enrollCharacter(SimpsonsCharacter character, List co if (character == null || courses == null || courses.isEmpty()) { throw new IllegalArgumentException("Arguments can't be null or empty"); } - + + log.info("Attempt to enroll {}'s character", character.getName()); + if (courses.stream().anyMatch(course -> course == null)) { throw new IllegalArgumentException("Courses can't contain null elements"); } character.getEnrolledCourses().addAll(courses); + log.info("{}'s character was enrolled successful", character.getName()); } @@ -31,21 +36,34 @@ public void addGrade(SimpsonsCharacter character, SimpsonsCourse course, int gra throw new IllegalArgumentException("Null args was got"); } + log.info("Attempt to add grade {} of {}'s course: {}", gradeValue, character.getName(), + course.getCourseName()); + if (!character.getEnrolledCourses().contains(course)) { throw new CoursesNotFoundException( character.getName() + " not enrolled on " + course.getCourseName() + " yet"); } character.getGrades().add(new SimpsonsGrade(course, character, gradeValue)); + log.info("Adding grade {} of {}'s course: {}, succsessful", gradeValue, character.getName(), + course.getCourseName()); } public List getCharacterTranscript(SimpsonsCharacter character) { + if (character == null) { + throw new IllegalArgumentException("Null args was got"); + } + + log.info("Try to get {}'s transcript", character.getName()); + if (character.getEnrolledCourses().isEmpty()) { throw new CoursesNotFoundException("Not found any " + character.getName() + "'s courses"); } + log.info("{}'s transcript was got successful", character.getName()); + return character.getGrades().stream() .map(grade -> String.format("%s : %d", grade.getCourse().getCourseName(), grade.getGradeValue())) .collect(Collectors.toList());