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 { 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..8695606 --- /dev/null +++ b/src/main/java/task_3/SimpsonsSchool.java @@ -0,0 +1,73 @@ +package task_3; + +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) { + + 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()); + + } + + 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"); + } + + 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()); + + } + +} diff --git a/src/main/java/task_3/Task3.java b/src/main/java/task_3/Task3.java new file mode 100644 index 0000000..e16d22e --- /dev/null +++ b/src/main/java/task_3/Task3.java @@ -0,0 +1,83 @@ +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); + + System.out.println(simpsonsCharacter2.getName() + " has following grades: " + + school.getCharacterTranscript(simpsonsCharacter2)); + System.out.println(simpsonsCharacter1.getName() + " has following grades: " + + 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); + } + + +}