Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions src/main/java/de/igslandstuhl/database/api/GraduationLevel.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
27 changes: 14 additions & 13 deletions src/main/java/de/igslandstuhl/database/api/Student.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -216,9 +216,9 @@ public static List<Student> 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;
}
Expand All @@ -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");
}
Expand All @@ -259,7 +259,7 @@ public static StudentGenerationResult[] generateStudentsFromCSV(String csv) thro
List<String> lastNames = new ArrayList<>();
List<String> emails = new ArrayList<>();
List<String> schoolClassNames = new ArrayList<>();
List<Integer> graduationLevels = new ArrayList<>();
List<GraduationLevel> graduationLevels = new ArrayList<>();
for (int i = 0; i < lines.length; i++) {
String[] fields = lines[i].split(",");
if (fields.length != 6) {
Expand All @@ -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);
Expand All @@ -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);
}

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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;
}

Expand Down
12 changes: 6 additions & 6 deletions src/main/java/de/igslandstuhl/database/api/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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;
Expand Down Expand Up @@ -101,7 +101,7 @@ public String getName() {
*
* @return the level of difficulty for the task
*/
public Level getNiveau() {
public TaskLevel getNiveau() {
return niveau;
}
/**
Expand Down Expand Up @@ -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);
}
/**
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,26 @@
* Each level has a specific ratio that indicates the proportion of the progress
* that can be achieved at that level.
*/
public enum Level {
LEVEL1, LEVEL2, LEVEL3, SPECIAL;
public enum TaskLevel {
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.
Expand All @@ -15,7 +33,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;
Expand Down Expand Up @@ -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);
}
}
10 changes: 5 additions & 5 deletions src/main/java/de/igslandstuhl/database/api/Topic.java
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ public List<Task> 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<Task> getTasksByLevel(Level level) {
public List<Task> getTasksByLevel(TaskLevel level) {
if (tasks.isEmpty()) {
loadTasks();
}
Expand All @@ -246,7 +246,7 @@ public List<Task> getTasksByLevel(Level level) {
* @param level the difficulty level to filter by
* @return a list of tasks that match the specified level
*/
private List<Task> getTasksByLevel(List<Task> tasks, Level level) {
private List<Task> getTasksByLevel(List<Task> tasks, TaskLevel level) {
return tasks.stream()
.filter(task -> task.getNiveau() == level)
.toList();
Expand All @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/de/igslandstuhl/database/api/PreConditions.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static void setupDatabase() throws SQLException {
server.getConnection().createTables();
}
public static void addSampleStudent() throws SQLException {
Student.registerStudentWithPassword(0, "Max", "Mustermann", "[email protected]", "12345", SchoolClass.get(1), 1);
Student.registerStudentWithPassword(0, "Max", "Mustermann", "[email protected]", "12345", SchoolClass.get(1), GraduationLevel.LEVEL1);
}
public static void addSampleSubject() throws SQLException {
Subject.addSubject("Mathematik");
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public static void setupServer() throws SQLException {
}
@Test
public void testPuttingStudent() throws SQLException {
Student added = Student.registerStudentWithPassword(0, "Max", "Mustermann", "[email protected]", "12345", SchoolClass.get(1), 1);
Student added = Student.registerStudentWithPassword(0, "Max", "Mustermann", "[email protected]", "12345", SchoolClass.get(1), GraduationLevel.LEVEL1);
Student student = Student.get(0);
assertEquals(added, student);
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/de/igslandstuhl/database/api/TaskTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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", "[email protected]", "12345", SchoolClass.get(1), 1);
Student.registerStudentWithPassword(0, "Max", "Mustermann", "[email protected]", "12345", SchoolClass.get(1), GraduationLevel.LEVEL1);
assertFalse(server.isValidUser("anamethatnostudentwillevergetbecauseitistoolongtoputintotheloginfield", "password"));
assertFalse(server.isValidUser("[email protected]", "123456")); // Test student set up by StudentTest
assertTrue(server.isValidUser("[email protected]", "12345"));
Expand Down
Loading