diff options
Diffstat (limited to 'graphs/java/grades')
8 files changed, 312 insertions, 0 deletions
diff --git a/graphs/java/grades/.gitignore b/graphs/java/grades/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/grades/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store
\ No newline at end of file diff --git a/graphs/java/grades/pom.xml b/graphs/java/grades/pom.xml new file mode 100644 index 0000000..f48839f --- /dev/null +++ b/graphs/java/grades/pom.xml @@ -0,0 +1,139 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>fr.epita.assistants</groupId> + <artifactId>grades</artifactId> + <version>1.1</version> + + <properties> + <versions.java>21</versions.java> + <versions.junit>5.9.1</versions.junit> + <versions.maven-compiler-plugin>3.13.0</versions.maven-compiler-plugin> + <versions.maven-surefire-plugin>2.22.2</versions.maven-surefire-plugin> + <versions.maven-jar-plugin>3.1.1</versions.maven-jar-plugin> + <versions.maven-install-plugin>3.1.0</versions.maven-install-plugin> + + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + + <surefire.reportsDirectory>${project.build.directory}/surefire-reports</surefire.reportsDirectory> + </properties> + + <dependencies> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>1.18.30</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <version>${versions.junit}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-junit-platform</artifactId> + <version>${versions.maven-surefire-plugin}</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-compat</artifactId> + <version>3.9.8</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-api</artifactId> + <version>3.9.8</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-project</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + <version>3.8.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-monitor</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-utils</artifactId> + <version>3.0.24</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-filtering</artifactId> + <version>3.3.2</version> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-interpolation</artifactId> + <version>1.13</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-profile</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact-manager</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-registry</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-repository-metadata</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>classworlds</groupId> + <artifactId>classworlds</artifactId> + <version>1.1</version> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-commons</artifactId> + <version>1.9.3</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>${versions.maven-compiler-plugin}</version> + <configuration> + <source>${versions.java}</source> + <target>${versions.java}</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-install-plugin</artifactId> + <version>${versions.maven-install-plugin}</version> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${versions.maven-surefire-plugin}</version> + <configuration> + <reportsDirectory>${surefire.reportsDirectory}</reportsDirectory> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java new file mode 100644 index 0000000..fa9d24e --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java @@ -0,0 +1,13 @@ +package fr.epita.assistants.grades; + +public class EntryNotFoundException extends RuntimeException { + /** + * @param entryClass The class of the collection's entries + * @param query The string representation of the search query + */ + public EntryNotFoundException(Class<?> entryClass, String query) { + super(String.format("%s not found for: `%s`", + entryClass.getSimpleName(), + query)); + } +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java new file mode 100644 index 0000000..91da40b --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java @@ -0,0 +1,98 @@ +package fr.epita.assistants.grades; + +import fr.epita.assistants.grades.model.*; + +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +public class GradeHandler { + private final List<Activity> activities; + private final List<Student> students; + + public GradeHandler() { + this.activities = new ArrayList<>(); + this.students = new ArrayList<>(); + } + + /** + * @param activity The {@link Activity} to be added + * @return {@code true} (as specified by {@link List#add}) + */ + public boolean addActivity(Activity activity) { + this.activities.add(activity); + return true; + } + + /** + * @param student The {@link Student} to be added + * @return {@code true} (as specified by {@link List#add}) + */ + public boolean addStudent(Student student) { + students.add(student); + return true; + } + + /** + * @param name The name of the desired {@link Student} + * @return The desired student + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public Student getStudent(String name) throws EntryNotFoundException { + Optional<Student> o = students.stream().filter(i -> i.name().equals(name)).findFirst(); + if (o.isEmpty()) + throw new EntryNotFoundException(Student.class, name); + else + return o.get(); + } + + /** + * @param grade The {@link Grade} to be added to the {@link Student} + * @param name The name of the desired {@link Student} + * @return {@code true} (as specified by {@link List#add}) + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public boolean addGradeToStudent(Grade grade, String name) throws EntryNotFoundException { + getStudent(name).grades().add(grade); + return true; + } + + /** + * @param name The name of the desired {@link Student} to remove + * @return The removed {@link Student} + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public Student removeStudent(String name) throws EntryNotFoundException { + Student s = getStudent(name); + students.remove(getStudent(name)); + return s; + } + + /** + * @param name The name of the desired {@link Student} + * @param function A {@link Function} returning an updated {@link Student} from the given one + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public void updateStudent(String name, Function<Student, Student> function) throws EntryNotFoundException { + addStudent(function.apply(removeStudent(name))); + } + + /** + * @param name The name of the {@link Student} from which to get grades + * @param subject The {@link Subject} from which we want the student's average + * @return The student's average grade in the specified subject (0 if no grades are available) + * @throws EntryNotFoundException No known {@link Student} with the given name + */ + public double getStudentAverageInSubject(String name, Subject subject) throws EntryNotFoundException { + Optional<Student> o = students.stream().filter(i -> i.name().equals(name)).findFirst(); + if (o.isPresent()) { + Student s = o.get(); + OptionalDouble d = s.grades().stream().filter(g -> g.activity().subject() == subject).mapToDouble(Grade::grade).average(); + if (d.isEmpty()) + return 0.0; + else return d.getAsDouble(); + } + else + throw new EntryNotFoundException(getClass(), name); + } +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java new file mode 100644 index 0000000..fe3e285 --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java @@ -0,0 +1,4 @@ +package fr.epita.assistants.grades.model; + +public record Activity(String name, Subject subject, float weight) { +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java new file mode 100644 index 0000000..fb63a6c --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java @@ -0,0 +1,4 @@ +package fr.epita.assistants.grades.model; + +public record Grade(Activity activity, int grade) { +} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java new file mode 100644 index 0000000..335e073 --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java @@ -0,0 +1,8 @@ +package fr.epita.assistants.grades.model; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record Student(String name, int age, List<Grade> grades) {} diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java new file mode 100644 index 0000000..00bc685 --- /dev/null +++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java @@ -0,0 +1,8 @@ +package fr.epita.assistants.grades.model; + +public enum Subject { + STEMS, + SHAPE, + HEAL, + Maths; +} |
