Switched to mysql implementation and added persistence for students.

This commit is contained in:
Andrew Lalis 2019-04-19 16:17:09 +02:00 committed by andrewlalis
parent df92a2c2d5
commit d9d9a51707
12 changed files with 166 additions and 60 deletions

View File

@ -1,34 +0,0 @@
package nl.andrewlalis.teaching_assistant_assistant.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
/**
* Configures the data source for this application.
*/
@Configuration
public class DataSourceConfig {
private static final String USERNAME = "root";
private static final String PASSWORD = "root";
private static final String DB_HOST = "localhost";
private static final String DB_NAME = "teaching_assistant_assistant";
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
@Primary
public DataSource getDataSource() {
return DataSourceBuilder
.create()
.url("jdbc:h2:~/" + DB_NAME)
.username(USERNAME)
.password(PASSWORD)
.build();
}
}

View File

@ -3,7 +3,8 @@ package nl.andrewlalis.teaching_assistant_assistant.controllers.courses;
import nl.andrewlalis.teaching_assistant_assistant.model.Course; import nl.andrewlalis.teaching_assistant_assistant.model.Course;
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam;
import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.CourseRepository;
import nl.andrewlalis.teaching_assistant_assistant.model.repositories.TeamRepository; import nl.andrewlalis.teaching_assistant_assistant.model.repositories.StudentRepository;
import nl.andrewlalis.teaching_assistant_assistant.model.repositories.StudentTeamRepository;
import nl.andrewlalis.teaching_assistant_assistant.util.team_importing.StudentTeamImporter; import nl.andrewlalis.teaching_assistant_assistant.util.team_importing.StudentTeamImporter;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
@ -25,11 +26,14 @@ public class ImportStudents {
private CourseRepository courseRepository; private CourseRepository courseRepository;
private TeamRepository teamRepository; private StudentTeamRepository studentTeamRepository;
protected ImportStudents(CourseRepository courseRepository, TeamRepository teamRepository) { private StudentRepository studentRepository;
protected ImportStudents(CourseRepository courseRepository, StudentTeamRepository studentTeamRepository, StudentRepository studentRepository) {
this.courseRepository = courseRepository; this.courseRepository = courseRepository;
this.teamRepository = teamRepository; this.studentTeamRepository = studentTeamRepository;
this.studentRepository = studentRepository;
} }
@GetMapping("/courses/{code}/import_students") @GetMapping("/courses/{code}/import_students")
@ -50,8 +54,33 @@ public class ImportStudents {
return "redirect:/courses"; return "redirect:/courses";
} }
Course course = optionalCourse.get();
try { try {
List<StudentTeam> studentTeams = StudentTeamImporter.importFromCSV(file.getInputStream(), optionalCourse.get()); List<StudentTeam> studentTeams = StudentTeamImporter.importFromCSV(file.getInputStream(), optionalCourse.get());
// Save all the new students first, then save all the teams they belong to.
for (StudentTeam team : studentTeams) {
team.getMembers().forEach(student -> student.assignToCourse(course));
this.studentRepository.saveAll(team.getStudents());
team.setCourse(course);
}
studentTeams.forEach(team -> {
team.getMembers().forEach(student -> {
student.assignToCourse(course);
course.addParticipant(student);
});
team.setCourse(course);
course.addStudentTeam(team);
//this.studentRepository.saveAll((team.getMembers()));
});
//this.studentTeamRepository.saveAll(studentTeams);
this.courseRepository.save(course);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -1,6 +1,8 @@
package nl.andrewlalis.teaching_assistant_assistant.model; package nl.andrewlalis.teaching_assistant_assistant.model;
import nl.andrewlalis.teaching_assistant_assistant.model.assignments.Assignment; import nl.andrewlalis.teaching_assistant_assistant.model.assignments.Assignment;
import nl.andrewlalis.teaching_assistant_assistant.model.people.Person;
import nl.andrewlalis.teaching_assistant_assistant.model.people.Student;
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam;
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.TeachingAssistantTeam; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.TeachingAssistantTeam;
@ -57,6 +59,19 @@ public class Course extends BasicEntity {
) )
private List<TeachingAssistantTeam> teachingAssistantTeams; private List<TeachingAssistantTeam> teachingAssistantTeams;
/**
* The list of all participants in this course, both teaching assistants and students.
*/
@ManyToMany(
cascade = CascadeType.ALL
)
@JoinTable(
name = "course_participants",
joinColumns = @JoinColumn(name = "course_id"),
inverseJoinColumns = @JoinColumn(name = "person_id")
)
private List<Person> participants;
/** /**
* Default constructor for JPA. * Default constructor for JPA.
*/ */
@ -64,6 +79,7 @@ public class Course extends BasicEntity {
this.assignments = new ArrayList<>(); this.assignments = new ArrayList<>();
this.studentTeams = new ArrayList<>(); this.studentTeams = new ArrayList<>();
this.teachingAssistantTeams = new ArrayList<>(); this.teachingAssistantTeams = new ArrayList<>();
this.participants = new ArrayList<>();
} }
/** /**
@ -85,6 +101,12 @@ public class Course extends BasicEntity {
this.teachingAssistantTeams.add(team); this.teachingAssistantTeams.add(team);
} }
public void addParticipant(Person person) {
if (!this.participants.contains(person)) {
this.participants.add(person);
}
}
/* /*
Getters and Setters Getters and Setters
*/ */
@ -109,6 +131,16 @@ public class Course extends BasicEntity {
return teachingAssistantTeams; return teachingAssistantTeams;
} }
public List<Student> getStudents() {
List<Student> students = new ArrayList<>();
this.participants.forEach(participant -> {
if (participant instanceof Student) {
students.add((Student) participant);
}
});
return students;
}
@Override @Override
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder(this.getName()).append('\n'); StringBuilder sb = new StringBuilder(this.getName()).append('\n');

View File

@ -1,6 +1,7 @@
package nl.andrewlalis.teaching_assistant_assistant.model.people; package nl.andrewlalis.teaching_assistant_assistant.model.people;
import nl.andrewlalis.teaching_assistant_assistant.model.BasicEntity; import nl.andrewlalis.teaching_assistant_assistant.model.BasicEntity;
import nl.andrewlalis.teaching_assistant_assistant.model.Course;
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.Team; import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.Team;
import javax.persistence.*; import javax.persistence.*;
@ -41,11 +42,21 @@ public abstract class Person extends BasicEntity {
) )
private List<Team> teams; private List<Team> teams;
/**
* The list of courses that this person belongs to.
*/
@ManyToMany(
fetch = FetchType.LAZY,
mappedBy = "participants"
)
private List<Course> courses;
/** /**
* Default constructor for JPA. * Default constructor for JPA.
*/ */
protected Person () { protected Person () {
this.teams = new ArrayList<>(); this.teams = new ArrayList<>();
this.courses = new ArrayList<>();
} }
/** /**
@ -64,7 +75,15 @@ public abstract class Person extends BasicEntity {
} }
public void assignToTeam(Team team) { public void assignToTeam(Team team) {
this.teams.add(team); if (!this.teams.contains(team)) {
this.teams.add(team);
}
}
public void assignToCourse(Course course) {
if (!this.courses.contains(course)) {
this.courses.add(course);
}
} }
/* /*
@ -91,6 +110,10 @@ public abstract class Person extends BasicEntity {
return this.githubUsername; return this.githubUsername;
} }
public List<Course> getCourses() {
return this.courses;
}
/** /**
* Determines if two Persons are equal. They are considered equal when all of the basic identifying information * Determines if two Persons are equal. They are considered equal when all of the basic identifying information
* about the person is the same, regardless of case. * about the person is the same, regardless of case.

View File

@ -1,18 +1,20 @@
package nl.andrewlalis.teaching_assistant_assistant.model.people.teams; package nl.andrewlalis.teaching_assistant_assistant.model.people.teams;
import nl.andrewlalis.teaching_assistant_assistant.model.assignments.grades.AssignmentGrade; import nl.andrewlalis.teaching_assistant_assistant.model.assignments.grades.AssignmentGrade;
import nl.andrewlalis.teaching_assistant_assistant.model.people.Person;
import nl.andrewlalis.teaching_assistant_assistant.model.people.Student; import nl.andrewlalis.teaching_assistant_assistant.model.people.Student;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.FetchType; import javax.persistence.FetchType;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* A group of students. * A group of students.
*/ */
@Entity @Entity
public class StudentTeam extends Team<Student> { public class StudentTeam extends Team {
/** /**
* The list of assignment grades which this student group has received. * The list of assignment grades which this student group has received.
@ -27,8 +29,13 @@ public class StudentTeam extends Team<Student> {
*/ */
public StudentTeam() {} public StudentTeam() {}
@Override public List<Student> getStudents() {
public void addMember(Student person) { List<Person> people = super.getMembers();
this.getMembers().add(person); List<Student> students = new ArrayList<>();
people.forEach(person -> {
students.add((Student) person);
});
return students;
} }
} }

View File

@ -1,6 +1,7 @@
package nl.andrewlalis.teaching_assistant_assistant.model.people.teams; package nl.andrewlalis.teaching_assistant_assistant.model.people.teams;
import nl.andrewlalis.teaching_assistant_assistant.model.assignments.grades.SectionGrade; import nl.andrewlalis.teaching_assistant_assistant.model.assignments.grades.SectionGrade;
import nl.andrewlalis.teaching_assistant_assistant.model.people.Person;
import nl.andrewlalis.teaching_assistant_assistant.model.people.TeachingAssistant; import nl.andrewlalis.teaching_assistant_assistant.model.people.TeachingAssistant;
import nl.andrewlalis.teaching_assistant_assistant.model.people.TeachingAssistantRole; import nl.andrewlalis.teaching_assistant_assistant.model.people.TeachingAssistantRole;
@ -8,13 +9,14 @@ import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* A group of teaching assistants. * A group of teaching assistants.
*/ */
@Entity @Entity
public class TeachingAssistantTeam extends Team<TeachingAssistant> { public class TeachingAssistantTeam extends Team {
/** /**
* The role that this teaching assistant team plays. * The role that this teaching assistant team plays.
@ -33,8 +35,10 @@ public class TeachingAssistantTeam extends Team<TeachingAssistant> {
*/ */
public TeachingAssistantTeam() {} public TeachingAssistantTeam() {}
@Override public List<TeachingAssistant> getTeachingAssistants() {
public void addMember(TeachingAssistant person) { List<Person> people = super.getMembers();
this.getMembers().add(person); List<TeachingAssistant> teachingAssistants = new ArrayList<>(people.size());
people.forEach(person -> teachingAssistants.add((TeachingAssistant) person));
return teachingAssistants;
} }
} }

View File

@ -17,7 +17,7 @@ import java.util.List;
@Inheritance( @Inheritance(
strategy = InheritanceType.JOINED strategy = InheritanceType.JOINED
) )
public abstract class Team<P extends Person> extends BasicEntity { public abstract class Team extends BasicEntity {
/** /**
* The list of members in this group. * The list of members in this group.
@ -30,7 +30,7 @@ public abstract class Team<P extends Person> extends BasicEntity {
joinColumns = @JoinColumn(name = "team_id"), joinColumns = @JoinColumn(name = "team_id"),
inverseJoinColumns = @JoinColumn(name = "person_id") inverseJoinColumns = @JoinColumn(name = "person_id")
) )
protected List<P> members; protected List<Person> members;
/** /**
* The course that this team belongs to. A team cannot exist on its own, it must belong to a course. * The course that this team belongs to. A team cannot exist on its own, it must belong to a course.
@ -47,23 +47,23 @@ public abstract class Team<P extends Person> extends BasicEntity {
this.members = new ArrayList<>(); this.members = new ArrayList<>();
} }
public void addMember(P person) { public void addMember(Person person) {
if (!this.containsMember(person)) { if (!this.containsMember(person)) {
this.members.add(person); this.members.add(person);
} }
} }
public void addMembers(List<P> people) { public void addMembers(List<Person> people) {
for (P person : people) { for (Person person : people) {
this.addMember(person); this.addMember(person);
} }
} }
public boolean containsMember(P person) { public boolean containsMember(Person person) {
return this.members.contains(person); return this.members.contains(person);
} }
public void removeMember(P person) { public void removeMember(Person person) {
this.members.remove(person); this.members.remove(person);
} }
@ -79,7 +79,7 @@ public abstract class Team<P extends Person> extends BasicEntity {
* Gets a list of all members of this team. * Gets a list of all members of this team.
* @return A list of all the members in this team. * @return A list of all the members in this team.
*/ */
public List<P> getMembers() { public List<Person> getMembers() {
return this.members; return this.members;
} }
@ -90,7 +90,7 @@ public abstract class Team<P extends Person> extends BasicEntity {
@Override @Override
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (P p : this.getMembers()) { for (Person p : this.getMembers()) {
sb.append(p.getFullName()).append(", "); sb.append(p.getFullName()).append(", ");
} }
return sb.toString(); return sb.toString();

View File

@ -0,0 +1,17 @@
package nl.andrewlalis.teaching_assistant_assistant.model.repositories;
import nl.andrewlalis.teaching_assistant_assistant.model.people.Student;
import org.springframework.data.repository.CrudRepository;
import java.util.Optional;
public interface StudentRepository extends CrudRepository<Student, Long> {
/**
* Tries to find a student by its unique student number.
* @param studentNumber The student number to search for.
* @return An optional Student object.
*/
public Optional<Student> findByStudentNumber(int studentNumber);
}

View File

@ -0,0 +1,7 @@
package nl.andrewlalis.teaching_assistant_assistant.model.repositories;
import nl.andrewlalis.teaching_assistant_assistant.model.people.teams.StudentTeam;
import org.springframework.data.repository.CrudRepository;
public interface StudentTeamRepository extends CrudRepository<StudentTeam, Long> {
}

View File

@ -1,7 +1,10 @@
spring.jpa.hibernate.ddl-auto=create spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.datasource.username=root
#spring.jpa.properties.hibernate.show_sql=true spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/teaching_assistant_assistant?serverTimezone=UTC
#
#spring.jpa.properties.hibernate.show_sql=false
#spring.jpa.properties.hibernate.use_sql_comments=true #spring.jpa.properties.hibernate.use_sql_comments=true
#spring.jpa.properties.hibernate.format_sql=true #spring.jpa.properties.hibernate.format_sql=true
#spring.jpa.properties.hibernate.type=trace #spring.jpa.properties.hibernate.type=trace

View File

@ -11,6 +11,7 @@
<th>Name</th> <th>Name</th>
<th>Code</th> <th>Code</th>
<th>Created at</th> <th>Created at</th>
<th>Students</th>
</tr> </tr>
<tr th:each="course: ${courses}"> <tr th:each="course: ${courses}">
<td> <td>
@ -18,6 +19,7 @@
</td> </td>
<td th:text="${course.getCode()}"></td> <td th:text="${course.getCode()}"></td>
<td th:text="${course.getCreatedOn()}"></td> <td th:text="${course.getCreatedOn()}"></td>
<td th:text="${course.getStudents().size()}"></td>
</tr> </tr>
</table> </table>
</div> </div>

View File

@ -41,6 +41,22 @@
</td> </td>
</tr> </tr>
</table> </table>
<h3>All Students (<span th:text="${course.getStudents().size()}"></span>):</h3>
<table>
<tr th:each="student: ${course.getStudents()}">
<td>
<a
th:href="@{/students/{student_id}
(student_id=${student.getId()})}">
Student <span th:text="${student.getId()}"></span>
</a>
</td>
<td th:text="${student.getFullName()}"></td>
<td th:text="${student.getStudentNumber()}"></td>
<td th:text="${student.getEmailAddress()}"></td>
</tr>
</table>
</div> </div>
<div id="sidebar"> <div id="sidebar">