From 25882b5de8b0e4adf56c45c8d445df2c2fe6a227 Mon Sep 17 00:00:00 2001 From: Lukas Morgenstern Date: Mon, 11 Aug 2025 13:53:40 +0200 Subject: [PATCH 1/3] Renamed Level to TaskLevel --- .../de/igslandstuhl/database/api/SpecialTask.java | 2 +- src/main/java/de/igslandstuhl/database/api/Task.java | 12 ++++++------ .../database/api/{Level.java => TaskLevel.java} | 4 ++-- .../java/de/igslandstuhl/database/api/Topic.java | 10 +++++----- .../database/server/commands/Command.java | 4 ++-- .../de/igslandstuhl/database/api/PreConditions.java | 2 +- .../java/de/igslandstuhl/database/api/TaskTest.java | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) rename src/main/java/de/igslandstuhl/database/api/{Level.java => TaskLevel.java} (96%) diff --git a/src/main/java/de/igslandstuhl/database/api/SpecialTask.java b/src/main/java/de/igslandstuhl/database/api/SpecialTask.java index 16a6450..77ee74a 100644 --- a/src/main/java/de/igslandstuhl/database/api/SpecialTask.java +++ b/src/main/java/de/igslandstuhl/database/api/SpecialTask.java @@ -30,7 +30,7 @@ public class SpecialTask extends Task { * @param name the name of the special task */ public SpecialTask(int id, String name, double ratio, Subject subject) { - super(id, null, name, Level.SPECIAL); + super(id, null, name, TaskLevel.SPECIAL); this.ratio = ratio; this.subject = subject; } diff --git a/src/main/java/de/igslandstuhl/database/api/Task.java b/src/main/java/de/igslandstuhl/database/api/Task.java index d25c54d..7937a54 100644 --- a/src/main/java/de/igslandstuhl/database/api/Task.java +++ b/src/main/java/de/igslandstuhl/database/api/Task.java @@ -51,7 +51,7 @@ public class Task { * This indicates how challenging the task is, such as LEVEL1, LEVEL2, or LEVEL3. * It is also used to calculate the task's ratio in relation to the topic. */ - private final Level niveau; + private final TaskLevel niveau; /** * Constructs a new Task. @@ -61,7 +61,7 @@ public class Task { * @param name the name of the task * @param niveau the level of difficulty for the task */ - protected Task(int id, Topic topic, String name, Level niveau) { + protected Task(int id, Topic topic, String name, TaskLevel niveau) { this.id = id; this.topic = topic; this.name = name; @@ -101,7 +101,7 @@ public String getName() { * * @return the level of difficulty for the task */ - public Level getNiveau() { + public TaskLevel getNiveau() { return niveau; } /** @@ -157,7 +157,7 @@ private static Task fromSQLFields(String[] fields) { int id = Integer.parseInt(fields[0]); Topic topic = Topic.get(Integer.parseInt(fields[1])); String name = fields[2]; - Level niveau = Level.get(Integer.parseInt(fields[3])); + TaskLevel niveau = TaskLevel.get(Integer.parseInt(fields[3])); return new Task(id, topic, name, niveau); } /** @@ -229,7 +229,7 @@ public String toString() { * @throws SQLException if there is an error accessing the database * @return the newly created Task object, or null if the task could not be added */ - public static Task addTask(Topic topic, String name, Level niveau) throws SQLException { + public static Task addTask(Topic topic, String name, TaskLevel niveau) throws SQLException { Server.getInstance().getConnection().executeVoidProcessSecure(SQLHelper.getAddObjectProcess("task", topic == null ? "-1" : String.valueOf(topic.getId()), name, String.valueOf(niveau))); return getByName(name).stream() //.filter(t -> t.getTopic().equals(topic) && t.getNiveau() == niveau) @@ -277,7 +277,7 @@ public boolean equals(Object obj) { public static Task fromSerialized(Topic topic, String serialized) throws SQLException { String[] parts = serialized.split(Application.TASK_TITLE_DELIMITER); String name = parts[0]; - Level level = Level.get(Integer.parseInt(parts[1])); + TaskLevel level = TaskLevel.get(Integer.parseInt(parts[1])); return addTask(topic, name, level); } diff --git a/src/main/java/de/igslandstuhl/database/api/Level.java b/src/main/java/de/igslandstuhl/database/api/TaskLevel.java similarity index 96% rename from src/main/java/de/igslandstuhl/database/api/Level.java rename to src/main/java/de/igslandstuhl/database/api/TaskLevel.java index 9a118ec..ae40c2d 100644 --- a/src/main/java/de/igslandstuhl/database/api/Level.java +++ b/src/main/java/de/igslandstuhl/database/api/TaskLevel.java @@ -5,7 +5,7 @@ * Each level has a specific ratio that indicates the proportion of the progress * that can be achieved at that level. */ -public enum Level { +public enum TaskLevel { LEVEL1, LEVEL2, LEVEL3, SPECIAL; /** @@ -15,7 +15,7 @@ public enum Level { * @throws IllegalArgumentException if the number is out of range * (not between 1 and 3 inclusive) */ - public static Level get(int number) { + public static TaskLevel get(int number) { switch (number) { case 1: return LEVEL1; diff --git a/src/main/java/de/igslandstuhl/database/api/Topic.java b/src/main/java/de/igslandstuhl/database/api/Topic.java index 19dff6e..d980966 100644 --- a/src/main/java/de/igslandstuhl/database/api/Topic.java +++ b/src/main/java/de/igslandstuhl/database/api/Topic.java @@ -223,7 +223,7 @@ public List getTasksLevel3() { * @param level the difficulty level of the tasks to retrieve * @return a list of tasks at the specified level associated with the topic */ - public List getTasksByLevel(Level level) { + public List getTasksByLevel(TaskLevel level) { if (tasks.isEmpty()) { loadTasks(); } @@ -246,7 +246,7 @@ public List getTasksByLevel(Level level) { * @param level the difficulty level to filter by * @return a list of tasks that match the specified level */ - private List getTasksByLevel(List tasks, Level level) { + private List getTasksByLevel(List tasks, TaskLevel level) { return tasks.stream() .filter(task -> task.getNiveau() == level) .toList(); @@ -267,9 +267,9 @@ private void loadTasks() { "get_tasks_by_topic", new String[] {"id"}, String.valueOf(id) ); taskIds.stream().map(Task::get).filter(Objects::nonNull).forEach(t -> tasks.add(t)); - tasksLevel1 = getTasksByLevel(tasks, Level.LEVEL1); - tasksLevel2 = getTasksByLevel(tasks, Level.LEVEL2); - tasksLevel3 = getTasksByLevel(tasks, Level.LEVEL3); + tasksLevel1 = getTasksByLevel(tasks, TaskLevel.LEVEL1); + tasksLevel2 = getTasksByLevel(tasks, TaskLevel.LEVEL2); + tasksLevel3 = getTasksByLevel(tasks, TaskLevel.LEVEL3); } catch (SQLException e) { e.printStackTrace(); } diff --git a/src/main/java/de/igslandstuhl/database/server/commands/Command.java b/src/main/java/de/igslandstuhl/database/server/commands/Command.java index f66f136..9771e15 100644 --- a/src/main/java/de/igslandstuhl/database/server/commands/Command.java +++ b/src/main/java/de/igslandstuhl/database/server/commands/Command.java @@ -60,9 +60,9 @@ public static void registerCommands() { }); registerCommand("get-level-ratio", (args) -> { if (args.length < 1) return "Usage: get-level-ratio [level]"; - Level level; + TaskLevel level; try { - level = Level.get(Integer.parseInt(args[0])); + level = TaskLevel.get(Integer.parseInt(args[0])); } catch (NumberFormatException e) { return "This is no valid number."; } catch (IllegalArgumentException e) { diff --git a/src/test/java/de/igslandstuhl/database/api/PreConditions.java b/src/test/java/de/igslandstuhl/database/api/PreConditions.java index 542725a..88dd5e4 100644 --- a/src/test/java/de/igslandstuhl/database/api/PreConditions.java +++ b/src/test/java/de/igslandstuhl/database/api/PreConditions.java @@ -19,7 +19,7 @@ public static void addSampleTopic() throws SQLException { Topic.addTopic("Bruchrechnung", Subject.get(1), 100, 5, 1); } public static void addSampleTask() throws SQLException { - Task.addTask(Topic.get(1), "Addition", Level.LEVEL1); + Task.addTask(Topic.get(1), "Addition", TaskLevel.LEVEL1); } public static void addSampleSpecialTask() throws SQLException { Subject subject = Subject.get(1); diff --git a/src/test/java/de/igslandstuhl/database/api/TaskTest.java b/src/test/java/de/igslandstuhl/database/api/TaskTest.java index 4038b00..a31ca97 100644 --- a/src/test/java/de/igslandstuhl/database/api/TaskTest.java +++ b/src/test/java/de/igslandstuhl/database/api/TaskTest.java @@ -16,7 +16,7 @@ public static void setupServer() throws SQLException { } @Test public void addTask() throws SQLException { - Task added = Task.addTask(Topic.get(1), "Addition", Level.LEVEL1); + Task added = Task.addTask(Topic.get(1), "Addition", TaskLevel.LEVEL1); Task task = Task.get(1); assertNotNull(task); assertEquals(added, task); From 6beb3415f13967392467df21e5afd3e6014ef2d2 Mon Sep 17 00:00:00 2001 From: Lukas Morgenstern Date: Mon, 11 Aug 2025 14:08:41 +0200 Subject: [PATCH 2/3] Added graduation level enum --- .../database/api/GraduationLevel.java | 49 +++++++++++++++++++ .../de/igslandstuhl/database/api/Student.java | 27 +++++----- .../database/api/PreConditions.java | 2 +- .../database/api/StudentTest.java | 2 +- .../database/server/ServerTest.java | 3 +- 5 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 src/main/java/de/igslandstuhl/database/api/GraduationLevel.java diff --git a/src/main/java/de/igslandstuhl/database/api/GraduationLevel.java b/src/main/java/de/igslandstuhl/database/api/GraduationLevel.java new file mode 100644 index 0000000..d643db6 --- /dev/null +++ b/src/main/java/de/igslandstuhl/database/api/GraduationLevel.java @@ -0,0 +1,49 @@ +package de.igslandstuhl.database.api; + +public enum GraduationLevel { + LEVEL0 (0, "Neustarter"), + LEVEL1 (1, "Starter"), + LEVEL2 (2, "Durchstarter"), + LEVEL3 (3, "Lernprofi"); + + private final int level; + private final String germanTranslation; + + + private GraduationLevel(int level, String germanTranslation) { + this.level = level; + this.germanTranslation = germanTranslation; + } + + public int getLevel() { + return level; + } + + public String getGermanTranslation() { + return germanTranslation; + } + + @Override + public String toString() { + return germanTranslation; + } + + public static GraduationLevel of(int level) { + switch (level) { + case 0: + return LEVEL0; + case 1: + return LEVEL1; + case 2: + return LEVEL2; + case 3: + return LEVEL3; + default: + throw new IllegalArgumentException("No such graduation level: " + level); + } + } + + public static GraduationLevel initialValue() { + return LEVEL1; + } +} diff --git a/src/main/java/de/igslandstuhl/database/api/Student.java b/src/main/java/de/igslandstuhl/database/api/Student.java index a56eb42..2056f38 100644 --- a/src/main/java/de/igslandstuhl/database/api/Student.java +++ b/src/main/java/de/igslandstuhl/database/api/Student.java @@ -59,7 +59,7 @@ public class Student extends User { /** * The graduation level of the student. */ - private final int graduationLevel; + private final GraduationLevel graduationLevel; /** * The set of tasks currently selected by the student. @@ -103,7 +103,7 @@ public class Student extends User { * @param graduationLevel The graduation level. */ private Student(int id, String firstName, String lastName, String email, String passwordHash, SchoolClass schoolClass, - int graduationLevel) { + GraduationLevel graduationLevel) { this.id = id; this.firstName = firstName; this.lastName = lastName; @@ -126,7 +126,7 @@ private static Student fromSQL(String[] fields) { String email = fields[3]; String password = fields[4]; SchoolClass schoolClass = SchoolClass.get(Integer.parseInt(fields[5])); - int graduationLevel = Integer.parseInt(fields[6]); + GraduationLevel graduationLevel = GraduationLevel.of(Integer.parseInt(fields[6])); Student student = new Student(id, firstName, lastName, email, password, schoolClass, graduationLevel); student.loadCurrentTopics(); return student; @@ -216,9 +216,9 @@ public static List getAll() { * @return the created Student object * @throws SQLException if there is an error creating the student */ - public static Student registerStudentWithPassword(int id, String firstName, String lastName, String email, String password, SchoolClass schoolClass, int graduationLevel) throws SQLException { + public static Student registerStudentWithPassword(int id, String firstName, String lastName, String email, String password, SchoolClass schoolClass, GraduationLevel graduationLevel) throws SQLException { Student student = new Student(id, firstName, lastName, email, User.passHash(password), schoolClass, graduationLevel); - Server.getInstance().getConnection().executeVoidProcessSecure(SQLHelper.getAddObjectProcess("student", String.valueOf(id), firstName, lastName, email, User.passHash(password), schoolClass != null ? String.valueOf(schoolClass.getId()) : "-1", String.valueOf(graduationLevel))); + Server.getInstance().getConnection().executeVoidProcessSecure(SQLHelper.getAddObjectProcess("student", String.valueOf(id), firstName, lastName, email, User.passHash(password), schoolClass != null ? String.valueOf(schoolClass.getId()) : "-1", String.valueOf(graduationLevel.getLevel()))); students.put(id, student); return student; } @@ -236,12 +236,12 @@ public static String[] generatePasswords(int count, int length) { } return passwords; } - public static StudentGenerationResult generateStudentWithPassword(int id, String firstName, String lastName, String email, SchoolClass schoolClass, int graduationLevel) throws SQLException { + public static StudentGenerationResult generateStudentWithPassword(int id, String firstName, String lastName, String email, SchoolClass schoolClass, GraduationLevel graduationLevel) throws SQLException { String password = generateRandomPassword(12, id + (int) System.currentTimeMillis()); Student student = registerStudentWithPassword(id, firstName, lastName, email, password, schoolClass, graduationLevel); return new StudentGenerationResult(student, password); } - public static StudentGenerationResult[] generateStudentsWithPasswords(int[] ids, String[] firstNames, String[] lastNames, String[] emails, String[] schoolClassNames, int[] graduationLevels) throws SQLException { + public static StudentGenerationResult[] generateStudentsWithPasswords(int[] ids, String[] firstNames, String[] lastNames, String[] emails, String[] schoolClassNames, GraduationLevel[] graduationLevels) throws SQLException { if (ids.length != firstNames.length || ids.length != lastNames.length || ids.length != emails.length || ids.length != schoolClassNames.length || ids.length != graduationLevels.length) { throw new IllegalArgumentException("All input arrays must have the same length"); } @@ -259,7 +259,7 @@ public static StudentGenerationResult[] generateStudentsFromCSV(String csv) thro List lastNames = new ArrayList<>(); List emails = new ArrayList<>(); List schoolClassNames = new ArrayList<>(); - List graduationLevels = new ArrayList<>(); + List graduationLevels = new ArrayList<>(); for (int i = 0; i < lines.length; i++) { String[] fields = lines[i].split(","); if (fields.length != 6) { @@ -270,7 +270,7 @@ public static StudentGenerationResult[] generateStudentsFromCSV(String csv) thro String lastName = fields[2].trim(); String email = fields[5].trim(); String schoolClassName = fields[3].trim(); - int graduationLevel = 1; + GraduationLevel graduationLevel = GraduationLevel.initialValue(); ids.add(id); firstNames.add(firstName); lastNames.add(lastName); @@ -283,11 +283,12 @@ public static StudentGenerationResult[] generateStudentsFromCSV(String csv) thro String[] lastNameArray = new String[lastNames.size()]; String[] emailArray = new String[emails.size()]; String[] schoolClassNameArray = new String[schoolClassNames.size()]; - int[] graduationLevelArray = graduationLevels.stream().mapToInt(Integer::intValue).toArray(); + GraduationLevel[] graduationLevelArray = new GraduationLevel[graduationLevels.size()]; firstNames.toArray(firstNameArray); lastNames.toArray(lastNameArray); emails.toArray(emailArray); schoolClassNames.toArray(schoolClassNameArray); + graduationLevels.toArray(graduationLevelArray); return generateStudentsWithPasswords(idArray, firstNameArray, lastNameArray, emailArray, schoolClassNameArray, graduationLevelArray); } @@ -324,7 +325,7 @@ public String getUsername() { * Returns the student's graduation level. * @return the graduation level */ - public int getGraduationLevel() { return graduationLevel; } + public GraduationLevel getGraduationLevel() { return graduationLevel; } /** * Returns the student's current room. @@ -486,7 +487,7 @@ public String toJSON() { .append("\"lastName\": \"").append(lastName).append("\",\n") .append("\"email\": \"").append(email).append("\",\n") .append("\"schoolClass\": ").append(String.valueOf(schoolClass)).append(",\n") - .append("\"graduationLevel\": ").append(graduationLevel).append(",\n") + .append("\"graduationLevel\": ").append(graduationLevel.getLevel()).append(",\n") .append("\"selectedTasks\": ").append(selectedTasks).append(",\n") .append("\"completedTasks\": ").append(completedTasks).append(",\n") .append("\"lockedTasks\": ").append(lockedTasks).append(",\n") @@ -700,7 +701,7 @@ public int hashCode() { result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); result = prime * result + ((email == null) ? 0 : email.hashCode()); result = prime * result + ((schoolClass == null) ? 0 : schoolClass.hashCode()); - result = prime * result + graduationLevel; + result = prime * result + graduationLevel.getLevel(); return result; } diff --git a/src/test/java/de/igslandstuhl/database/api/PreConditions.java b/src/test/java/de/igslandstuhl/database/api/PreConditions.java index 88dd5e4..d69773a 100644 --- a/src/test/java/de/igslandstuhl/database/api/PreConditions.java +++ b/src/test/java/de/igslandstuhl/database/api/PreConditions.java @@ -10,7 +10,7 @@ public static void setupDatabase() throws SQLException { server.getConnection().createTables(); } public static void addSampleStudent() throws SQLException { - Student.registerStudentWithPassword(0, "Max", "Mustermann", "max@muster.mann", "12345", SchoolClass.get(1), 1); + Student.registerStudentWithPassword(0, "Max", "Mustermann", "max@muster.mann", "12345", SchoolClass.get(1), GraduationLevel.LEVEL1); } public static void addSampleSubject() throws SQLException { Subject.addSubject("Mathematik"); diff --git a/src/test/java/de/igslandstuhl/database/api/StudentTest.java b/src/test/java/de/igslandstuhl/database/api/StudentTest.java index 754a982..0442bb6 100644 --- a/src/test/java/de/igslandstuhl/database/api/StudentTest.java +++ b/src/test/java/de/igslandstuhl/database/api/StudentTest.java @@ -15,7 +15,7 @@ public static void setupServer() throws SQLException { } @Test public void testPuttingStudent() throws SQLException { - Student added = Student.registerStudentWithPassword(0, "Max", "Mustermann", "max@muster.mann", "12345", SchoolClass.get(1), 1); + Student added = Student.registerStudentWithPassword(0, "Max", "Mustermann", "max@muster.mann", "12345", SchoolClass.get(1), GraduationLevel.LEVEL1); Student student = Student.get(0); assertEquals(added, student); } diff --git a/src/test/java/de/igslandstuhl/database/server/ServerTest.java b/src/test/java/de/igslandstuhl/database/server/ServerTest.java index 3116fdf..381a938 100644 --- a/src/test/java/de/igslandstuhl/database/server/ServerTest.java +++ b/src/test/java/de/igslandstuhl/database/server/ServerTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import de.igslandstuhl.database.api.GraduationLevel; import de.igslandstuhl.database.api.SchoolClass; import de.igslandstuhl.database.api.Student; @@ -43,7 +44,7 @@ public void testCreateTables() throws SQLException { public void testValidUser() throws SQLException { server.getConnection().createTables(); // Ensure tables are created before testing user validation SchoolClass.addClass("5a", 5); - Student.registerStudentWithPassword(0, "Max", "Mustermann", "max@muster.mann", "12345", SchoolClass.get(1), 1); + Student.registerStudentWithPassword(0, "Max", "Mustermann", "max@muster.mann", "12345", SchoolClass.get(1), GraduationLevel.LEVEL1); assertFalse(server.isValidUser("anamethatnostudentwillevergetbecauseitistoolongtoputintotheloginfield", "password")); assertFalse(server.isValidUser("max@muster.mann", "123456")); // Test student set up by StudentTest assertTrue(server.isValidUser("max@muster.mann", "12345")); From ed815f74fee05655a1d5432d31c96d5d055d67f7 Mon Sep 17 00:00:00 2001 From: Lukas Morgenstern Date: Mon, 11 Aug 2025 14:29:34 +0200 Subject: [PATCH 3/3] Added translation to TaskLevel --- .../igslandstuhl/database/api/TaskLevel.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/igslandstuhl/database/api/TaskLevel.java b/src/main/java/de/igslandstuhl/database/api/TaskLevel.java index ae40c2d..e26afe4 100644 --- a/src/main/java/de/igslandstuhl/database/api/TaskLevel.java +++ b/src/main/java/de/igslandstuhl/database/api/TaskLevel.java @@ -6,7 +6,25 @@ * that can be achieved at that level. */ public enum TaskLevel { - LEVEL1, LEVEL2, LEVEL3, SPECIAL; + LEVEL1 (1, "Niveau 1"), + LEVEL2 (2, "Niveau 2"), + LEVEL3 (3, "Niveau 3"), + SPECIAL (-1, "Nanstein-Aufgabe"); + + private final int number; + private final String germanTranslation; + + private TaskLevel(int number, String germanTranslation) { + this.number = number; + this.germanTranslation = germanTranslation; + } + + public int getNumber() { + return number; + } + public String getGermanTranslation() { + return germanTranslation; + } /** * Returns the Level corresponding to the given number. @@ -53,17 +71,6 @@ public double getRatio() { */ @Override public String toString() { - switch (this) { - case LEVEL1: - return "1"; - case LEVEL2: - return "2"; - case LEVEL3: - return "3"; - case SPECIAL: - return "Special"; - default: - throw new IllegalStateException(); - } + return this == SPECIAL ? "Special" : String.valueOf(number); } }