summaryrefslogtreecommitdiff
path: root/graphs/java/grades
diff options
context:
space:
mode:
Diffstat (limited to 'graphs/java/grades')
-rw-r--r--graphs/java/grades/.gitignore38
-rw-r--r--graphs/java/grades/pom.xml139
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java13
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java98
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java4
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java4
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java8
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java8
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;
+}